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