strip out only/omit - i think they are insufficient for long-term filtering stuff...

This commit is contained in:
Ryan Fleury
2025-04-11 14:41:15 -07:00
parent 3e49e92e98
commit 2e8bca21f6
3 changed files with 29 additions and 121 deletions
+28 -10
View File
@@ -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);
}
-109
View File
@@ -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
+1 -2
View File
@@ -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)},