array view rule

This commit is contained in:
Ryan Fleury
2025-04-12 07:55:19 -07:00
parent 3f69b028e4
commit d894f7112f
4 changed files with 41 additions and 3 deletions
-1
View File
@@ -93,7 +93,6 @@ e_select_ir_ctx(E_IRCtx *ctx)
String8 builtin_view_rule_names[] = String8 builtin_view_rule_names[] =
{ {
str8_lit_comp("bswap"), str8_lit_comp("bswap"),
str8_lit_comp("array"),
}; };
for EachElement(idx, builtin_view_rule_names) for EachElement(idx, builtin_view_rule_names)
{ {
+31
View File
@@ -2319,6 +2319,37 @@ E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity)
return id; 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 //~ rjf: (Built-In Type Hooks) `slice` lens
+7
View File
@@ -291,12 +291,19 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default);
E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity); E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity);
E_TYPE_EXPAND_NUM_FROM_ID_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 //~ rjf: (Built-In Type Hooks) `slice` lens
E_TYPE_IREXT_FUNCTION_DEF(slice); E_TYPE_IREXT_FUNCTION_DEF(slice);
E_TYPE_ACCESS_FUNCTION_DEF(slice); E_TYPE_ACCESS_FUNCTION_DEF(slice);
E_TYPE_EXPAND_INFO_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 //~ rjf: (Built-In Type Hooks) `only`, `omit` lenses
+1
View File
@@ -12345,6 +12345,7 @@ rd_frame(void)
{str8_lit("no_string"), 1, 1, 0, 0, 0, {0}}, {str8_lit("no_string"), 1, 1, 0, 0, 0, {0}},
{str8_lit("no_addr"), 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("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("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("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("disasm"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)},