From b29d009b14f11e4f22d6d26b5af184639b1eab46 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Sat, 21 Mar 2020 13:21:35 -0500 Subject: [PATCH] update structures; implement struct_field_info_extra --- library/LuaTypes.cpp | 10 +++++----- library/include/DataDefs.h | 10 +++++++++- library/xml | 2 +- plugins/devel/check-structures-sanity/types.cpp | 2 +- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/library/LuaTypes.cpp b/library/LuaTypes.cpp index ad0f3e5e4..306538f51 100644 --- a/library/LuaTypes.cpp +++ b/library/LuaTypes.cpp @@ -508,8 +508,8 @@ static void read_field(lua_State *state, const struct_field_info *field, void *p return; case struct_field_info::CONTAINER: - if (!field->eid || !field->type->isContainer() || - field->eid == ((container_identity*)field->type)->getIndexEnumType()) + if (!field->extra || !field->extra->index_enum || !field->type->isContainer() || + field->extra->index_enum == ((container_identity*)field->type)->getIndexEnumType()) { field->type->lua_read(state, 2, ptr); return; @@ -1445,7 +1445,7 @@ static void GetAdHocMetatable(lua_State *state, const struct_field_info *field) case struct_field_info::CONTAINER: { auto ctype = (container_identity*)field->type; - MakeContainerMetatable(state, ctype, ctype->getItemType(), -1, field->eid); + MakeContainerMetatable(state, ctype, ctype->getItemType(), -1, field->extra ? field->extra->index_enum : nullptr); break; } @@ -1456,12 +1456,12 @@ static void GetAdHocMetatable(lua_State *state, const struct_field_info *field) case struct_field_info::STATIC_ARRAY: MakeContainerMetatable(state, &df::buffer_container_identity::base_instance, - field->type, field->count, field->eid); + field->type, field->count, field->extra ? field->extra->index_enum : nullptr); break; case struct_field_info::STL_VECTOR_PTR: MakeContainerMetatable(state, &df::identity_traits >::identity, - field->type, -1, field->eid); + field->type, -1, field->extra ? field->extra->index_enum : nullptr); break; default: diff --git a/library/include/DataDefs.h b/library/include/DataDefs.h index 03bb7857f..a6639f7b1 100644 --- a/library/include/DataDefs.h +++ b/library/include/DataDefs.h @@ -252,6 +252,13 @@ namespace DFHack virtual void lua_write(lua_State *state, int fname_idx, void *ptr, int val_index); }; + struct struct_field_info_extra { + enum_identity *index_enum; + type_identity *ref_target; + const char *union_tag_field; + const char *union_tag_attr; + }; + struct struct_field_info { enum Mode { END, @@ -270,7 +277,7 @@ namespace DFHack size_t offset; type_identity *type; size_t count; - enum_identity *eid; + const struct_field_info_extra *extra; }; class DFHACK_EXPORT struct_identity : public compound_identity { @@ -452,6 +459,7 @@ namespace df using DFHack::struct_identity; using DFHack::union_identity; using DFHack::struct_field_info; + using DFHack::struct_field_info_extra; using DFHack::bitfield_item_info; using DFHack::bitfield_identity; using DFHack::enum_identity; diff --git a/library/xml b/library/xml index ef09097be..6ad3e99e1 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit ef09097be76a58b5911b5bf65bee7c3cd6d7bb16 +Subproject commit 6ad3e99e1ed26f1b0af210f941ace905a70b50e7 diff --git a/plugins/devel/check-structures-sanity/types.cpp b/plugins/devel/check-structures-sanity/types.cpp index 24d33301e..9e565215a 100644 --- a/plugins/devel/check-structures-sanity/types.cpp +++ b/plugins/devel/check-structures-sanity/types.cpp @@ -40,7 +40,7 @@ CheckedStructure::CheckedStructure(const struct_field_info *field) : } identity = field->type; - eid = field->eid; + eid = field->extra ? field->extra->index_enum : nullptr; inside_structure = true; switch (field->mode) {