]>
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
, bool dynamic
, InformationManager
* manager
)
8 : start_address(start_address
)
13 void Function::setName(const std::string
& new_name
) {
15 RenameFunctionEvent
event(new_name
, start_address
);
16 manager
->dispatch(&event
);
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));
24 for (auto& blockentry
: blocks()) {
25 blockentry
.second
->serialize(stream
);
28 stream
.writeEndElement(); // "function"
31 Function
* Function::deserialize(QXmlStreamReader
& stream
, InformationManager
* manager
) {
32 Q_ASSERT(stream
.name() == "function");
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
);
38 while (QXmlStreamReader::NoToken
!= stream
.readNext()) {
39 while (QXmlStreamReader::Characters
== stream
.tokenType() &&
40 stream
.isWhitespace())
42 if (QXmlStreamReader::EndElement
== stream
.tokenType())
45 if (stream
.name() == "block") {
46 BasicBlock
* block
= BasicBlock::deserialize(stream
, manager
);
47 fun
->addBasicBlock(block
);
53 fun
->name
= name
.toStdString();
54 manager
->finishFunction(fun
);