mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-24 04:34:59 -07:00
record which irtree-and-type generations were produced via auto-hooks; skip those when doing typeofs
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
+23
-1
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user