mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-31 03:10:03 +00:00
strip out only/omit - i think they are insufficient for long-term filtering stuff...
This commit is contained in:
+28
-10
@@ -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));
|
e_expr_push_child(call, e_expr_ref(arena, arg));
|
||||||
}
|
}
|
||||||
result = e_irtree_and_type_from_expr(arena, call);
|
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
|
// 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
|
// rjf: is "raw"? -> strip all lens types from result; disallow auto-hooks
|
||||||
result.type_key = e_type_key_cons(.kind = E_TypeKind_Lens,
|
if(str8_match(lhs_type->name, str8_lit("raw"), 0))
|
||||||
.flags = lhs_type->flags,
|
{
|
||||||
.count = arg_count,
|
result = e_irtree_and_type_from_expr(arena, lhs->next);
|
||||||
.args = args,
|
result.type_key = e_type_unwrap(result.type_key);
|
||||||
.direct_key = result.type_key,
|
allow_autohooks = 0;
|
||||||
.name = lhs_type->name,
|
}
|
||||||
.irext = lhs_type->irext,
|
|
||||||
.access = lhs_type->access,
|
// rjf: is non-raw -> patch resultant type with a lens w/ args, pointing to the original type
|
||||||
.expand = lhs_type->expand);
|
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);
|
scratch_end(scratch);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
//~ rjf: (Built-In Type Hooks) `folder` type
|
||||||
|
|
||||||
|
|||||||
@@ -12252,6 +12252,7 @@ rd_frame(void)
|
|||||||
}
|
}
|
||||||
lens_table[] =
|
lens_table[] =
|
||||||
{
|
{
|
||||||
|
{str8_lit("raw"), 0, 0, 0, 0, 0, {0}},
|
||||||
{str8_lit("bin"), 1, 1, 0, 0, 0, {0}},
|
{str8_lit("bin"), 1, 1, 0, 0, 0, {0}},
|
||||||
{str8_lit("oct"), 1, 1, 0, 0, 0, {0}},
|
{str8_lit("oct"), 1, 1, 0, 0, 0, {0}},
|
||||||
{str8_lit("dec"), 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_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("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("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("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)},
|
||||||
{str8_lit("memory"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)},
|
{str8_lit("memory"), 0, 0, 0, 0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)},
|
||||||
|
|||||||
Reference in New Issue
Block a user