From d894f7112f3a4374acefc96251e59fb759b4066b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 12 Apr 2025 07:55:19 -0700 Subject: [PATCH] array view rule --- src/eval/eval_ir.c | 5 ++--- src/eval/eval_types.c | 31 +++++++++++++++++++++++++++++++ src/eval/eval_types.h | 7 +++++++ src/raddbg/raddbg_core.c | 1 + 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index df177443..b47d4559 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -93,7 +93,6 @@ e_select_ir_ctx(E_IRCtx *ctx) String8 builtin_view_rule_names[] = { str8_lit_comp("bswap"), - str8_lit_comp("array"), }; for EachElement(idx, builtin_view_rule_names) { @@ -2255,8 +2254,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { irtree_stripped.type_key = e_type_direct_from_key(irtree_stripped.type_key); } - E_IRExt ext = type->irext(arena, expr, &irtree_stripped); - result.user_data = ext.user_data; + E_IRExt ext = type->irext(arena, expr, &irtree_stripped); + result.user_data = ext.user_data; } //- rjf: equip previous task's irtree diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 34b0f507..b6194826 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2319,6 +2319,37 @@ E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity) return id; } +//////////////////////////////// +//~ rjf: (Built-In Type Hooks) `array` lens + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(array) +{ + E_Type *type = e_type_from_key__cached(irtree->type_key); + U64 count = 1; + if(type->args != 0 && type->count > 0) + { + E_Expr *count_expr = type->args[0]; + E_IRTreeAndType *prev_overridden_irtree = e_ir_state->overridden_irtree; + e_ir_state->overridden_irtree = irtree; + { + E_Value count_value = e_value_from_expr(count_expr); + count = count_value.u64; + } + e_ir_state->overridden_irtree = prev_overridden_irtree; + } + E_TypeExpandInfo info = {0, count}; + return info; +} + +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(array) +{ + U64 read_range_count = dim_1u64(idx_range); + for(U64 idx = 0; idx < read_range_count; idx += 1) + { + exprs_out[idx] = e_expr_irext_array_index(arena, expr, irtree, idx_range.min + idx); + } +} + //////////////////////////////// //~ rjf: (Built-In Type Hooks) `slice` lens diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index 171634d1..c606c1be 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -291,12 +291,19 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default); E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity); E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity); +//////////////////////////////// +//~ rjf: (Built-In Type Hooks) `array` lens + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(array); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(array); + //////////////////////////////// //~ rjf: (Built-In Type Hooks) `slice` lens E_TYPE_IREXT_FUNCTION_DEF(slice); E_TYPE_ACCESS_FUNCTION_DEF(slice); E_TYPE_EXPAND_INFO_FUNCTION_DEF(slice); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(slice); //////////////////////////////// //~ rjf: (Built-In Type Hooks) `only`, `omit` lenses diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 992a034e..08616cbb 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12345,6 +12345,7 @@ 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("range1"), 0, 0, 0, 0, 0, {0}}, + {str8_lit("array"), 0, 0, 1, 0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(array), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(array)}}, {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("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)},