diff options
| author | Alexander Gavrilov | 2012-04-12 10:54:53 +0400 |
|---|---|---|
| committer | Alexander Gavrilov | 2012-04-12 10:54:53 +0400 |
| commit | 583ccdcc0c33c396849fae93ecf7fbf69e0ff7bf (patch) | |
| tree | f40d94318c8303566c160d68e8e2ba24e79a4124 /library/DataDefs.cpp | |
| parent | d874c3b5386b5efad30a4a23afbb6fff03aba25f (diff) | |
| download | dfhack-583ccdcc0c33c396849fae93ecf7fbf69e0ff7bf.tar.gz dfhack-583ccdcc0c33c396849fae93ecf7fbf69e0ff7bf.tar.bz2 dfhack-583ccdcc0c33c396849fae93ecf7fbf69e0ff7bf.tar.xz | |
Support pre-initializing vtable pointers from symbols.xml
Diffstat (limited to 'library/DataDefs.cpp')
| -rw-r--r-- | library/DataDefs.cpp | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/library/DataDefs.cpp b/library/DataDefs.cpp index cf8a32fc..76c87244 100644 --- a/library/DataDefs.cpp +++ b/library/DataDefs.cpp @@ -128,17 +128,6 @@ void compound_identity::Init(Core *core) // they are called in an undefined order. for (compound_identity *p = list; p; p = p->next) p->doInit(core); - - //FIXME: ... nuked. the group was empty... -/* - // Read pre-filled vtable ptrs - OffsetGroup *ptr_table = core->vinfo->getGroup("vtable"); - for (virtual_identity *p = list; p; p = p->next) { - void * tmp; - if (ptr_table->getSafeAddress(p->getName(),tmp)) - p->vtable_ptr = tmp; - } - */ } bitfield_identity::bitfield_identity(size_t size, @@ -223,17 +212,23 @@ virtual_identity::virtual_identity(size_t size, TAllocateFn alloc, { } +/* Vtable name to identity lookup. */ static std::map<std::string, virtual_identity*> name_lookup; +/* Vtable pointer to identity lookup. */ +std::map<void*, virtual_identity*> virtual_identity::known; + void virtual_identity::doInit(Core *core) { struct_identity::doInit(core); - name_lookup[getOriginalName()] = this; -} + auto vtname = getOriginalName(); + name_lookup[vtname] = this; -/* Vtable to identity lookup. */ -std::map<void*, virtual_identity*> virtual_identity::known; + vtable_ptr = core->vinfo->getVTable(vtname); + if (vtable_ptr) + known[vtable_ptr] = this; +} virtual_identity *virtual_identity::get(virtual_ptr instance_ptr) { @@ -265,8 +260,8 @@ virtual_identity *virtual_identity::get(virtual_ptr instance_ptr) << ", previous 0x" << unsigned(p->vtable_ptr) << std::dec << std::endl; abort(); } else if (!p->vtable_ptr) { - std::cerr << "class '" << p->getName() << "': vtable = 0x" - << std::hex << unsigned(vtable) << std::dec << std::endl; + std::cerr << "<vtable-address name='" << p->getOriginalName() << "' value='0x" + << std::hex << unsigned(vtable) << std::dec << "'/>" << std::endl; } known[vtable] = p; |
