]>
git.siccegge.de Git - frida/frida.git/blob - src/core/Function.cxx
1 #include "Function.hxx"
2 #include "BasicBlock.hxx"
3 #include "core/events/RenameFunctionEvent.hxx"
4 #include "InformationManager.hxx"
7 Function::Function(uint64_t start_address
, InformationManager
* manager
)
8 : start_address(start_address
)
12 void Function::setName(const std::string
& new_name
) {
14 RenameFunctionEvent
event(new_name
, start_address
);
15 manager
->dispatch(&event
);
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));
23 for (auto& blockentry
: blocks()) {
24 blockentry
.second
->serialize(stream
);
27 stream
.writeEndElement(); // "function"
30 Function
* Function::deserialize(QXmlStreamReader
& stream
, InformationManager
* manager
) {
31 Q_ASSERT(stream
.name() == "function");
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
);
37 while (QXmlStreamReader::NoToken
!= stream
.readNext()) {
38 while (QXmlStreamReader::Characters
== stream
.tokenType() &&
39 stream
.isWhitespace())
41 if (QXmlStreamReader::EndElement
== stream
.tokenType())
44 if (stream
.name() == "block") {
45 BasicBlock
* block
= BasicBlock::deserialize(stream
, manager
);
46 fun
->addBasicBlock(block
);
52 fun
->name
= name
.toStdString();
53 manager
->finishFunction(fun
);