diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index c9561d3a..b88f742b 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -318,6 +318,7 @@ struct E_IRTreeAndType E_TypeKey type_key; void *user_data; E_Mode mode; + B32 auto_hook; E_MsgList msgs; E_IRTreeAndType *prev; }; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 41d0767d..94f341ba 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -903,9 +903,20 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, 1, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); + // rjf: find the first non-autohook result + E_TypeKey type_key = r_tree.type_key; + for(E_IRTreeAndType *t = &r_tree; t != 0; t = t->prev) + { + type_key = t->type_key; + if(t->auto_hook == 0) + { + break; + } + } + // rjf: fill output result.root = e_irtree_const_u(arena, 0); - result.type_key = r_tree.type_key; + result.type_key = type_key; result.mode = E_Mode_Null; }break; @@ -1573,6 +1584,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I case E_ExprKind_LeafIdentifier: { Temp scratch = scratch_begin(&arena, 1); + B32 is_auto_hook = 0; String8 qualifier = expr->qualifier; String8 string = expr->string; String8 string__redirected = string; @@ -1617,6 +1629,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); mapped_bytecode_mode = parent_irtree->mode; mapped_type_key = parent_irtree->type_key; + is_auto_hook = parent_irtree->auto_hook; disallow_autohooks = 1; E_MsgList msgs = e_msg_list_copy(arena, &parent_irtree->msgs); e_msg_list_concat_in_place(&result.msgs, &msgs); @@ -2054,6 +2067,9 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I result = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, access); } + //- rjf: mark if auto hook + result.auto_hook = is_auto_hook; + //- rjf: error on failure-to-generate if(!generated && !str8_match(string, str8_lit("$"), 0)) { @@ -2340,6 +2356,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I result.prev[0] = *parent; } + //- rjf: mark this result as an auto-hook, if we have an override + if(t->overridden) + { + result.auto_hook = 1; + } + //- rjf: find any auto hooks according to this generation's type if(!disallow_autohooks && result.mode != E_Mode_Null) { diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index fdeafc0c..b2c7622f 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2428,6 +2428,7 @@ rd_view_from_eval(RD_Cfg *parent, E_Eval eval) rd_cfg_child_from_string_or_alloc(view, str8_lit("selected")); { // rjf: get expression evaluation + // TODO(rjf): we need to account for UFCS style expressions here... E_Eval expr_eval = eval; if(eval.expr->kind == E_ExprKind_Call && type_is_visualizer) {