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
+2 -3
View File
@@ -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
+31
View File
@@ -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
+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_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
+1
View File
@@ -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)},