X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fcore%2FFunction.cxx;h=781940ce71ddef42c7243ed63096f5d3155da590;hp=539192c5fd6f2fb2cb90e914c39acf17749d1042;hb=9f53c415cf1554e2d9cc040d3d646ec22fe281f6;hpb=0daf9a157f3d41690cf4a0287db1adecc4ad0b71 diff --git a/src/core/Function.cxx b/src/core/Function.cxx index 539192c..781940c 100644 --- a/src/core/Function.cxx +++ b/src/core/Function.cxx @@ -1,8 +1,8 @@ #include "Function.hxx" +#include "BasicBlock.hxx" #include "core/events/RenameFunctionEvent.hxx" #include "InformationManager.hxx" - -#include +#include "gui/qt.hxx" Function::Function(uint64_t start_address, InformationManager* manager) : start_address(start_address) @@ -15,3 +15,41 @@ void Function::setName(const std::string& new_name) { manager->dispatch(&event); } +void Function::serialize(QXmlStreamWriter& stream) { + stream.writeStartElement("function"); + stream.writeAttribute("name", getName().c_str()); + stream.writeAttribute("entry", QString::number(getStartAddress(), 16)); + + for (auto& blockentry : blocks()) { + blockentry.second->serialize(stream); + } + + stream.writeEndElement(); // "function" +} + +Function* Function::deserialize(QXmlStreamReader& stream, InformationManager* manager) { + Q_ASSERT(stream.name() == "function"); + + QString name = stream.attributes().value("name").toString(); + uint64_t entry = stream.attributes().value("entry").toULongLong(NULL, 16); + Function* fun = manager->newFunction(entry); + + while (QXmlStreamReader::NoToken != stream.readNext()) { + while (QXmlStreamReader::Characters == stream.tokenType() && + stream.isWhitespace()) + stream.readNext(); + if (QXmlStreamReader::EndElement == stream.tokenType()) + break; + + if (stream.name() == "block") { + BasicBlock* block = BasicBlock::deserialize(stream, manager); + fun->addBasicBlock(block); + } else { + return NULL; + } + } + + manager->finishFunction(fun); + fun->setName(name.toStdString()); + return fun; +}