|
|
@ -536,6 +536,7 @@ static void field_reference(lua_State *state, const struct_field_info *field, vo
|
|
|
|
case struct_field_info::PRIMITIVE:
|
|
|
|
case struct_field_info::PRIMITIVE:
|
|
|
|
case struct_field_info::SUBSTRUCT:
|
|
|
|
case struct_field_info::SUBSTRUCT:
|
|
|
|
push_object_internal(state, field->type, ptr);
|
|
|
|
push_object_internal(state, field->type, ptr);
|
|
|
|
|
|
|
|
get_object_ref_header(state, -1)->field_info = field;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
case struct_field_info::POINTER:
|
|
|
|
case struct_field_info::POINTER:
|
|
|
@ -706,6 +707,16 @@ static type_identity *find_primitive_field(lua_State *state, int field, const ch
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
static int meta_primitive_index(lua_State *state)
|
|
|
|
static int meta_primitive_index(lua_State *state)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
const char *attr = lua_tostring(state, -1);
|
|
|
|
|
|
|
|
if (attr == std::string("ref_target")) {
|
|
|
|
|
|
|
|
const struct_field_info *field_info = get_object_ref_header(state, 1)->field_info;
|
|
|
|
|
|
|
|
if (field_info && field_info->extra && field_info->extra->ref_target) {
|
|
|
|
|
|
|
|
LookupInTable(state, field_info->extra->ref_target, &DFHACK_TYPEID_TABLE_TOKEN);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
lua_pushnil(state);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
uint8_t *ptr = get_object_addr(state, 1, 2, "read");
|
|
|
|
uint8_t *ptr = get_object_addr(state, 1, 2, "read");
|
|
|
|
auto type = find_primitive_field(state, 2, "read", &ptr);
|
|
|
|
auto type = find_primitive_field(state, 2, "read", &ptr);
|
|
|
|
if (!type)
|
|
|
|
if (!type)
|
|
|
|