From f72c956c9f448441301a3683c7bd50de3f229909 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 28 Apr 2025 15:41:32 -0700 Subject: [PATCH] fix implicit parent/override member accesses --- src/eval/eval_ir.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 8e930ccf..e5c5ee9a 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1554,16 +1554,20 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 //- rjf: try to map name as implicit access of overridden expression ('$.member_name', where the $. prefix is omitted) if(!string_mapped && parent != 0 && parent->root != &e_irnode_nil) { - E_Expr *access = e_expr_irext_member_access(scratch.arena, &e_expr_nil, parent, string); - E_IRTreeAndType access_irtree = e_push_irtree_and_type_from_expr(scratch.arena, parent, disallow_autohooks, 1, 1, access); - if(access_irtree.root != &e_irnode_nil) + for(E_IRTreeAndType *prev = parent; prev != 0; prev = prev->prev) { - string_mapped = 1; - E_OpList oplist = e_oplist_from_irtree(scratch.arena, access_irtree.root); - mapped_type_key = access_irtree.type_key; - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); - mapped_bytecode_mode = access_irtree.mode; - e_msg_list_concat_in_place(&result.msgs, &access_irtree.msgs); + E_Expr *access = e_expr_irext_member_access(scratch.arena, &e_expr_nil, prev, string); + E_IRTreeAndType access_irtree = e_push_irtree_and_type_from_expr(scratch.arena, prev, disallow_autohooks, 1, 1, access); + if(access_irtree.root != &e_irnode_nil) + { + string_mapped = 1; + E_OpList oplist = e_oplist_from_irtree(scratch.arena, access_irtree.root); + mapped_type_key = access_irtree.type_key; + mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); + mapped_bytecode_mode = access_irtree.mode; + e_msg_list_concat_in_place(&result.msgs, &access_irtree.msgs); + break; + } } }