summaryrefslogtreecommitdiff
path: root/library/DataDefs.cpp
diff options
context:
space:
mode:
authorAlexander Gavrilov2012-04-12 10:54:53 +0400
committerAlexander Gavrilov2012-04-12 10:54:53 +0400
commit583ccdcc0c33c396849fae93ecf7fbf69e0ff7bf (patch)
treef40d94318c8303566c160d68e8e2ba24e79a4124 /library/DataDefs.cpp
parentd874c3b5386b5efad30a4a23afbb6fff03aba25f (diff)
downloaddfhack-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.cpp29
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;