]> git.siccegge.de Git - frida/frida.git/blob - src/core/Function.cxx
Restructure InformationManager
[frida/frida.git] / src / core / Function.cxx
1 #include "Function.hxx"
2 #include "BasicBlock.hxx"
3 #include "core/events/RenameFunctionEvent.hxx"
4 #include "InformationManager.hxx"
5 #include "gui/qt.hxx"
6
7 Function::Function(uint64_t start_address, bool dynamic, InformationManager* manager)
8 : start_address(start_address)
9 , dynamic(dynamic)
10 , manager(manager) {}
11
12
13 void Function::setName(const std::string& new_name) {
14 name = new_name;
15 RenameFunctionEvent event(new_name, start_address);
16 manager->dispatch(&event);
17 }
18
19 void Function::serialize(QXmlStreamWriter& stream) {
20 stream.writeStartElement("function");
21 stream.writeAttribute("name", getName().c_str());
22 stream.writeAttribute("entry", QString::number(getStartAddress(), 16));
23
24 for (auto& blockentry : blocks()) {
25 blockentry.second->serialize(stream);
26 }
27
28 stream.writeEndElement(); // "function"
29 }
30
31 Function* Function::deserialize(QXmlStreamReader& stream, InformationManager* manager) {
32 Q_ASSERT(stream.name() == "function");
33
34 QString name = stream.attributes().value("name").toString();
35 uint64_t entry = stream.attributes().value("entry").toULongLong(NULL, 16);
36 Function* fun = manager->newFunction(entry);
37
38 while (QXmlStreamReader::NoToken != stream.readNext()) {
39 while (QXmlStreamReader::Characters == stream.tokenType() &&
40 stream.isWhitespace())
41 stream.readNext();
42 if (QXmlStreamReader::EndElement == stream.tokenType())
43 break;
44
45 if (stream.name() == "block") {
46 BasicBlock* block = BasicBlock::deserialize(stream, manager);
47 fun->addBasicBlock(block);
48 } else {
49 return NULL;
50 }
51 }
52
53 fun->name = name.toStdString();
54 manager->finishFunction(fun);
55
56 return fun;
57 }