From 2e8bca21f613a4cd5db5b42e9f4e7606bedf991f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 11 Apr 2025 14:41:15 -0700 Subject: [PATCH] strip out only/omit - i think they are insufficient for long-term filtering stuff... --- src/eval/eval_ir.c | 38 ++++++++++---- src/eval/eval_types.c | 109 --------------------------------------- src/raddbg/raddbg_core.c | 3 +- 3 files changed, 29 insertions(+), 121 deletions(-) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index ca8d438a..98af225d 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1592,6 +1592,13 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) e_expr_push_child(call, e_expr_ref(arena, arg)); } result = e_irtree_and_type_from_expr(arena, call); + + // rjf: is "raw"? -> strip all lens types from result; disallow auto-hooks + if(str8_match(callee->string, str8_lit("raw"), 0)) + { + result.type_key = e_type_unwrap(result.type_key); + allow_autohooks = 0; + } } // rjf: calling a lens? -> generate IR for the first argument; wrap the type in @@ -1620,16 +1627,27 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) } } - // rjf: patch resultant type with a lens w/ args, pointing to the original type - result.type_key = e_type_key_cons(.kind = E_TypeKind_Lens, - .flags = lhs_type->flags, - .count = arg_count, - .args = args, - .direct_key = result.type_key, - .name = lhs_type->name, - .irext = lhs_type->irext, - .access = lhs_type->access, - .expand = lhs_type->expand); + // rjf: is "raw"? -> strip all lens types from result; disallow auto-hooks + if(str8_match(lhs_type->name, str8_lit("raw"), 0)) + { + result = e_irtree_and_type_from_expr(arena, lhs->next); + result.type_key = e_type_unwrap(result.type_key); + allow_autohooks = 0; + } + + // rjf: is non-raw -> patch resultant type with a lens w/ args, pointing to the original type + else + { + result.type_key = e_type_key_cons(.kind = E_TypeKind_Lens, + .flags = lhs_type->flags, + .count = arg_count, + .args = args, + .direct_key = result.type_key, + .name = lhs_type->name, + .irext = lhs_type->irext, + .access = lhs_type->access, + .expand = lhs_type->expand); + } scratch_end(scratch); } diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 6ca89074..57a3c53e 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2495,115 +2495,6 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(slice) } } - -//////////////////////////////// -//~ rjf: (Built-In Type Hooks) `only`, `omit` lenses - -typedef struct E_MemberFilterAccel E_MemberFilterAccel; -struct E_MemberFilterAccel -{ - E_MemberArray members; -}; - -E_TYPE_EXPAND_INFO_FUNCTION_DEF(only_and_omit) -{ - Temp scratch = scratch_begin(&arena, 1); - E_TypeExpandInfo info = {0}; - { - //- rjf: extract struct type - E_TypeKey struct_type_key = zero_struct; - { - E_TypeKey lhs_type_key = e_type_unwrap(irtree->type_key); - E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key); - if(e_type_kind_is_pointer_or_ref(lhs_type_kind)) - { - E_Type *type = e_type_from_key__cached(lhs_type_key); - if(type->count == 1) - { - E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(irtree->type_key)); - E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); - if(direct_type_kind == E_TypeKind_Struct || - direct_type_kind == E_TypeKind_Class || - direct_type_kind == E_TypeKind_Union) - { - struct_type_key = direct_type_key; - } - } - } - else if(lhs_type_kind == E_TypeKind_Struct || - lhs_type_kind == E_TypeKind_Class || - lhs_type_kind == E_TypeKind_Union) - { - struct_type_key = lhs_type_key; - } - } - - //- rjf: not struct -> fall back on default - if(e_type_key_match(struct_type_key, e_type_key_zero())) - { - info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(default)(arena, expr, irtree, filter); - } - - //- struct -> filter - else - { - E_Type *type = e_type_from_key__cached(irtree->type_key); - E_MemberArray data_members = e_type_data_members_from_key__cached(struct_type_key); - E_MemberList data_members_list__filtered = {0}; - if(type->args != 0) - { - B32 default_fits_filter = (str8_match(type->name, str8_lit("only"), 0) ? 0 : 1); - for EachIndex(idx, data_members.count) - { - B32 fits_filter = default_fits_filter; - for EachIndex(arg_idx, type->count) - { - E_Expr *arg = type->args[arg_idx]; - if(str8_match(arg->string, data_members.v[idx].name, 0)) - { - fits_filter = !default_fits_filter; - break; - } - } - if(fits_filter) - { - e_member_list_push(scratch.arena, &data_members_list__filtered, &data_members.v[idx]); - } - } - } - E_MemberFilterAccel *accel = push_array(arena, E_MemberFilterAccel, 1); - accel->members = e_member_array_from_list(arena, &data_members_list__filtered); - info.user_data = accel; - info.expr_count = accel->members.count; - } - } - scratch_end(scratch); - return info; -} - -E_TYPE_EXPAND_RANGE_FUNCTION_DEF(only_and_omit) -{ - if(user_data == 0) - { - E_TYPE_EXPAND_RANGE_FUNCTION_NAME(default)(arena, user_data, expr, irtree, filter, idx_range, exprs_out, exprs_strings_out); - } - else - { - Temp scratch = scratch_begin(&arena, 1); - E_MemberFilterAccel *accel = (E_MemberFilterAccel *)user_data; - Rng1U64 legal_idx_range = r1u64(0, accel->members.count); - Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range); - U64 read_range_count = dim_1u64(read_range); - for(U64 idx = 0; idx < read_range_count; idx += 1) - { - U64 member_idx = idx + read_range.min; - String8 member_name = accel->members.v[member_idx].name; - exprs_out[idx] = e_expr_irext_member_access(arena, expr, irtree, member_name); - } - scratch_end(scratch); - } -} - //////////////////////////////// //~ rjf: (Built-In Type Hooks) `folder` type diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 61dc4f3a..ca78fedd 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12252,6 +12252,7 @@ rd_frame(void) } lens_table[] = { + {str8_lit("raw"), 0, 0, 0, 0, 0, {0}}, {str8_lit("bin"), 1, 1, 0, 0, 0, {0}}, {str8_lit("oct"), 1, 1, 0, 0, 0, {0}}, {str8_lit("dec"), 1, 1, 0, 0, 0, {0}}, @@ -12260,8 +12261,6 @@ rd_frame(void) {str8_lit("no_string"), 1, 1, 0, 0, 0, {0}}, {str8_lit("no_addr"), 1, 1, 0, 0, 0, {0}}, {str8_lit("slice"), 0, 0, 1, E_TYPE_IREXT_FUNCTION_NAME(slice), E_TYPE_ACCESS_FUNCTION_NAME(slice), {E_TYPE_EXPAND_INFO_FUNCTION_NAME(slice), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(slice)}}, - {str8_lit("only"), 0, 1, 0, 0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(only_and_omit), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(only_and_omit)}}, - {str8_lit("omit"), 0, 1, 0, 0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(only_and_omit), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(only_and_omit)}}, {str8_lit("text"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(text), EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)}, {str8_lit("disasm"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)}, {str8_lit("memory"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)},