mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-15 00:22:23 -07:00
eval_visualization: eliminate expansion-range hook; move expansions & block tree building completely to new eval hooks for lookups
This commit is contained in:
@@ -61,7 +61,7 @@ e_autoresolved_eval_from_eval(E_Eval eval)
|
||||
if(string_idx == 0) { string_idx = gvar->name_string_idx; }
|
||||
if(string_idx != 0)
|
||||
{
|
||||
eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 0);
|
||||
eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 1, 0);
|
||||
}
|
||||
}
|
||||
return eval;
|
||||
@@ -127,7 +127,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx);
|
||||
RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
|
||||
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx);
|
||||
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 0);
|
||||
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0);
|
||||
eval.type_key = ptr_to_derived_type_key;
|
||||
}
|
||||
}
|
||||
|
||||
+66
-28
@@ -130,14 +130,10 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
|
||||
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key);
|
||||
if(e_type_kind_is_pointer_or_ref(lhs_type_kind))
|
||||
{
|
||||
lookup_info.idxed_expr_count = 1;
|
||||
E_Type *type = e_type_from_key(scratch.arena, lhs_type_key);
|
||||
lookup_info.idxed_expr_count = type->count;
|
||||
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs_irtree.type_key));
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
|
||||
if(direct_type_kind == E_TypeKind_Array)
|
||||
{
|
||||
E_Type *direct_type = e_type_from_key(scratch.arena, direct_type_key);
|
||||
lookup_info.idxed_expr_count = direct_type->count;
|
||||
}
|
||||
if(direct_type_kind == E_TypeKind_Struct ||
|
||||
direct_type_kind == E_TypeKind_Class ||
|
||||
direct_type_kind == E_TypeKind_Union ||
|
||||
@@ -155,6 +151,11 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
|
||||
E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key);
|
||||
lookup_info.named_expr_count = lhs_type->count;
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Array)
|
||||
{
|
||||
E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key);
|
||||
lookup_info.idxed_expr_count = lhs_type->count;
|
||||
}
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return lookup_info;
|
||||
@@ -405,44 +406,83 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(default)
|
||||
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(default)
|
||||
{
|
||||
E_LookupRange result = {0};
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
{
|
||||
//- rjf: unpack type of expression
|
||||
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs);
|
||||
E_TypeKey lhs_type_key = lhs_irtree.type_key;
|
||||
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key);
|
||||
if(lhs_type_kind == E_TypeKind_Struct ||
|
||||
lhs_type_kind == E_TypeKind_Union ||
|
||||
lhs_type_kind == E_TypeKind_Class ||
|
||||
lhs_type_kind == E_TypeKind_Enum)
|
||||
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs_type_key));
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
|
||||
|
||||
//- rjf: pull out specific kinds of types
|
||||
B32 do_struct_range = 0;
|
||||
B32 do_index_range = 0;
|
||||
E_TypeKey struct_type_key = zero_struct;
|
||||
E_TypeKind struct_type_kind = E_TypeKind_Null;
|
||||
if(e_type_kind_is_pointer_or_ref(lhs_type_kind))
|
||||
{
|
||||
E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key);
|
||||
if(lhs_type->count == 1 &&
|
||||
(direct_type_kind == E_TypeKind_Struct ||
|
||||
direct_type_kind == E_TypeKind_Union ||
|
||||
direct_type_kind == E_TypeKind_Class ||
|
||||
direct_type_kind == E_TypeKind_Enum))
|
||||
{
|
||||
struct_type_key = direct_type_key;
|
||||
struct_type_kind = direct_type_kind;
|
||||
do_struct_range = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
do_index_range = 1;
|
||||
}
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Struct ||
|
||||
lhs_type_kind == E_TypeKind_Union ||
|
||||
lhs_type_kind == E_TypeKind_Class ||
|
||||
lhs_type_kind == E_TypeKind_Enum)
|
||||
{
|
||||
struct_type_key = lhs_type_key;
|
||||
struct_type_kind = lhs_type_kind;
|
||||
do_struct_range = 1;
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Set)
|
||||
{
|
||||
do_index_range = 1;
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Array)
|
||||
{
|
||||
do_index_range = 1;
|
||||
}
|
||||
|
||||
//- rjf: struct case -> the lookup-range will return a range of members
|
||||
if(do_struct_range)
|
||||
{
|
||||
E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key);
|
||||
Rng1U64 legal_idx_range = r1u64(0, lhs_type->count);
|
||||
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
|
||||
U64 read_range_count = dim_1u64(read_range);
|
||||
result.exprs_count = read_range_count;
|
||||
result.exprs = push_array(arena, E_Expr *, result.exprs_count);
|
||||
for(U64 idx = 0; idx < result.exprs_count; idx += 1)
|
||||
for(U64 idx = 0; idx < read_range_count; idx += 1)
|
||||
{
|
||||
U64 member_idx = idx + read_range.min;
|
||||
String8 member_name = (lhs_type->members ? lhs_type->members[member_idx].name :
|
||||
lhs_type->enum_vals ? lhs_type->enum_vals[member_idx].name : str8_lit(""));
|
||||
result.exprs[idx] = e_expr_ref_member_access(arena, lhs, member_name);
|
||||
exprs[idx] = e_expr_ref_member_access(arena, lhs, member_name);
|
||||
}
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Set)
|
||||
|
||||
//- rjf: ptr case -> the lookup-range will return a range of dereferences
|
||||
else if(do_index_range)
|
||||
{
|
||||
result.exprs_count = dim_1u64(idx_range);
|
||||
result.exprs = push_array(arena, E_Expr *, result.exprs_count);
|
||||
result.exprs_strings = push_array(arena, String8, result.exprs_count);
|
||||
for(U64 idx = 0; idx < result.exprs_count; idx += 1)
|
||||
U64 read_range_count = dim_1u64(idx_range);
|
||||
for(U64 idx = 0; idx < read_range_count; idx += 1)
|
||||
{
|
||||
result.exprs[idx] = e_expr_ref_array_index(arena, lhs, idx_range.min + idx);
|
||||
exprs[idx] = e_expr_ref_array_index(arena, lhs, idx_range.min + idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(default)
|
||||
@@ -486,8 +526,7 @@ E_IRGEN_FUNCTION_DEF(array)
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_Eval count_eval = e_eval_from_expr(scratch.arena, tag->first->next);
|
||||
E_TypeKey element_type_key = e_type_ptee_from_key(type_key);
|
||||
E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count_eval.value.u64);
|
||||
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0);
|
||||
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_eval.value.u64, 0);
|
||||
irtree.type_key = ptr_type_key;
|
||||
scratch_end(scratch);
|
||||
}
|
||||
@@ -542,8 +581,7 @@ E_IRGEN_FUNCTION_DEF(slice)
|
||||
{
|
||||
String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key);
|
||||
E_TypeKey element_type_key = e_type_ptee_from_key(base_ptr_member->type_key);
|
||||
E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count);
|
||||
E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0);
|
||||
E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count, 0);
|
||||
E_MemberList slice_type_members = {0};
|
||||
e_member_list_push(scratch.arena, &slice_type_members, count_member);
|
||||
e_member_list_push(scratch.arena, &slice_type_members, &(E_Member){.kind = E_MemberKind_DataField, .type_key = sized_base_ptr_type_key, .name = base_ptr_member->name, .pretty_name = base_ptr_member->pretty_name, .off = base_ptr_member->off});
|
||||
@@ -1055,7 +1093,7 @@ E_IRGEN_FUNCTION_DEF(default)
|
||||
|
||||
// rjf: generate
|
||||
result.root = r_tree.root;
|
||||
result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 0);
|
||||
result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 1, 0);
|
||||
result.mode = E_Mode_Value;
|
||||
}break;
|
||||
|
||||
@@ -1414,7 +1452,7 @@ E_IRGEN_FUNCTION_DEF(default)
|
||||
E_TypeKey ptr_type = ptr_tree->type_key;
|
||||
if(ptr_is_decay)
|
||||
{
|
||||
ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 0);
|
||||
ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 1, 0);
|
||||
}
|
||||
E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_root, int_root);
|
||||
result.root = new_root;
|
||||
|
||||
+1
-9
@@ -73,14 +73,6 @@ struct E_LookupAccess
|
||||
E_IRTreeAndType irtree_and_type;
|
||||
};
|
||||
|
||||
typedef struct E_LookupRange E_LookupRange;
|
||||
struct E_LookupRange
|
||||
{
|
||||
U64 exprs_count;
|
||||
E_Expr **exprs;
|
||||
String8 *exprs_strings;
|
||||
};
|
||||
|
||||
#define E_LOOKUP_INFO_FUNCTION_SIG(name) E_LookupInfo name(Arena *arena, E_Expr *lhs, String8 filter)
|
||||
#define E_LOOKUP_INFO_FUNCTION_NAME(name) e_lookup_info_##name
|
||||
#define E_LOOKUP_INFO_FUNCTION_DEF(name) internal E_LOOKUP_INFO_FUNCTION_SIG(E_LOOKUP_INFO_FUNCTION_NAME(name))
|
||||
@@ -93,7 +85,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(default);
|
||||
typedef E_LOOKUP_ACCESS_FUNCTION_SIG(E_LookupAccessFunctionType);
|
||||
E_LOOKUP_ACCESS_FUNCTION_DEF(default);
|
||||
|
||||
#define E_LOOKUP_RANGE_FUNCTION_SIG(name) E_LookupRange name(Arena *arena, E_Expr *lhs, Rng1U64 idx_range, void *user_data)
|
||||
#define E_LOOKUP_RANGE_FUNCTION_SIG(name) void name(Arena *arena, E_Expr *lhs, Rng1U64 idx_range, E_Expr **exprs, String8 *exprs_strings, void *user_data)
|
||||
#define E_LOOKUP_RANGE_FUNCTION_NAME(name) e_lookup_range_##name
|
||||
#define E_LOOKUP_RANGE_FUNCTION_DEF(name) internal E_LOOKUP_RANGE_FUNCTION_SIG(E_LOOKUP_RANGE_FUNCTION_NAME(name))
|
||||
typedef E_LOOKUP_RANGE_FUNCTION_SIG(E_LookupRangeFunctionType);
|
||||
|
||||
@@ -1041,7 +1041,7 @@ e_type_from_expr(E_Expr *expr)
|
||||
case E_ExprKind_Ptr:
|
||||
{
|
||||
E_TypeKey direct_type_key = e_type_from_expr(expr->first);
|
||||
result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key, 0);
|
||||
result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key, 1, 0);
|
||||
}break;
|
||||
case E_ExprKind_Array:
|
||||
{
|
||||
@@ -1356,7 +1356,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
else
|
||||
{
|
||||
E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
|
||||
type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 0);
|
||||
type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0);
|
||||
E_Expr *casted = atom;
|
||||
E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str);
|
||||
e_expr_push_child(cast, type);
|
||||
|
||||
@@ -456,19 +456,12 @@ e_type_key_cons_array(E_TypeKey element_type_key, U64 count)
|
||||
}
|
||||
|
||||
internal E_TypeKey
|
||||
e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags)
|
||||
e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags)
|
||||
{
|
||||
E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .flags = flags, .direct_key = element_type_key);
|
||||
return key;
|
||||
}
|
||||
|
||||
internal E_TypeKey
|
||||
e_type_key_cons_space_ptr(E_TypeKey direct_type_key)
|
||||
{
|
||||
E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_SpacePtr, .direct_key = direct_type_key);
|
||||
return key;
|
||||
}
|
||||
|
||||
internal E_TypeKey
|
||||
e_type_key_cons_base(Type *type)
|
||||
{
|
||||
@@ -489,7 +482,7 @@ e_type_key_cons_base(Type *type)
|
||||
if(type->flags & TypeFlag_IsPlainText){ flags |= E_TypeFlag_IsPlainText; }
|
||||
if(type->flags & TypeFlag_IsCodeText) { flags |= E_TypeFlag_IsCodeText; }
|
||||
if(type->flags & TypeFlag_IsPathText) { flags |= E_TypeFlag_IsPathText; }
|
||||
result = e_type_key_cons_ptr(arch_from_context(), direct_type, flags);
|
||||
result = e_type_key_cons_ptr(arch_from_context(), direct_type, 1, flags);
|
||||
}break;
|
||||
case TypeKind_Array:
|
||||
{
|
||||
@@ -804,6 +797,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
||||
type->kind = kind;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8;
|
||||
type->count = 1;
|
||||
}break;
|
||||
|
||||
case RDI_TypeKind_Array:
|
||||
|
||||
@@ -318,8 +318,7 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params);
|
||||
|
||||
//- rjf: constructed type construction helpers
|
||||
internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count);
|
||||
internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags);
|
||||
internal E_TypeKey e_type_key_cons_space_ptr(E_TypeKey direct_type_key);
|
||||
internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags);
|
||||
internal E_TypeKey e_type_key_cons_base(Type *type);
|
||||
|
||||
//- rjf: basic type key functions
|
||||
|
||||
@@ -91,7 +91,6 @@
|
||||
@table(coverage_check name name_lower string ih ex xr xe display_name docs schema description)
|
||||
EV_ViewRuleTable:
|
||||
{
|
||||
{x Default default "default" - - - x "Default" - "" "" }
|
||||
{x Array array "array" - - x - "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." }
|
||||
{x List list "list" - - - x "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." }
|
||||
{x Slice slice "slice" - - x - "Slice" x "" "Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer." }
|
||||
@@ -109,6 +108,7 @@ EV_ViewRuleTable:
|
||||
|
||||
@enum EV_ViewRuleKind:
|
||||
{
|
||||
EV_ViewRuleKind_Null,
|
||||
@expand(EV_ViewRuleTable a) `$(a.name)`,
|
||||
COUNT,
|
||||
}
|
||||
@@ -116,11 +116,11 @@ EV_ViewRuleTable:
|
||||
@gen
|
||||
{
|
||||
@expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`;
|
||||
@expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`;
|
||||
}
|
||||
|
||||
@data(EV_ViewRuleInfo) @c_file ev_builtin_view_rule_info_table:
|
||||
{
|
||||
`{0}`,
|
||||
@expand(EV_ViewRuleTable a)
|
||||
```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil)"), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }```;
|
||||
```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") }```;
|
||||
}
|
||||
|
||||
@@ -96,208 +96,6 @@ ev_arch_from_eval_params(E_Eval eval, MD_Node *params)
|
||||
return arch;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: default
|
||||
|
||||
typedef struct EV_DefaultExpandAccel EV_DefaultExpandAccel;
|
||||
struct EV_DefaultExpandAccel
|
||||
{
|
||||
E_MemberArray members;
|
||||
E_EnumValArray enum_vals;
|
||||
E_LookupRule *lookup_rule;
|
||||
void *lookup_user_data;
|
||||
U64 array_count;
|
||||
B32 array_need_extra_deref;
|
||||
B32 is_ptr2ptr;
|
||||
};
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
U64 total_row_count = 0;
|
||||
EV_DefaultExpandAccel *accel = push_array(arena, EV_DefaultExpandAccel, 1);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: unpack expression type info
|
||||
//
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
|
||||
E_TypeKey type_key = e_type_unwrap(irtree.type_key);
|
||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(type_key));
|
||||
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: structs/unions/classes -> expansions generate rows for all members
|
||||
//
|
||||
if((type_kind == E_TypeKind_Struct ||
|
||||
type_kind == E_TypeKind_Union ||
|
||||
type_kind == E_TypeKind_Class) ||
|
||||
(e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct ||
|
||||
direct_type_kind == E_TypeKind_Union ||
|
||||
direct_type_kind == E_TypeKind_Class)))
|
||||
{
|
||||
E_TypeKey struct_type_key = e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key;
|
||||
accel->members = e_type_data_members_from_key__cached(struct_type_key);
|
||||
total_row_count = accel->members.count;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: enums -> expansions generate rows for all members
|
||||
//
|
||||
else if(type_kind == E_TypeKind_Enum ||
|
||||
(e_type_kind_is_pointer_or_ref(type_kind) && direct_type_kind == E_TypeKind_Enum))
|
||||
{
|
||||
E_Type *type = e_type_from_key(arena, e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key);
|
||||
accel->enum_vals.v = type->enum_vals;
|
||||
accel->enum_vals.count = type->count;
|
||||
total_row_count = accel->enum_vals.count;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: arrays -> expansions generate rows for all elements
|
||||
//
|
||||
else if(type_kind == E_TypeKind_Array ||
|
||||
(e_type_kind_is_pointer_or_ref(type_kind) && direct_type_kind == E_TypeKind_Array))
|
||||
{
|
||||
B32 need_extra_deref = e_type_kind_is_pointer_or_ref(type_kind);
|
||||
E_Expr *array_expr = need_extra_deref ? e_expr_ref_deref(arena, expr) : expr;
|
||||
E_Type *type = e_type_from_key(arena, need_extra_deref ? direct_type_key : type_key);
|
||||
total_row_count = type->count;
|
||||
accel->array_count = type->count;
|
||||
accel->array_need_extra_deref = need_extra_deref;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: pointer-to-pointer -> expansions generate dereference
|
||||
//
|
||||
else if(e_type_kind_is_pointer_or_ref(type_kind) && e_type_kind_is_pointer_or_ref(direct_type_kind))
|
||||
{
|
||||
total_row_count = 1;
|
||||
accel->is_ptr2ptr = 1;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: sets -> expansions generate rows for all possible lookups
|
||||
//
|
||||
else if(type_kind == E_TypeKind_Set)
|
||||
{
|
||||
E_Type *type = e_type_from_key(scratch.arena, type_key);
|
||||
E_LookupRule *rule = e_lookup_rule_from_string(type->name);
|
||||
E_LookupInfo lookup_info = rule->info(arena, expr, filter);
|
||||
total_row_count = Max(lookup_info.named_expr_count, lookup_info.idxed_expr_count);
|
||||
accel->lookup_rule = rule;
|
||||
accel->lookup_user_data = lookup_info.user_data;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: package result
|
||||
//
|
||||
EV_ExpandInfo result = {0};
|
||||
{
|
||||
result.user_data = accel;
|
||||
result.row_count = total_row_count;
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default)
|
||||
{
|
||||
EV_DefaultExpandAccel *accel = (EV_DefaultExpandAccel *)user_data;
|
||||
EV_ExpandRangeInfo result = {0};
|
||||
U64 needed_row_count = dim_1u64(idx_range);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: fill with members
|
||||
//
|
||||
if(accel->members.count != 0)
|
||||
{
|
||||
E_MemberArray *members = &accel->members;
|
||||
result.row_exprs_count = Min(needed_row_count, members->count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_strings = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_view_rules = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
E_Member *member = &members->v[idx_range.min + row_expr_idx];
|
||||
result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, member->name);
|
||||
result.row_members[row_expr_idx] = member;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: fill with enum vals
|
||||
//
|
||||
else if(accel->enum_vals.count != 0)
|
||||
{
|
||||
E_EnumValArray *enumvals = &accel->enum_vals;
|
||||
result.row_exprs_count = Min(needed_row_count, enumvals->count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_strings = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_view_rules = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
E_EnumVal *enumval = &enumvals->v[idx_range.min + row_expr_idx];
|
||||
result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, enumval->name);
|
||||
result.row_members[row_expr_idx] = &e_member_nil;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: fill with array indices
|
||||
//
|
||||
else if(accel->array_count != 0)
|
||||
{
|
||||
E_Expr *array_expr = accel->array_need_extra_deref ? e_expr_ref_deref(arena, expr) : expr;
|
||||
result.row_exprs_count = Min(needed_row_count, accel->array_count);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_strings = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_view_rules = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
result.row_exprs[row_expr_idx] = e_expr_ref_array_index(arena, array_expr, idx_range.min + row_expr_idx);
|
||||
result.row_members[row_expr_idx] = &e_member_nil;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: fill with ptr-to-ptr deref
|
||||
//
|
||||
else if(accel->is_ptr2ptr)
|
||||
{
|
||||
result.row_exprs_count = 1;
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_strings = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_view_rules = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
result.row_exprs[0] = e_expr_ref_deref(arena, expr);
|
||||
result.row_members[0] = &e_member_nil;
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: fill with lookups
|
||||
//
|
||||
else if(accel->lookup_rule != 0)
|
||||
{
|
||||
E_LookupRange lookup_range = accel->lookup_rule->range(arena, expr, idx_range, accel->lookup_user_data);
|
||||
result.row_exprs_count = lookup_range.exprs_count;
|
||||
result.row_exprs = lookup_range.exprs;
|
||||
result.row_strings = lookup_range.exprs_strings;
|
||||
result.row_view_rules = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
result.row_members[row_expr_idx] = &e_member_nil;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: "list"
|
||||
|
||||
@@ -306,9 +104,3 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(list)
|
||||
EV_ExpandInfo info = {0};
|
||||
return info;
|
||||
}
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(list)
|
||||
{
|
||||
EV_ExpandRangeInfo info = {0};
|
||||
return info;
|
||||
}
|
||||
|
||||
@@ -15,22 +15,6 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil)
|
||||
return info;
|
||||
}
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(nil)
|
||||
{
|
||||
EV_ExpandRangeInfo info = {0};
|
||||
return info;
|
||||
}
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity)
|
||||
{
|
||||
return num;
|
||||
}
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity)
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Key Functions
|
||||
|
||||
@@ -352,7 +336,7 @@ ev_view_rule_info_table_push(Arena *arena, EV_ViewRuleInfoTable *table, EV_ViewR
|
||||
internal void
|
||||
ev_view_rule_info_table_push_builtins(Arena *arena, EV_ViewRuleInfoTable *table)
|
||||
{
|
||||
for EachEnumVal(EV_ViewRuleKind, kind)
|
||||
for EachNonZeroEnumVal(EV_ViewRuleKind, kind)
|
||||
{
|
||||
ev_view_rule_info_table_push(arena, table, &ev_builtin_view_rule_info_table[kind]);
|
||||
}
|
||||
@@ -387,206 +371,11 @@ ev_view_rule_info_from_string(String8 string)
|
||||
return info;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Automatic Type -> View Rule Table Building / Selection / Lookups
|
||||
|
||||
internal void
|
||||
ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule, B32 is_required)
|
||||
{
|
||||
if(table->slots_count == 0)
|
||||
{
|
||||
table->slots_count = 4096;
|
||||
table->slots = push_array(arena, EV_AutoViewRuleSlot, table->slots_count);
|
||||
}
|
||||
U64 hash = e_hash_from_type_key(type_key);
|
||||
U64 slot_idx = hash%table->slots_count;
|
||||
EV_AutoViewRuleSlot *slot = &table->slots[slot_idx];
|
||||
EV_AutoViewRuleNode *node = 0;
|
||||
for(EV_AutoViewRuleNode *n = slot->first; n != 0; n = n->next)
|
||||
{
|
||||
if(e_type_match(n->key, type_key))
|
||||
{
|
||||
node = n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(node == 0)
|
||||
{
|
||||
node = push_array(arena, EV_AutoViewRuleNode, 1);
|
||||
node->key = type_key;
|
||||
node->view_rule = push_str8_copy(arena, view_rule);
|
||||
node->is_required = is_required;
|
||||
SLLQueuePush(slot->first, slot->last, node);
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
ev_select_auto_view_rule_table(EV_AutoViewRuleTable *table)
|
||||
{
|
||||
ev_auto_view_rule_table = table;
|
||||
}
|
||||
|
||||
internal EV_ViewRuleList *
|
||||
ev_auto_view_rules_from_type_key(Arena *arena, E_TypeKey type_key, B32 gather_required, B32 gather_optional)
|
||||
{
|
||||
EV_ViewRuleList *result = &ev_nil_view_rule_list;
|
||||
if(ev_auto_view_rule_table != 0 && ev_auto_view_rule_table->slots_count != 0)
|
||||
{
|
||||
U64 hash = e_hash_from_type_key(type_key);
|
||||
U64 slot_idx = hash%ev_auto_view_rule_table->slots_count;
|
||||
EV_AutoViewRuleSlot *slot = &ev_auto_view_rule_table->slots[slot_idx];
|
||||
EV_AutoViewRuleNode *node = 0;
|
||||
for(EV_AutoViewRuleNode *n = slot->first; n != 0; n = n->next)
|
||||
{
|
||||
if(e_type_match(n->key, type_key) && ((n->is_required && gather_required) || (!n->is_required && gather_optional)))
|
||||
{
|
||||
if(result == &ev_nil_view_rule_list)
|
||||
{
|
||||
result = push_array(arena, EV_ViewRuleList, 1);
|
||||
}
|
||||
ev_view_rule_list_push_string(arena, result, n->view_rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: View Rule Instance List Building
|
||||
|
||||
internal void
|
||||
ev_view_rule_list_push_tree(Arena *arena, EV_ViewRuleList *list, MD_Node *root)
|
||||
{
|
||||
EV_ViewRuleNode *n = push_array(arena, EV_ViewRuleNode, 1);
|
||||
n->v.root = root;
|
||||
SLLQueuePush(list->first, list->last, n);
|
||||
list->count += 1;
|
||||
}
|
||||
|
||||
internal void
|
||||
ev_view_rule_list_push_string(Arena *arena, EV_ViewRuleList *list, String8 string)
|
||||
{
|
||||
if(string.size != 0)
|
||||
{
|
||||
MD_Node *root = md_tree_from_string(arena, string);
|
||||
for MD_EachNode(tln, root->first)
|
||||
{
|
||||
ev_view_rule_list_push_tree(arena, list, tln);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal EV_ViewRuleList *
|
||||
ev_view_rule_list_from_string(Arena *arena, String8 string)
|
||||
{
|
||||
EV_ViewRuleList *dst = push_array(arena, EV_ViewRuleList, 1);
|
||||
ev_view_rule_list_push_string(arena, dst, string);
|
||||
return dst;
|
||||
}
|
||||
|
||||
internal EV_ViewRuleList *
|
||||
ev_view_rule_list_from_expr_fastpaths(Arena *arena, String8 string)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
// rjf: parse expression
|
||||
E_TokenArray tokens = e_token_array_from_text(scratch.arena, string);
|
||||
E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, string, &tokens);
|
||||
|
||||
// rjf: extract view rules, encoded via fastpaths in expression string
|
||||
String8List fastpath_view_rules = {0};
|
||||
{
|
||||
U64 parse_opl = (parse.last_token >= tokens.v + tokens.count ? string.size : parse.last_token->range.min);
|
||||
U64 comma_pos = str8_find_needle(string, parse_opl, str8_lit(","), 0);
|
||||
U64 passthrough_pos = str8_find_needle(string, 0, str8_lit("--"), 0);
|
||||
if(comma_pos < string.size && comma_pos < passthrough_pos)
|
||||
{
|
||||
String8 comma_extension = str8_skip_chop_whitespace(str8_substr(string, r1u64(comma_pos+1, passthrough_pos)));
|
||||
if(str8_match(comma_extension, str8_lit("x"), StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
str8_list_pushf(scratch.arena, &fastpath_view_rules, "hex");
|
||||
}
|
||||
else if(str8_match(comma_extension, str8_lit("b"), StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
str8_list_pushf(scratch.arena, &fastpath_view_rules, "bin");
|
||||
}
|
||||
else if(str8_match(comma_extension, str8_lit("o"), StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
str8_list_pushf(scratch.arena, &fastpath_view_rules, "oct");
|
||||
}
|
||||
else if(comma_extension.size != 0)
|
||||
{
|
||||
str8_list_pushf(scratch.arena, &fastpath_view_rules, "array:{%S}", comma_extension);
|
||||
}
|
||||
}
|
||||
if(passthrough_pos < string.size)
|
||||
{
|
||||
String8 passthrough_view_rule = str8_skip_chop_whitespace(str8_skip(string, passthrough_pos+2));
|
||||
if(passthrough_view_rule.size != 0)
|
||||
{
|
||||
str8_list_push(scratch.arena, &fastpath_view_rules, passthrough_view_rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: convert strings to parsed view rules
|
||||
EV_ViewRuleList *view_rule_list = push_array(arena, EV_ViewRuleList, 1);
|
||||
for(String8Node *n = fastpath_view_rules.first; n != 0; n = n->next)
|
||||
{
|
||||
ev_view_rule_list_push_string(arena, view_rule_list, push_str8_copy(arena, n->string));
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
return view_rule_list;
|
||||
}
|
||||
|
||||
internal EV_ViewRuleList *
|
||||
ev_view_rule_list_from_inheritance(Arena *arena, EV_ViewRuleList *src)
|
||||
{
|
||||
EV_ViewRuleList *dst = push_array(arena, EV_ViewRuleList, 1);
|
||||
for(EV_ViewRuleNode *n = src->first; n != 0; n = n->next)
|
||||
{
|
||||
EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string);
|
||||
if(info->flags & EV_ViewRuleInfoFlag_Inherited)
|
||||
{
|
||||
ev_view_rule_list_push_tree(arena, dst, n->v.root);
|
||||
}
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
internal EV_ViewRuleList *
|
||||
ev_view_rule_list_copy(Arena *arena, EV_ViewRuleList *src)
|
||||
{
|
||||
EV_ViewRuleList *dst = push_array(arena, EV_ViewRuleList, 1);
|
||||
for(EV_ViewRuleNode *n = src->first; n != 0; n = n->next)
|
||||
{
|
||||
ev_view_rule_list_push_tree(arena, dst, n->v.root);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
internal void
|
||||
ev_view_rule_list_concat_in_place(EV_ViewRuleList *dst, EV_ViewRuleList **src)
|
||||
{
|
||||
if(dst->first && src[0] != &ev_nil_view_rule_list && src[0]->first)
|
||||
{
|
||||
dst->last->next = src[0]->first;
|
||||
dst->last = src[0]->last;
|
||||
dst->count += src[0]->count;
|
||||
}
|
||||
else if(!dst->first)
|
||||
{
|
||||
MemoryCopyStruct(dst, *src);
|
||||
}
|
||||
*src = &ev_nil_view_rule_list;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application)
|
||||
|
||||
internal E_Expr *
|
||||
ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules)
|
||||
ev_resolved_from_expr(Arena *arena, E_Expr *expr)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
{
|
||||
@@ -642,7 +431,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules)
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx);
|
||||
RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
|
||||
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx);
|
||||
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 0);
|
||||
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0);
|
||||
expr = e_expr_ref_cast(arena, ptr_to_derived_type_key, expr);
|
||||
}
|
||||
}
|
||||
@@ -659,7 +448,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules)
|
||||
//~ rjf: Block Building
|
||||
|
||||
internal EV_BlockTree
|
||||
ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules)
|
||||
ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
EV_BlockTree tree = {&ev_nil_block};
|
||||
@@ -667,21 +456,12 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
EV_ViewRuleInfo *default_expand_view_rule_info = ev_view_rule_info_from_string(str8_lit("default"));
|
||||
|
||||
//- rjf: form complete set of view rules
|
||||
EV_ViewRuleList *top_level_view_rules = ev_view_rule_list_copy(arena, view_rules);
|
||||
{
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
|
||||
EV_ViewRuleList *auto_view_rules = ev_auto_view_rules_from_type_key(arena, irtree.type_key, 1, 1);
|
||||
ev_view_rule_list_concat_in_place(top_level_view_rules, &auto_view_rules);
|
||||
}
|
||||
|
||||
//- rjf: generate root block
|
||||
tree.root = push_array(arena, EV_Block, 1);
|
||||
MemoryCopyStruct(tree.root, &ev_nil_block);
|
||||
tree.root->key = ev_key_root();
|
||||
tree.root->string = string;
|
||||
tree.root->expr = ev_resolved_from_expr(arena, expr, top_level_view_rules);
|
||||
tree.root->view_rules = top_level_view_rules;
|
||||
tree.root->expr = ev_resolved_from_expr(arena, expr);
|
||||
tree.root->row_count = 1;
|
||||
tree.total_row_count += 1;
|
||||
tree.total_item_count += 1;
|
||||
@@ -694,11 +474,10 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
EV_Block *parent_block;
|
||||
E_Expr *expr;
|
||||
U64 child_id;
|
||||
EV_ViewRuleList *view_rules;
|
||||
U64 split_relative_idx;
|
||||
B32 default_expanded;
|
||||
};
|
||||
Task start_task = {0, tree.root, tree.root->expr, 1, top_level_view_rules, 0};
|
||||
Task start_task = {0, tree.root, tree.root->expr, 1, 0};
|
||||
Task *first_task = &start_task;
|
||||
Task *last_task = first_task;
|
||||
for(Task *t = first_task; t != 0; t = t->next)
|
||||
@@ -721,24 +500,66 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
}
|
||||
|
||||
// rjf: get expansion view rule info
|
||||
EV_ViewRuleInfo *expand_view_rule_info = default_expand_view_rule_info;
|
||||
MD_Node *expand_params = &md_nil_node;
|
||||
for(EV_ViewRuleNode *n = t->view_rules->first; n != 0; n = n->next)
|
||||
E_LookupRule *lookup_rule = &e_lookup_rule__default;
|
||||
EV_ViewRuleInfo *expand_rule = default_expand_view_rule_info;
|
||||
E_Expr *lookup_rule_tag = &e_expr_nil;
|
||||
E_Expr *expand_rule_tag = &e_expr_nil;
|
||||
for(E_Expr *tag = t->expr->first_tag; tag != &e_expr_nil; tag = tag->next)
|
||||
{
|
||||
EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string);
|
||||
if(info->expr_expand_info != 0 && info->expr_expand_info != EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil))
|
||||
E_LookupRule *lookup_rule_candidate = e_lookup_rule_from_string(tag->first->string);
|
||||
EV_ViewRuleInfo *expand_rule_candidate = ev_view_rule_info_from_string(tag->first->string);
|
||||
if(lookup_rule_candidate != &e_lookup_rule__default)
|
||||
{
|
||||
expand_view_rule_info = info;
|
||||
expand_params = n->v.root;
|
||||
lookup_rule = lookup_rule_candidate;
|
||||
lookup_rule_tag = tag;
|
||||
}
|
||||
if(expand_rule_candidate != &ev_nil_view_rule_info)
|
||||
{
|
||||
expand_rule = expand_rule_candidate;
|
||||
expand_rule_tag = tag;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: get expansion info
|
||||
EV_ExpandInfo expand_info = expand_view_rule_info->expr_expand_info(arena, view, filter, t->expr, expand_params);
|
||||
// rjf: for set types, try to use the set's name to lookup rules, if we don't
|
||||
// have any
|
||||
if(lookup_rule == &e_lookup_rule__default ||
|
||||
expand_rule == default_expand_view_rule_info)
|
||||
{
|
||||
E_IRTreeAndType expr_irtree = e_irtree_and_type_from_expr(scratch.arena, t->expr);
|
||||
E_TypeKey expr_type_key = expr_irtree.type_key;
|
||||
E_TypeKind expr_type_kind = e_type_kind_from_key(expr_type_key);
|
||||
if(expr_type_kind == E_TypeKind_Set)
|
||||
{
|
||||
E_Type *expr_type = e_type_from_key(scratch.arena, expr_type_key);
|
||||
if(lookup_rule == &e_lookup_rule__default)
|
||||
{
|
||||
lookup_rule = e_lookup_rule_from_string(expr_type->name);
|
||||
}
|
||||
if(expand_rule == default_expand_view_rule_info)
|
||||
{
|
||||
expand_rule = ev_view_rule_info_from_string(expr_type->name);
|
||||
if(expand_rule == &ev_nil_view_rule_info)
|
||||
{
|
||||
expand_rule = default_expand_view_rule_info;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: get top-level lookup/expansion info
|
||||
E_LookupInfo lookup_info = lookup_rule->info(arena, t->expr, filter);
|
||||
EV_ExpandInfo expand_info = expand_rule->expr_expand_info(arena, view, filter, t->expr, expand_rule_tag);
|
||||
|
||||
// rjf: determine expansion info
|
||||
U64 expansion_row_count = lookup_info.named_expr_count ? lookup_info.named_expr_count : lookup_info.idxed_expr_count;
|
||||
if(expand_rule != &ev_nil_view_rule_info)
|
||||
{
|
||||
expansion_row_count = expand_info.row_count;
|
||||
}
|
||||
|
||||
// rjf: generate block for expansion
|
||||
EV_Block *expansion_block = &ev_nil_block;
|
||||
if(expand_info.row_count != 0)
|
||||
if(expansion_row_count != 0)
|
||||
{
|
||||
expansion_block = push_array(arena, EV_Block, 1);
|
||||
MemoryCopyStruct(expansion_block, &ev_nil_block);
|
||||
@@ -747,22 +568,24 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
expansion_block->key = key;
|
||||
expansion_block->split_relative_idx = t->split_relative_idx;
|
||||
expansion_block->expr = t->expr;
|
||||
expansion_block->view_rules = t->view_rules;
|
||||
expansion_block->expand_view_rule_info = expand_view_rule_info;
|
||||
expansion_block->expand_view_rule_params = expand_params;
|
||||
expansion_block->expand_view_rule_info_user_data = expand_info.user_data;
|
||||
expansion_block->row_count = expand_info.row_count;
|
||||
expansion_block->lookup_tag = lookup_rule_tag;
|
||||
expansion_block->expand_tag = expand_rule_tag;
|
||||
expansion_block->lookup_rule = lookup_rule;
|
||||
expansion_block->expand_rule = expand_rule;
|
||||
expansion_block->lookup_rule_user_data = lookup_info.user_data;
|
||||
expansion_block->expand_rule_user_data = expand_info.user_data;
|
||||
expansion_block->row_count = expansion_row_count;
|
||||
expansion_block->single_item = expand_info.single_item;
|
||||
expansion_block->rows_default_expanded = expand_info.rows_default_expanded;
|
||||
tree.total_row_count += expand_info.row_count;
|
||||
tree.total_item_count += expand_info.single_item ? 1 : expand_info.row_count;
|
||||
tree.total_row_count += expansion_row_count;
|
||||
tree.total_item_count += expand_info.single_item ? 1 : expansion_row_count;
|
||||
}
|
||||
|
||||
// rjf: gather children expansions from expansion state
|
||||
U64 child_count = 0;
|
||||
EV_Key *child_keys = 0;
|
||||
U64 *child_nums = 0;
|
||||
if(!child_count && !expand_info.rows_default_expanded && expand_node != 0 && expand_info.row_count != 0 && expand_view_rule_info->expr_expand_range_info)
|
||||
if(!child_count && !expand_info.rows_default_expanded && expand_node != 0 && expansion_row_count != 0)
|
||||
{
|
||||
// rjf: count children
|
||||
for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next, child_count += 1){}
|
||||
@@ -776,7 +599,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next, idx += 1)
|
||||
{
|
||||
child_keys[idx] = child->key;
|
||||
child_nums[idx] = expand_view_rule_info->expr_expand_num_from_id(child->key.child_id, expand_info.user_data);
|
||||
child_nums[idx] = lookup_rule->num_from_id(child->key.child_id, lookup_info.user_data);
|
||||
if(child_nums[idx] != child_keys[idx].child_id)
|
||||
{
|
||||
needs_sort = 1;
|
||||
@@ -816,7 +639,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
child_nums = push_array(scratch.arena, U64, child_count);
|
||||
for(U64 idx = 0; idx < child_count; idx += 1)
|
||||
{
|
||||
U64 child_id = expand_view_rule_info->expr_expand_id_from_num(idx+1, expand_info.user_data);
|
||||
U64 child_id = lookup_rule->id_from_num(idx+1, lookup_info.user_data);
|
||||
child_keys[idx] = ev_key_make(ev_hash_from_key(key), child_id);
|
||||
child_nums[idx] = idx+1;
|
||||
}
|
||||
@@ -827,39 +650,24 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
{
|
||||
U64 split_num = child_nums[idx];
|
||||
U64 split_relative_idx = split_num - 1;
|
||||
if(split_relative_idx >= expand_info.row_count)
|
||||
if(split_relative_idx >= expansion_row_count)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if(expand_info.rows_default_expanded || ev_expansion_from_key(view, child_keys[idx]))
|
||||
{
|
||||
EV_ExpandRangeInfo child_expand = expand_view_rule_info->expr_expand_range_info(arena, view, filter, t->expr, expand_params, r1u64(split_relative_idx, split_relative_idx+1), expand_info.user_data);
|
||||
if(child_expand.row_exprs_count > 0)
|
||||
Rng1U64 child_range = r1u64(split_relative_idx, split_relative_idx+1);
|
||||
E_Expr *child_expr = &e_expr_nil;
|
||||
String8 child_string = {0};
|
||||
lookup_rule->range(arena, t->expr, r1u64(split_relative_idx, split_relative_idx+1), &child_expr, &child_string, lookup_info.user_data);
|
||||
if(child_expr != &e_expr_nil)
|
||||
{
|
||||
EV_Key child_key = child_keys[idx];
|
||||
E_Expr *child_expr = child_expand.row_exprs[0];
|
||||
EV_ViewRuleList *child_view_rules = ev_view_rule_list_from_inheritance(arena, t->view_rules);
|
||||
String8 child_view_rule_string = ev_view_rule_from_key(view, child_key);
|
||||
ev_view_rule_list_push_string(arena, child_view_rules, child_view_rule_string);
|
||||
if(child_expand.row_strings[0].size != 0)
|
||||
{
|
||||
EV_ViewRuleList *fastpath_view_rules = ev_view_rule_list_from_expr_fastpaths(arena, child_expand.row_strings[0]);
|
||||
ev_view_rule_list_concat_in_place(child_view_rules, &fastpath_view_rules);
|
||||
}
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_IRTreeAndType child_irtree = e_irtree_and_type_from_expr(scratch.arena, child_expr);
|
||||
EV_ViewRuleList *child_auto_view_rules = ev_auto_view_rules_from_type_key(arena, child_irtree.type_key, 1, child_view_rule_string.size == 0);
|
||||
ev_view_rule_list_concat_in_place(child_view_rules, &child_auto_view_rules);
|
||||
scratch_end(scratch);
|
||||
}
|
||||
E_Expr *child_expr__resolved = ev_resolved_from_expr(arena, child_expr, child_view_rules);
|
||||
Task *task = push_array(scratch.arena, Task, 1);
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
task->parent_block = expansion_block;
|
||||
task->expr = child_expr__resolved;
|
||||
task->expr = child_expr;
|
||||
task->child_id = child_key.child_id;
|
||||
task->view_rules = child_view_rules;
|
||||
task->split_relative_idx = split_relative_idx;
|
||||
task->default_expanded = expand_info.rows_default_expanded;
|
||||
}
|
||||
@@ -873,7 +681,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
|
||||
}
|
||||
|
||||
internal EV_BlockTree
|
||||
ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules)
|
||||
ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
EV_BlockTree tree = {0};
|
||||
@@ -881,10 +689,7 @@ ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 s
|
||||
{
|
||||
E_TokenArray tokens = e_token_array_from_text(scratch.arena, string);
|
||||
E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens);
|
||||
EV_ViewRuleList *fastpath_view_rules = ev_view_rule_list_from_expr_fastpaths(arena, string);
|
||||
EV_ViewRuleList *all_view_rules = ev_view_rule_list_copy(arena, view_rules);
|
||||
ev_view_rule_list_concat_in_place(all_view_rules, &fastpath_view_rules);
|
||||
tree = ev_block_tree_from_expr(arena, view, filter, string, parse.expr, all_view_rules);
|
||||
tree = ev_block_tree_from_expr(arena, view, filter, string, parse.expr);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
ProfEnd();
|
||||
@@ -1004,7 +809,7 @@ ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num)
|
||||
if(contains_1u64(global_range, num))
|
||||
{
|
||||
U64 relative_num = (num - base_num) + n->v.range.min + 1;
|
||||
U64 child_id = n->v.block->expand_view_rule_info->expr_expand_id_from_num(relative_num, n->v.block->expand_view_rule_info_user_data);
|
||||
U64 child_id = n->v.block->lookup_rule->id_from_num(relative_num, n->v.block->lookup_rule_user_data);
|
||||
EV_Key block_key = n->v.block->key;
|
||||
key = ev_key_make(ev_hash_from_key(block_key), child_id);
|
||||
break;
|
||||
@@ -1024,7 +829,7 @@ ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key)
|
||||
U64 hash = ev_hash_from_key(n->v.block->key);
|
||||
if(hash == key.parent_hash)
|
||||
{
|
||||
U64 relative_num = n->v.block->expand_view_rule_info->expr_expand_num_from_id(key.child_id, n->v.block->expand_view_rule_info_user_data);
|
||||
U64 relative_num = n->v.block->lookup_rule->num_from_id(key.child_id, n->v.block->lookup_rule_user_data);
|
||||
Rng1U64 num_range = r1u64(n->v.range.min, n->v.block->single_item ? (n->v.range.min+1) : n->v.range.max);
|
||||
if(contains_1u64(num_range, relative_num-1))
|
||||
{
|
||||
@@ -1141,25 +946,18 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
|
||||
if(block_relative_range__windowed.max > block_relative_range__windowed.min)
|
||||
{
|
||||
// rjf: get info about expansion range
|
||||
EV_ExpandRangeInfo expand_range_info = n->v.block->expand_view_rule_info->expr_expand_range_info(arena, view, filter, n->v.block->expr, n->v.block->expand_view_rule_params, block_relative_range__windowed, n->v.block->expand_view_rule_info_user_data);
|
||||
U64 range_exprs_count = dim_1u64(block_relative_range__windowed);
|
||||
E_Expr **range_exprs = push_array(arena, E_Expr *, range_exprs_count);
|
||||
String8 *range_exprs_strings = push_array(arena, String8 ,range_exprs_count);
|
||||
for EachIndex(idx, range_exprs_count)
|
||||
{
|
||||
range_exprs[idx] = &e_expr_nil;
|
||||
}
|
||||
n->v.block->lookup_rule->range(arena, n->v.block->expr, block_relative_range__windowed, range_exprs, range_exprs_strings, n->v.block->lookup_rule_user_data);
|
||||
|
||||
// rjf: no expansion operator applied -> push row for block expression; pass through block info
|
||||
if(expand_range_info.row_exprs_count == 0)
|
||||
if(range_exprs_count == 0)
|
||||
{
|
||||
E_Member *member = &e_member_nil;
|
||||
if(n->v.block->expr->kind == E_ExprKind_MemberAccess)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, n->v.block->expr->first);
|
||||
E_TypeKey lhs_type_key = lhs_irtree.type_key;
|
||||
E_Member expr_member = e_type_member_from_key_name__cached(lhs_type_key, n->v.block->expr->last->string);
|
||||
if(expr_member.kind != E_MemberKind_Null)
|
||||
{
|
||||
member = push_array(arena, E_Member, 1);
|
||||
MemoryCopyStruct(member, &expr_member);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);
|
||||
SLLQueuePush(rows.first, rows.last, row_node);
|
||||
rows.count += 1;
|
||||
@@ -1171,67 +969,24 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
|
||||
row->visual_size = n->v.block->single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1;
|
||||
row->string = n->v.block->string;
|
||||
row->expr = n->v.block->expr;
|
||||
row->member = member;
|
||||
row->view_rules = n->v.block->view_rules;
|
||||
}
|
||||
|
||||
// rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range
|
||||
else
|
||||
else for EachIndex(idx, range_exprs_count)
|
||||
{
|
||||
for EachIndex(idx, expand_range_info.row_exprs_count)
|
||||
{
|
||||
U64 child_num = block_relative_range.min + num_skipped + idx + 1;
|
||||
U64 child_id = n->v.block->expand_view_rule_info->expr_expand_id_from_num(child_num, n->v.block->expand_view_rule_info_user_data);
|
||||
EV_Key row_key = ev_key_make(ev_hash_from_key(n->v.block->key), child_id);
|
||||
E_Expr *row_expr = expand_range_info.row_exprs[idx];
|
||||
EV_ViewRuleList *row_view_rules = ev_view_rule_list_from_inheritance(arena, n->v.block->view_rules);
|
||||
String8 row_view_rule_string = ev_view_rule_from_key(view, row_key);
|
||||
ev_view_rule_list_push_string(arena, row_view_rules, row_view_rule_string);
|
||||
if(expand_range_info.row_strings[idx].size != 0)
|
||||
{
|
||||
EV_ViewRuleList *fastpath_view_rules = ev_view_rule_list_from_expr_fastpaths(arena, expand_range_info.row_strings[idx]);
|
||||
ev_view_rule_list_concat_in_place(row_view_rules, &fastpath_view_rules);
|
||||
}
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_IRTreeAndType row_irtree = e_irtree_and_type_from_expr(scratch.arena, row_expr);
|
||||
EV_ViewRuleList *row_auto_view_rules = ev_auto_view_rules_from_type_key(arena, row_irtree.type_key, 1, row_view_rule_string.size == 0);
|
||||
ev_view_rule_list_concat_in_place(row_view_rules, &row_auto_view_rules);
|
||||
scratch_end(scratch);
|
||||
}
|
||||
E_Expr *row_expr__resolved = ev_resolved_from_expr(arena, row_expr, row_view_rules);
|
||||
EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);
|
||||
SLLQueuePush(rows.first, rows.last, row_node);
|
||||
rows.count += 1;
|
||||
EV_Row *row = &row_node->row;
|
||||
row->block = n->v.block;
|
||||
row->key = row_key;
|
||||
row->visual_size = 1;
|
||||
row->string = expand_range_info.row_strings[idx];
|
||||
row->expr = row_expr__resolved;
|
||||
row->member = expand_range_info.row_members[idx];
|
||||
row->view_rules = row_view_rules;
|
||||
if(row->member == &e_member_nil || row->member == 0)
|
||||
{
|
||||
if(row->expr->kind == E_ExprKind_MemberAccess)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr->first);
|
||||
E_TypeKey lhs_type_key = lhs_irtree.type_key;
|
||||
E_Member expr_member = e_type_member_from_key_name__cached(lhs_type_key, row->expr->last->string);
|
||||
if(expr_member.kind != E_MemberKind_Null)
|
||||
{
|
||||
row->member = push_array(arena, E_Member, 1);
|
||||
MemoryCopyStruct(row->member, &expr_member);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
}
|
||||
if(expand_range_info.row_view_rules[idx].size != 0)
|
||||
{
|
||||
ev_key_set_view_rule(view, row->key, expand_range_info.row_view_rules[idx]);
|
||||
}
|
||||
}
|
||||
U64 child_num = block_relative_range.min + num_skipped + idx + 1;
|
||||
U64 child_id = n->v.block->lookup_rule->id_from_num(child_num, n->v.block->lookup_rule_user_data);
|
||||
EV_Key row_key = ev_key_make(ev_hash_from_key(n->v.block->key), child_id);
|
||||
E_Expr *row_expr = range_exprs[idx];
|
||||
EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);
|
||||
SLLQueuePush(rows.first, rows.last, row_node);
|
||||
rows.count += 1;
|
||||
EV_Row *row = &row_node->row;
|
||||
row->block = n->v.block;
|
||||
row->key = row_key;
|
||||
row->visual_size = 1;
|
||||
row->string = range_exprs_strings[idx];
|
||||
row->expr = row_expr;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1298,14 +1053,7 @@ ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags)
|
||||
}break;
|
||||
case E_ExprKind_MemberAccess:
|
||||
{
|
||||
if(flags & EV_StringFlag_PrettyNames && row->member->pretty_name.size != 0)
|
||||
{
|
||||
result = push_str8_copy(arena, row->member->pretty_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = push_str8f(arena, ".%S", e_string_from_expr(arena, notable_expr->last));
|
||||
}
|
||||
result = push_str8f(arena, ".%S", e_string_from_expr(arena, notable_expr->last));
|
||||
}break;
|
||||
}
|
||||
return result;
|
||||
@@ -1319,9 +1067,9 @@ ev_row_is_expandable(EV_Row *row)
|
||||
// rjf: determine if view rules force expandability
|
||||
if(!result)
|
||||
{
|
||||
for(EV_ViewRuleNode *n = row->view_rules->first; n != 0; n = n->next)
|
||||
for(E_Expr *tag = row->expr->first_tag; tag != &e_expr_nil; tag = tag->next)
|
||||
{
|
||||
EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string);
|
||||
EV_ViewRuleInfo *info = ev_view_rule_info_from_string(tag->first->string);
|
||||
if(info->flags & EV_ViewRuleInfoFlag_Expandable)
|
||||
{
|
||||
result = 1;
|
||||
|
||||
@@ -74,30 +74,6 @@ struct EV_View
|
||||
EV_KeyViewRuleNode *free_key_view_rule_node;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: View Rule Instance Types
|
||||
|
||||
typedef struct EV_ViewRule EV_ViewRule;
|
||||
struct EV_ViewRule
|
||||
{
|
||||
MD_Node *root;
|
||||
};
|
||||
|
||||
typedef struct EV_ViewRuleNode EV_ViewRuleNode;
|
||||
struct EV_ViewRuleNode
|
||||
{
|
||||
EV_ViewRuleNode *next;
|
||||
EV_ViewRule v;
|
||||
};
|
||||
|
||||
typedef struct EV_ViewRuleList EV_ViewRuleList;
|
||||
struct EV_ViewRuleList
|
||||
{
|
||||
EV_ViewRuleNode *first;
|
||||
EV_ViewRuleNode *last;
|
||||
U64 count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: View Rule Info Types
|
||||
|
||||
@@ -111,36 +87,10 @@ struct EV_ExpandInfo
|
||||
B32 rows_default_expanded;
|
||||
};
|
||||
|
||||
typedef struct EV_ExpandRangeInfo EV_ExpandRangeInfo;
|
||||
struct EV_ExpandRangeInfo
|
||||
{
|
||||
U64 row_exprs_count;
|
||||
String8 *row_strings;
|
||||
String8 *row_view_rules;
|
||||
E_Expr **row_exprs;
|
||||
E_Member **row_members;
|
||||
};
|
||||
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params)
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, E_Expr *tag)
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_info__##name
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name))
|
||||
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(name) EV_ExpandRangeInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data)
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_range_info__##name
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name))
|
||||
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(name) U64 name(U64 num, void *user_data)
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(name) ev_view_rule_expr_expand_id_from_num_##name
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(name))
|
||||
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(name) U64 name(U64 id, void *user_data)
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name) ev_view_rule_expr_expand_num_from_id_##name
|
||||
#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name))
|
||||
|
||||
typedef EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandInfoHookFunctionType);
|
||||
typedef EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandRangeInfoHookFunctionType);
|
||||
typedef EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(EV_ViewRuleExprExpandIDFromNumHookFunctionType);
|
||||
typedef EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(EV_ViewRuleExprExpandNumFromIDHookFunctionType);
|
||||
|
||||
typedef U32 EV_ViewRuleInfoFlags; // NOTE(rjf): see @view_rule_info
|
||||
enum
|
||||
@@ -155,9 +105,6 @@ struct EV_ViewRuleInfo
|
||||
String8 string;
|
||||
EV_ViewRuleInfoFlags flags;
|
||||
EV_ViewRuleExprExpandInfoHookFunctionType *expr_expand_info;
|
||||
EV_ViewRuleExprExpandRangeInfoHookFunctionType *expr_expand_range_info;
|
||||
EV_ViewRuleExprExpandIDFromNumHookFunctionType *expr_expand_id_from_num;
|
||||
EV_ViewRuleExprExpandIDFromNumHookFunctionType *expr_expand_num_from_id;
|
||||
};
|
||||
|
||||
typedef struct EV_ViewRuleInfoNode EV_ViewRuleInfoNode;
|
||||
@@ -203,10 +150,12 @@ struct EV_Block
|
||||
// rjf: expression / visualization info
|
||||
String8 string;
|
||||
E_Expr *expr;
|
||||
EV_ViewRuleList *view_rules;
|
||||
EV_ViewRuleInfo *expand_view_rule_info;
|
||||
MD_Node *expand_view_rule_params;
|
||||
void *expand_view_rule_info_user_data;
|
||||
E_Expr *lookup_tag;
|
||||
E_Expr *expand_tag;
|
||||
E_LookupRule *lookup_rule;
|
||||
EV_ViewRuleInfo *expand_rule;
|
||||
void *lookup_rule_user_data;
|
||||
void *expand_rule_user_data;
|
||||
|
||||
// rjf: expansion info
|
||||
U64 row_count;
|
||||
@@ -255,8 +204,6 @@ struct EV_Row
|
||||
U64 visual_size;
|
||||
String8 string;
|
||||
E_Expr *expr;
|
||||
E_Member *member;
|
||||
EV_ViewRuleList *view_rules;
|
||||
};
|
||||
|
||||
typedef struct EV_WindowedRowNode EV_WindowedRowNode;
|
||||
@@ -324,9 +271,6 @@ enum
|
||||
//~ rjf: Nil/Identity View Rule Hooks
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(nil);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Globals
|
||||
@@ -336,14 +280,10 @@ global read_only EV_ViewRuleInfo ev_nil_view_rule_info =
|
||||
{0},
|
||||
0,
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil),
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil),
|
||||
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity),
|
||||
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity),
|
||||
};
|
||||
thread_static EV_ViewRuleInfoTable *ev_view_rule_info_table = 0;
|
||||
global read_only EV_ViewRuleList ev_nil_view_rule_list = {0};
|
||||
thread_static EV_AutoViewRuleTable *ev_auto_view_rule_table = 0;
|
||||
global read_only EV_Block ev_nil_block = {&ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, {0}, 0, {0}, &e_expr_nil, &ev_nil_view_rule_list, &ev_nil_view_rule_info};
|
||||
global read_only EV_Block ev_nil_block = {&ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, {0}, 0, {0}, &e_expr_nil, &e_expr_nil, &e_expr_nil, &e_lookup_rule__default, &ev_nil_view_rule_info};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Key Functions
|
||||
@@ -384,34 +324,16 @@ internal void ev_view_rule_info_table_push_builtins(Arena *arena, EV_ViewRuleInf
|
||||
internal void ev_select_view_rule_info_table(EV_ViewRuleInfoTable *table);
|
||||
internal EV_ViewRuleInfo *ev_view_rule_info_from_string(String8 string);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Automatic Type -> View Rule Table Building / Selection / Lookups
|
||||
|
||||
internal void ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule, B32 is_required);
|
||||
internal void ev_select_auto_view_rule_table(EV_AutoViewRuleTable *table);
|
||||
internal EV_ViewRuleList *ev_auto_view_rules_from_type_key(Arena *arena, E_TypeKey type_key, B32 gather_required, B32 gather_optional);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: View Rule Instance List Building
|
||||
|
||||
internal void ev_view_rule_list_push_tree(Arena *arena, EV_ViewRuleList *list, MD_Node *root);
|
||||
internal void ev_view_rule_list_push_string(Arena *arena, EV_ViewRuleList *list, String8 string);
|
||||
internal EV_ViewRuleList *ev_view_rule_list_from_string(Arena *arena, String8 string);
|
||||
internal EV_ViewRuleList *ev_view_rule_list_from_expr_fastpaths(Arena *arena, String8 string);
|
||||
internal EV_ViewRuleList *ev_view_rule_list_from_inheritance(Arena *arena, EV_ViewRuleList *src);
|
||||
internal EV_ViewRuleList *ev_view_rule_list_copy(Arena *arena, EV_ViewRuleList *src);
|
||||
internal void ev_view_rule_list_concat_in_place(EV_ViewRuleList *dst, EV_ViewRuleList **src);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application)
|
||||
|
||||
internal E_Expr *ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules);
|
||||
internal E_Expr *ev_resolved_from_expr(Arena *arena, E_Expr *expr);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Block Building
|
||||
|
||||
internal EV_BlockTree ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules);
|
||||
internal EV_BlockTree ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules);
|
||||
internal EV_BlockTree ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr);
|
||||
internal EV_BlockTree ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string);
|
||||
internal U64 ev_depth_from_block(EV_Block *block);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
@@ -6,20 +6,20 @@
|
||||
C_LINKAGE_BEGIN
|
||||
EV_ViewRuleInfo ev_builtin_view_rule_info_table[14] =
|
||||
{
|
||||
{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("list"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(list) , EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(list) , EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("wrap"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{str8_lit_comp("no_addr"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) },
|
||||
{0},
|
||||
{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("list"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(list) },
|
||||
{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("wrap"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
{str8_lit_comp("no_addr"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), },
|
||||
};
|
||||
|
||||
C_LINKAGE_END
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
typedef enum EV_ViewRuleKind
|
||||
{
|
||||
EV_ViewRuleKind_Default,
|
||||
EV_ViewRuleKind_EV_ViewRuleKind_Null,
|
||||
EV_ViewRuleKind_Array,
|
||||
EV_ViewRuleKind_List,
|
||||
EV_ViewRuleKind_Slice,
|
||||
@@ -25,8 +25,5 @@ EV_ViewRuleKind_NoAddress,
|
||||
EV_ViewRuleKind_COUNT,
|
||||
} EV_ViewRuleKind;
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(list);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(list);
|
||||
#endif // EVAL_VISUALIZATION_META_H
|
||||
|
||||
@@ -719,48 +719,6 @@ str8_lit_comp("5"),
|
||||
str8_lit_comp("c"),
|
||||
};
|
||||
|
||||
String8 rd_collection_name_table[2] =
|
||||
{
|
||||
str8_lit_comp("scheduler_machine"),
|
||||
str8_lit_comp("scheduler_process"),
|
||||
};
|
||||
|
||||
RD_EntityKind rd_collection_entity_kind_table[2] =
|
||||
{
|
||||
RD_EntityKind_Nil,
|
||||
RD_EntityKind_Nil,
|
||||
};
|
||||
|
||||
CTRL_EntityKind rd_collection_ctrl_entity_kind_table[2] =
|
||||
{
|
||||
CTRL_EntityKind_Null,
|
||||
CTRL_EntityKind_Null,
|
||||
};
|
||||
|
||||
EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[2] =
|
||||
{
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(scheduler_machine),
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(scheduler_process),
|
||||
};
|
||||
|
||||
EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[2] =
|
||||
{
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(scheduler_machine),
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(scheduler_process),
|
||||
};
|
||||
|
||||
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[2] =
|
||||
{
|
||||
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(scheduler_machine),
|
||||
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(scheduler_process),
|
||||
};
|
||||
|
||||
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[2] =
|
||||
{
|
||||
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(scheduler_machine),
|
||||
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(scheduler_process),
|
||||
};
|
||||
|
||||
RD_ViewRuleInfo rd_view_rule_kind_info_table[28] =
|
||||
{
|
||||
{{0}, {0}, {0}, {0}, RD_IconKind_Null, 0, EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(null)},
|
||||
|
||||
@@ -651,14 +651,6 @@ RD_ViewRuleUIFunctionType *ui;
|
||||
.params_tree = rd_regs()->params_tree,\
|
||||
.os_event = rd_regs()->os_event,\
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_machine);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_process);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_machine);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_process);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_machine);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_process);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_machine);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_process);
|
||||
RD_VIEW_RULE_UI_FUNCTION_DEF(null);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(text);
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(disasm);
|
||||
@@ -709,13 +701,6 @@ extern RD_StringBindingPair rd_default_binding_table[111];
|
||||
extern String8 rd_binding_version_remap_old_name_table[8];
|
||||
extern String8 rd_binding_version_remap_new_name_table[8];
|
||||
extern String8 rd_icon_kind_text_table[69];
|
||||
extern String8 rd_collection_name_table[2];
|
||||
extern RD_EntityKind rd_collection_entity_kind_table[2];
|
||||
extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[2];
|
||||
extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[2];
|
||||
extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[2];
|
||||
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[2];
|
||||
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[2];
|
||||
extern RD_ViewRuleInfo rd_view_rule_kind_info_table[28];
|
||||
extern RD_IconKind rd_entity_kind_icon_kind_table[27];
|
||||
extern String8 rd_theme_preset_display_string_table[9];
|
||||
|
||||
@@ -1015,82 +1015,6 @@ RD_IconTable:
|
||||
@expand(RD_IconTable a) `str8_lit_comp("$(a.text)")`;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Collections
|
||||
|
||||
@table(name entity_kind ctrl_entity_kind id_space)
|
||||
RD_CollectionTable:
|
||||
{
|
||||
//- rjf: frontend entity groups
|
||||
//{watches Watch Null x}
|
||||
//{targets Target Null x}
|
||||
//{breakpoints Breakpoint Null x}
|
||||
//{watch_pins WatchPin Null x}
|
||||
//{file_path_maps FilePathMap Null x}
|
||||
//{auto_view_rules AutoViewRule Null x}
|
||||
|
||||
//- rjf: control entity groups
|
||||
//{machines Nil Machine x}
|
||||
//{processes Nil Process x}
|
||||
//{threads Nil Thread x}
|
||||
//{modules Nil Module x}
|
||||
|
||||
//- rjf: scheduling control entity hierarchies
|
||||
{scheduler_machine Nil Null x}
|
||||
{scheduler_process Nil Null x}
|
||||
|
||||
//- rjf: debug info / architecture watch tables
|
||||
// {locals Nil Null -}
|
||||
// {registers Nil Null -}
|
||||
// {globals Nil Null x}
|
||||
// {thread_locals Nil Null x}
|
||||
// {types Nil Null x}
|
||||
// {procedures Nil Null x}
|
||||
}
|
||||
|
||||
@gen
|
||||
{
|
||||
@expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF($(a.name));`;
|
||||
@expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF($(a.name));`;
|
||||
@expand(RD_CollectionTable a) `$(a.id_space == x -> "EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF("..a.name..");")`;
|
||||
@expand(RD_CollectionTable a) `$(a.id_space == x -> "EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF("..a.name..");")`;
|
||||
}
|
||||
|
||||
@data(String8) rd_collection_name_table:
|
||||
{
|
||||
@expand(RD_CollectionTable a) `str8_lit_comp("$(a.name)")`
|
||||
}
|
||||
|
||||
@data(RD_EntityKind) rd_collection_entity_kind_table:
|
||||
{
|
||||
@expand(RD_CollectionTable a) `RD_EntityKind_$(a.entity_kind)`,
|
||||
}
|
||||
|
||||
@data(CTRL_EntityKind) rd_collection_ctrl_entity_kind_table:
|
||||
{
|
||||
@expand(RD_CollectionTable a) `CTRL_EntityKind_$(a.ctrl_entity_kind)`,
|
||||
}
|
||||
|
||||
@data(`EV_ViewRuleExprExpandInfoHookFunctionType *`) rd_collection_expr_expand_info_hook_function_table:
|
||||
{
|
||||
@expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME($(a.name))`
|
||||
}
|
||||
|
||||
@data(`EV_ViewRuleExprExpandRangeInfoHookFunctionType *`) rd_collection_expr_expand_range_info_hook_function_table:
|
||||
{
|
||||
@expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME($(a.name))`
|
||||
}
|
||||
|
||||
@data(`EV_ViewRuleExprExpandIDFromNumHookFunctionType *`) rd_collection_expr_expand_id_from_num_hook_function_table:
|
||||
{
|
||||
@expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME($(a.id_space == x -> a.name)$(a.id_space != x -> identity))`
|
||||
}
|
||||
|
||||
@data(`EV_ViewRuleExprExpandIDFromNumHookFunctionType *`) rd_collection_expr_expand_num_from_id_hook_function_table:
|
||||
{
|
||||
@expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME($(a.id_space == x -> a.name)$(a.id_space != x -> identity))`
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: View Rules
|
||||
|
||||
|
||||
+146
-395
@@ -8736,18 +8736,19 @@ rd_window_frame(void)
|
||||
////////////////////////////////
|
||||
//~ rjf: Eval Visualization
|
||||
|
||||
typedef struct RD_EntityExpandAccel RD_EntityExpandAccel;
|
||||
struct RD_EntityExpandAccel
|
||||
{
|
||||
RD_EntityArray entities;
|
||||
};
|
||||
|
||||
typedef struct RD_CtrlEntityExpandAccel RD_CtrlEntityExpandAccel;
|
||||
struct RD_CtrlEntityExpandAccel
|
||||
{
|
||||
CTRL_EntityArray entities;
|
||||
};
|
||||
|
||||
#if 0 // TODO(rjf): @cfg
|
||||
typedef struct RD_EntityExpandAccel RD_EntityExpandAccel;
|
||||
struct RD_EntityExpandAccel
|
||||
{
|
||||
RD_EntityArray entities;
|
||||
};
|
||||
|
||||
//- rjf: control entity hierarchies
|
||||
|
||||
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_machine)
|
||||
@@ -8908,6 +8909,7 @@ EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_process)
|
||||
{
|
||||
return id;
|
||||
}
|
||||
#endif
|
||||
|
||||
//- rjf: debug info tables
|
||||
|
||||
@@ -8942,24 +8944,17 @@ E_LOOKUP_INFO_FUNCTION_DEF(watches)
|
||||
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(watches)
|
||||
{
|
||||
E_LookupRange result = {0};
|
||||
RD_CfgArray *cfgs = (RD_CfgArray *)user_data;
|
||||
Rng1U64 legal_idx_range = r1u64(0, cfgs->count);
|
||||
Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range);
|
||||
U64 read_range_count = dim_1u64(read_range);
|
||||
for(U64 idx = 0; idx < read_range_count; idx += 1)
|
||||
{
|
||||
RD_CfgArray *cfgs = (RD_CfgArray *)user_data;
|
||||
Rng1U64 legal_idx_range = r1u64(0, cfgs->count);
|
||||
Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range);
|
||||
U64 read_range_count = dim_1u64(read_range);
|
||||
result.exprs_count = read_range_count;
|
||||
result.exprs = push_array(arena, E_Expr *, result.exprs_count);
|
||||
result.exprs_strings = push_array(arena, String8, result.exprs_count);
|
||||
for(U64 idx = 0; idx < result.exprs_count; idx += 1)
|
||||
{
|
||||
U64 cfg_idx = read_range.min + idx;
|
||||
String8 expr_string = rd_cfg_child_from_string(cfgs->v[idx], str8_lit("expression"))->first->string;
|
||||
result.exprs[idx] = e_parse_expr_from_text(arena, expr_string);
|
||||
result.exprs_strings[idx] = push_str8_copy(arena, expr_string);
|
||||
}
|
||||
U64 cfg_idx = read_range.min + idx;
|
||||
String8 expr_string = rd_cfg_child_from_string(cfgs->v[idx], str8_lit("expression"))->first->string;
|
||||
exprs[idx] = e_parse_expr_from_text(arena, expr_string);
|
||||
exprs_strings[idx] = push_str8_copy(arena, expr_string);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
E_LOOKUP_INFO_FUNCTION_DEF(locals)
|
||||
@@ -8990,23 +8985,16 @@ E_LOOKUP_INFO_FUNCTION_DEF(locals)
|
||||
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(locals)
|
||||
{
|
||||
E_LookupRange result = {0};
|
||||
String8Array *accel = (String8Array *)user_data;
|
||||
Rng1U64 legal_idx_range = r1u64(0, accel->count);
|
||||
Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range);
|
||||
U64 read_range_count = dim_1u64(read_range);
|
||||
for(U64 idx = 0; idx < read_range_count; idx += 1)
|
||||
{
|
||||
String8Array *accel = (String8Array *)user_data;
|
||||
Rng1U64 legal_idx_range = r1u64(0, accel->count);
|
||||
Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range);
|
||||
U64 read_range_count = dim_1u64(read_range);
|
||||
result.exprs_count = read_range_count;
|
||||
result.exprs = push_array(arena, E_Expr *, result.exprs_count);
|
||||
result.exprs_strings = push_array(arena, String8, result.exprs_count);
|
||||
for(U64 idx = 0; idx < result.exprs_count; idx += 1)
|
||||
{
|
||||
String8 expr_string = accel->v[read_range.min + idx];
|
||||
result.exprs[idx] = e_parse_expr_from_text(arena, expr_string);
|
||||
result.exprs_strings[idx] = push_str8_copy(arena, expr_string);
|
||||
}
|
||||
String8 expr_string = accel->v[read_range.min + idx];
|
||||
exprs[idx] = e_parse_expr_from_text(arena, expr_string);
|
||||
exprs_strings[idx] = push_str8_copy(arena, expr_string);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
E_LOOKUP_INFO_FUNCTION_DEF(registers)
|
||||
@@ -9045,22 +9033,16 @@ E_LOOKUP_INFO_FUNCTION_DEF(registers)
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(registers)
|
||||
{
|
||||
String8Array *accel = (String8Array *)user_data;
|
||||
E_LookupRange result = {0};
|
||||
Rng1U64 legal_idx_range = r1u64(0, accel->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)
|
||||
{
|
||||
Rng1U64 legal_idx_range = r1u64(0, accel->count);
|
||||
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
|
||||
result.exprs_count = dim_1u64(read_range);
|
||||
result.exprs = push_array(arena, E_Expr *, result.exprs_count);
|
||||
result.exprs_strings = push_array(arena, String8, result.exprs_count);
|
||||
for(U64 idx = 0; idx < result.exprs_count; idx += 1)
|
||||
{
|
||||
String8 register_name = accel->v[read_range.min + idx];
|
||||
String8 register_expr = push_str8f(arena, "reg:%S", register_name);
|
||||
result.exprs_strings[idx] = register_name;
|
||||
result.exprs[idx] = e_parse_expr_from_text(arena, register_expr);
|
||||
}
|
||||
String8 register_name = accel->v[read_range.min + idx];
|
||||
String8 register_expr = push_str8f(arena, "reg:%S", register_name);
|
||||
exprs_strings[idx] = register_name;
|
||||
exprs[idx] = e_parse_expr_from_text(arena, register_expr);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg)
|
||||
@@ -9241,101 +9223,94 @@ E_LOOKUP_INFO_FUNCTION_DEF(debug_info_table)
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table)
|
||||
{
|
||||
RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data;
|
||||
E_LookupRange result = {0};
|
||||
U64 needed_row_count = dim_1u64(idx_range);
|
||||
for EachIndex(idx, needed_row_count)
|
||||
{
|
||||
U64 needed_row_count = dim_1u64(idx_range);
|
||||
result.exprs_count = Min(needed_row_count, accel->items.count);
|
||||
result.exprs = push_array(arena, E_Expr *, result.exprs_count);
|
||||
result.exprs_strings = push_array(arena, String8, result.exprs_count);
|
||||
for EachIndex(idx, result.exprs_count)
|
||||
// rjf: unpack row
|
||||
DI_SearchItem *item = &accel->items.v[idx_range.min + idx];
|
||||
|
||||
// rjf: skip bad elements
|
||||
if(item->dbgi_idx >= accel->rdis_count)
|
||||
{
|
||||
// rjf: unpack row
|
||||
DI_SearchItem *item = &accel->items.v[idx_range.min + idx];
|
||||
|
||||
// rjf: skip bad elements
|
||||
if(item->dbgi_idx >= accel->rdis_count)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// rjf: unpack row info
|
||||
RDI_Parsed *rdi = accel->rdis[item->dbgi_idx];
|
||||
E_Module *module = &e_parse_ctx->modules[item->dbgi_idx];
|
||||
|
||||
// rjf: build expr
|
||||
E_Expr *item_expr = &e_expr_nil;
|
||||
{
|
||||
U64 element_idx = item->idx;
|
||||
switch(accel->section)
|
||||
{
|
||||
default:{}break;
|
||||
case RDI_SectionKind_Procedures:
|
||||
{
|
||||
RDI_Procedure *procedure = rdi_element_from_name_idx(module->rdi, Procedures, element_idx);
|
||||
RDI_Scope *scope = rdi_element_from_name_idx(module->rdi, Scopes, procedure->root_scope_idx);
|
||||
U64 voff = *rdi_element_from_name_idx(module->rdi, ScopeVOffData, scope->voff_range_first);
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff));
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = procedure->type_idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
|
||||
item_expr->mode = E_Mode_Value;
|
||||
item_expr->space = module->space;
|
||||
item_expr->type_key = type_key;
|
||||
item_expr->bytecode = bytecode;
|
||||
item_expr->string.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &item_expr->string.size);
|
||||
}break;
|
||||
case RDI_SectionKind_GlobalVariables:
|
||||
{
|
||||
RDI_GlobalVariable *gvar = rdi_element_from_name_idx(module->rdi, GlobalVariables, element_idx);
|
||||
U64 voff = gvar->voff;
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff));
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = gvar->type_idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
|
||||
item_expr->mode = E_Mode_Offset;
|
||||
item_expr->space = module->space;
|
||||
item_expr->type_key = type_key;
|
||||
item_expr->bytecode = bytecode;
|
||||
item_expr->string.str = rdi_string_from_idx(module->rdi, gvar->name_string_idx, &item_expr->string.size);
|
||||
}break;
|
||||
case RDI_SectionKind_ThreadVariables:
|
||||
{
|
||||
RDI_ThreadVariable *tvar = rdi_element_from_name_idx(module->rdi, ThreadVariables, element_idx);
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(tvar->tls_off));
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = tvar->type_idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
|
||||
item_expr->mode = E_Mode_Offset;
|
||||
item_expr->space = module->space;
|
||||
item_expr->type_key = type_key;
|
||||
item_expr->bytecode = bytecode;
|
||||
item_expr->string.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &item_expr->string.size);
|
||||
}break;
|
||||
case RDI_SectionKind_UDTs:
|
||||
{
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx);
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0);
|
||||
item_expr->type_key = type_key;
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: fill
|
||||
result.exprs[idx] = item_expr;
|
||||
continue;
|
||||
}
|
||||
|
||||
// rjf: unpack row info
|
||||
RDI_Parsed *rdi = accel->rdis[item->dbgi_idx];
|
||||
E_Module *module = &e_parse_ctx->modules[item->dbgi_idx];
|
||||
|
||||
// rjf: build expr
|
||||
E_Expr *item_expr = &e_expr_nil;
|
||||
{
|
||||
U64 element_idx = item->idx;
|
||||
switch(accel->section)
|
||||
{
|
||||
default:{}break;
|
||||
case RDI_SectionKind_Procedures:
|
||||
{
|
||||
RDI_Procedure *procedure = rdi_element_from_name_idx(module->rdi, Procedures, element_idx);
|
||||
RDI_Scope *scope = rdi_element_from_name_idx(module->rdi, Scopes, procedure->root_scope_idx);
|
||||
U64 voff = *rdi_element_from_name_idx(module->rdi, ScopeVOffData, scope->voff_range_first);
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff));
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = procedure->type_idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
|
||||
item_expr->mode = E_Mode_Value;
|
||||
item_expr->space = module->space;
|
||||
item_expr->type_key = type_key;
|
||||
item_expr->bytecode = bytecode;
|
||||
item_expr->string.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &item_expr->string.size);
|
||||
}break;
|
||||
case RDI_SectionKind_GlobalVariables:
|
||||
{
|
||||
RDI_GlobalVariable *gvar = rdi_element_from_name_idx(module->rdi, GlobalVariables, element_idx);
|
||||
U64 voff = gvar->voff;
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff));
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = gvar->type_idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
|
||||
item_expr->mode = E_Mode_Offset;
|
||||
item_expr->space = module->space;
|
||||
item_expr->type_key = type_key;
|
||||
item_expr->bytecode = bytecode;
|
||||
item_expr->string.str = rdi_string_from_idx(module->rdi, gvar->name_string_idx, &item_expr->string.size);
|
||||
}break;
|
||||
case RDI_SectionKind_ThreadVariables:
|
||||
{
|
||||
RDI_ThreadVariable *tvar = rdi_element_from_name_idx(module->rdi, ThreadVariables, element_idx);
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(tvar->tls_off));
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = tvar->type_idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
|
||||
item_expr->mode = E_Mode_Offset;
|
||||
item_expr->space = module->space;
|
||||
item_expr->type_key = type_key;
|
||||
item_expr->bytecode = bytecode;
|
||||
item_expr->string.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &item_expr->string.size);
|
||||
}break;
|
||||
case RDI_SectionKind_UDTs:
|
||||
{
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx);
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0);
|
||||
item_expr->type_key = type_key;
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: fill
|
||||
exprs[idx] = item_expr;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(debug_info_table)
|
||||
@@ -9356,174 +9331,8 @@ E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(debug_info_table)
|
||||
return num;
|
||||
}
|
||||
|
||||
internal EV_ExpandInfo
|
||||
rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind)
|
||||
{
|
||||
RD_EntityExpandAccel *accel = push_array(arena, RD_EntityExpandAccel, 1);
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
{
|
||||
RD_EntityList entities = rd_query_cached_entity_list_with_kind(kind);
|
||||
RD_EntityList entities_filtered = {0};
|
||||
for(RD_EntityNode *n = entities.first; n != 0; n = n->next)
|
||||
{
|
||||
RD_Entity *entity = n->entity;
|
||||
String8 entity_expr_string = entity->string;
|
||||
B32 is_collection = 0;
|
||||
for EachElement(idx, rd_collection_name_table)
|
||||
{
|
||||
if(str8_match(entity_expr_string, rd_collection_name_table[idx], 0))
|
||||
{
|
||||
is_collection = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
B32 is_in_filter = 1;
|
||||
if(!is_collection && filter.size != 0)
|
||||
{
|
||||
RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location);
|
||||
RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable);
|
||||
RD_Entity *args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments);
|
||||
FuzzyMatchRangeList expr_matches = fuzzy_match_find(scratch.arena, filter, entity_expr_string);
|
||||
FuzzyMatchRangeList loc_matches = fuzzy_match_find(scratch.arena, filter, loc->string);
|
||||
FuzzyMatchRangeList exe_matches = fuzzy_match_find(scratch.arena, filter, exe->string);
|
||||
FuzzyMatchRangeList args_matches = fuzzy_match_find(scratch.arena, filter, args->string);
|
||||
is_in_filter = (expr_matches.count == expr_matches.needle_part_count ||
|
||||
loc_matches.count == loc_matches.needle_part_count ||
|
||||
exe_matches.count == exe_matches.needle_part_count ||
|
||||
args_matches.count == args_matches.needle_part_count);
|
||||
}
|
||||
if(is_collection || is_in_filter)
|
||||
{
|
||||
rd_entity_list_push(scratch.arena, &entities_filtered, entity);
|
||||
}
|
||||
}
|
||||
accel->entities = rd_entity_array_from_list(arena, &entities_filtered);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
EV_ExpandInfo info = {accel, accel->entities.count + 1};
|
||||
info.add_new_row = 1;
|
||||
return info;
|
||||
}
|
||||
|
||||
internal EV_ExpandRangeInfo
|
||||
rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind, B32 add_new_at_top)
|
||||
{
|
||||
RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data;
|
||||
EV_ExpandRangeInfo result = {0};
|
||||
{
|
||||
U64 entities_base_idx = (U64)!!add_new_at_top;
|
||||
U64 needed_row_count = dim_1u64(idx_range);
|
||||
result.row_exprs_count = Min(needed_row_count, accel->entities.count+1);
|
||||
result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count);
|
||||
result.row_strings = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_view_rules = push_array(arena, String8, result.row_exprs_count);
|
||||
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
|
||||
for EachIndex(row_expr_idx, result.row_exprs_count)
|
||||
{
|
||||
U64 child_idx = idx_range.min + row_expr_idx;
|
||||
RD_Entity *entity = &rd_nil_entity;
|
||||
if(entities_base_idx <= child_idx && child_idx < entities_base_idx+accel->entities.count)
|
||||
{
|
||||
entity = accel->entities.v[child_idx-entities_base_idx];
|
||||
}
|
||||
if(!rd_entity_is_nil(entity))
|
||||
{
|
||||
String8 entity_expr_string = (kind == RD_EntityKind_Watch ? entity->string : push_str8f(arena, "entity:$%I64u", entity->id));
|
||||
if(kind == RD_EntityKind_Watch)
|
||||
{
|
||||
result.row_strings[row_expr_idx] = entity_expr_string;
|
||||
}
|
||||
result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string);
|
||||
result.row_view_rules[row_expr_idx] = rd_entity_child_from_kind(entity, RD_EntityKind_ViewRule)->string;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.row_exprs[row_expr_idx] = &e_expr_nil;
|
||||
}
|
||||
result.row_members[row_expr_idx] = &e_member_nil;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal U64
|
||||
rd_ev_view_rule_expr_id_from_num__meta_entities(U64 num, void *user_data, RD_EntityKind kind, B32 add_new_at_top)
|
||||
{
|
||||
U64 id = 0;
|
||||
RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data;
|
||||
U64 entities_base_idx = (U64)!!add_new_at_top;
|
||||
if(entities_base_idx+1 <= num && num < entities_base_idx+accel->entities.count+1)
|
||||
{
|
||||
id = accel->entities.v[num-(entities_base_idx+1)]->id;
|
||||
}
|
||||
else
|
||||
{
|
||||
id = max_U64;
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
internal U64
|
||||
rd_ev_view_rule_expr_num_from_id__meta_entities(U64 id, void *user_data, RD_EntityKind kind, B32 add_new_at_top)
|
||||
{
|
||||
RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data;
|
||||
U64 num = 0;
|
||||
U64 entities_base_idx = (U64)!!add_new_at_top;
|
||||
if(id == max_U64)
|
||||
{
|
||||
num = add_new_at_top ? 1 : (entities_base_idx + accel->entities.count + 1);
|
||||
}
|
||||
else for(U64 idx = 0; idx < accel->entities.count; idx += 1)
|
||||
{
|
||||
if(accel->entities.v[idx]->id == id)
|
||||
{
|
||||
num = entities_base_idx+idx+1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
internal EV_ExpandInfo
|
||||
rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind)
|
||||
{
|
||||
RD_CtrlEntityExpandAccel *accel = push_array(arena, RD_CtrlEntityExpandAccel, 1);
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
{
|
||||
CTRL_EntityList entities = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind);
|
||||
CTRL_EntityList entities_filtered = {0};
|
||||
for(CTRL_EntityNode *n = entities.first; n != 0; n = n->next)
|
||||
{
|
||||
CTRL_Entity *entity = n->v;
|
||||
B32 is_in_filter = 1;
|
||||
if(filter.size != 0)
|
||||
{
|
||||
is_in_filter = 0;
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity->string);
|
||||
if(matches.count == matches.needle_part_count)
|
||||
{
|
||||
is_in_filter = 1;
|
||||
}
|
||||
}
|
||||
if(is_in_filter)
|
||||
{
|
||||
ctrl_entity_list_push(scratch.arena, &entities_filtered, entity);
|
||||
}
|
||||
}
|
||||
accel->entities = ctrl_entity_array_from_list(arena, &entities_filtered);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
EV_ExpandInfo info = {accel, accel->entities.count};
|
||||
// TODO(rjf): @hack
|
||||
if(kind == CTRL_EntityKind_Machine)
|
||||
{
|
||||
info.rows_default_expanded = 1;
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
internal F32
|
||||
rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out)
|
||||
rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, String8List *out)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
@@ -9535,22 +9344,22 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
B32 no_addr = 0;
|
||||
B32 no_string = 0;
|
||||
B32 has_array = 0;
|
||||
for(EV_ViewRuleNode *n = view_rules->first; n != 0; n = n->next)
|
||||
for(E_Expr *tag = eval.expr->first_tag; tag != &e_expr_nil; tag = tag->next)
|
||||
{
|
||||
if(0){}
|
||||
else if(str8_match(n->v.root->string, str8_lit("dec"), 0)) {radix = 10;}
|
||||
else if(str8_match(n->v.root->string, str8_lit("hex"), 0)) {radix = 16;}
|
||||
else if(str8_match(n->v.root->string, str8_lit("bin"), 0)) {radix = 2; }
|
||||
else if(str8_match(n->v.root->string, str8_lit("oct"), 0)) {radix = 8; }
|
||||
else if(str8_match(n->v.root->string, str8_lit("no_addr"), 0)) {no_addr = 1;}
|
||||
else if(str8_match(n->v.root->string, str8_lit("no_string"), 0)) {no_string = 1;}
|
||||
else if(str8_match(n->v.root->string, str8_lit("array"), 0)) {has_array = 1;}
|
||||
else if(str8_match(n->v.root->string, str8_lit("digits"), 0))
|
||||
else if(str8_match(tag->string, str8_lit("dec"), 0)) {radix = 10;}
|
||||
else if(str8_match(tag->string, str8_lit("hex"), 0)) {radix = 16;}
|
||||
else if(str8_match(tag->string, str8_lit("bin"), 0)) {radix = 2; }
|
||||
else if(str8_match(tag->string, str8_lit("oct"), 0)) {radix = 8; }
|
||||
else if(str8_match(tag->string, str8_lit("no_addr"), 0)) {no_addr = 1;}
|
||||
else if(str8_match(tag->string, str8_lit("no_string"), 0)) {no_string = 1;}
|
||||
else if(str8_match(tag->first->string, str8_lit("array"), 0)) {has_array = 1;}
|
||||
else if(str8_match(tag->first->string, str8_lit("digits"), 0))
|
||||
{
|
||||
String8 expr = md_string_from_children(scratch.arena, n->v.root);
|
||||
E_Eval eval = e_eval_from_string(scratch.arena, expr);
|
||||
E_Eval value_eval = e_value_eval_from_eval(eval);
|
||||
min_digits = (U32)value_eval.value.u64;
|
||||
E_Expr *num_expr = tag->first->next;
|
||||
E_Eval num_eval = e_eval_from_expr(scratch.arena, num_expr);
|
||||
E_Eval num_value_eval = e_value_eval_from_eval(num_eval);
|
||||
min_digits = (U32)num_value_eval.value.u64;
|
||||
}
|
||||
}
|
||||
if(eval.space.kind == RD_EvalSpaceKind_MetaEntity ||
|
||||
@@ -9718,7 +9527,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
{
|
||||
E_Expr *deref_expr = e_expr_ref_deref(scratch.arena, eval.expr);
|
||||
E_Eval deref_eval = e_eval_from_expr(scratch.arena, deref_expr);
|
||||
space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, deref_eval, 0, view_rules, out);
|
||||
space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, deref_eval, out);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -9745,7 +9554,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
|
||||
// rjf: special case: push strings for textual string content
|
||||
B32 did_content = 0;
|
||||
if(!did_content && array_is_string && !no_string && (member == 0 || member->kind != E_MemberKind_Padding))
|
||||
if(!did_content && array_is_string && !no_string)
|
||||
{
|
||||
U64 element_size = e_type_byte_size_from_key(direct_type_key);
|
||||
did_content = 1;
|
||||
@@ -9804,7 +9613,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
{
|
||||
E_Expr *element_expr = e_expr_ref_array_index(scratch.arena, eval.expr, idx);
|
||||
E_Eval element_eval = e_eval_from_expr(scratch.arena, element_expr);
|
||||
space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, element_eval, 0, view_rules, out);
|
||||
space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, element_eval, out);
|
||||
if(idx+1 < array_count)
|
||||
{
|
||||
String8 comma = str8_lit(", ");
|
||||
@@ -9858,9 +9667,9 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
{
|
||||
E_Member *mem = &data_members.v[member_idx];
|
||||
E_Expr *dot_expr = e_expr_ref_member_access(scratch.arena, eval.expr, mem->name);
|
||||
E_Expr *dot_expr_resolved = ev_resolved_from_expr(scratch.arena, dot_expr, view_rules);
|
||||
E_Expr *dot_expr_resolved = ev_resolved_from_expr(scratch.arena, dot_expr);
|
||||
E_Eval dot_eval = e_eval_from_expr(scratch.arena, dot_expr_resolved);
|
||||
space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, dot_eval, 0, view_rules, out);
|
||||
space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, dot_eval, out);
|
||||
if(member_idx+1 < data_members.count)
|
||||
{
|
||||
String8 comma = str8_lit(", ");
|
||||
@@ -9897,11 +9706,11 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
}
|
||||
|
||||
internal String8
|
||||
rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules)
|
||||
rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
String8List strs = {0};
|
||||
rd_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval, member, view_rules, &strs);
|
||||
rd_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval, &strs);
|
||||
String8 result = str8_list_join(arena, &strs, 0);
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
@@ -13043,15 +12852,6 @@ rd_frame(void)
|
||||
}
|
||||
e_select_parse_ctx(parse_ctx);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: create names/type-info for debugger collections
|
||||
//
|
||||
E_TypeKey collection_type_keys[ArrayCount(rd_collection_name_table)] = {0};
|
||||
for EachElement(idx, rd_collection_name_table)
|
||||
{
|
||||
collection_type_keys[idx] = e_type_key_cons(.kind = E_TypeKind_Array, .name = rd_collection_name_table[idx]);
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build eval IR context
|
||||
//
|
||||
@@ -13064,19 +12864,6 @@ rd_frame(void)
|
||||
ctx->lookup_rule_map = push_array(scratch.arena, E_LookupRuleMap, 1);
|
||||
ctx->lookup_rule_map[0] = e_lookup_rule_map_make(scratch.arena, 512);
|
||||
|
||||
//- rjf: add macros for collections
|
||||
#if 0 // TODO(rjf): @cfg
|
||||
{
|
||||
for EachElement(idx, rd_collection_name_table)
|
||||
{
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->mode = E_Mode_Null;
|
||||
expr->type_key = collection_type_keys[idx];
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, rd_collection_name_table[idx], expr);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//- rjf: choose set of evallable meta names
|
||||
String8 evallable_meta_names[] =
|
||||
{
|
||||
@@ -13107,10 +12894,10 @@ rd_frame(void)
|
||||
bool_type_key = e_type_key_basic(E_TypeKind_Bool);
|
||||
u64_type_key = e_type_key_basic(E_TypeKind_U64);
|
||||
vaddr_range_type_key = e_type_key_cons(E_TypeKind_Struct, .name = str8_lit("vaddr_range"), .count = vaddr_range_members.count, .members = vaddr_range_members.v);
|
||||
code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsCodeText);
|
||||
path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPathText);
|
||||
string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText);
|
||||
location_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText|E_TypeFlag_IsCodeText|E_TypeFlag_IsPathText);
|
||||
code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsCodeText);
|
||||
path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPathText);
|
||||
string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPlainText);
|
||||
location_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPlainText|E_TypeFlag_IsCodeText|E_TypeFlag_IsPathText);
|
||||
}
|
||||
|
||||
//- rjf: build types for each evallable meta name
|
||||
@@ -13380,52 +13167,16 @@ rd_frame(void)
|
||||
EV_ViewRuleInfoTable *view_rule_info_table = push_array(scratch.arena, EV_ViewRuleInfoTable, 1);
|
||||
{
|
||||
ev_view_rule_info_table_push_builtins(scratch.arena, view_rule_info_table);
|
||||
|
||||
// rjf: collection view rules
|
||||
for EachElement(idx, rd_collection_name_table)
|
||||
{
|
||||
EV_ViewRuleInfo info = {0};
|
||||
info.string = rd_collection_name_table[idx];
|
||||
info.flags = EV_ViewRuleInfoFlag_Expandable;
|
||||
info.expr_expand_info = rd_collection_expr_expand_info_hook_function_table[idx];
|
||||
info.expr_expand_range_info = rd_collection_expr_expand_range_info_hook_function_table[idx];
|
||||
info.expr_expand_id_from_num = rd_collection_expr_expand_id_from_num_hook_function_table[idx];
|
||||
info.expr_expand_num_from_id = rd_collection_expr_expand_num_from_id_hook_function_table[idx];
|
||||
ev_view_rule_info_table_push(scratch.arena, view_rule_info_table, &info);
|
||||
}
|
||||
|
||||
// rjf: visualizer view rules
|
||||
for EachEnumVal(RD_ViewRuleKind, k)
|
||||
{
|
||||
RD_ViewRuleInfo *src_info = &rd_view_rule_kind_info_table[k];
|
||||
if(src_info->flags & RD_ViewRuleInfoFlag_CanUseInWatchTable)
|
||||
{
|
||||
EV_ViewRuleInfo dst_info = {0};
|
||||
dst_info.string = src_info->string;
|
||||
dst_info.flags = src_info->flags & RD_ViewRuleInfoFlag_CanExpand ? EV_ViewRuleInfoFlag_Expandable : 0;
|
||||
dst_info.expr_expand_info = src_info->expr_expand_info;
|
||||
dst_info.expr_expand_range_info = EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil);
|
||||
dst_info.expr_expand_id_from_num = EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity);
|
||||
dst_info.expr_expand_num_from_id = EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity);
|
||||
ev_view_rule_info_table_push(scratch.arena, view_rule_info_table, &dst_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
ev_select_view_rule_info_table(view_rule_info_table);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build eval visualization auto-view-rule table
|
||||
//
|
||||
// TODO(rjf): @cfg
|
||||
//
|
||||
EV_AutoViewRuleTable *auto_view_rule_table = push_array(scratch.arena, EV_AutoViewRuleTable, 1);
|
||||
{
|
||||
// ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_CheckB32)), str8_lit("checkbox"), 1);
|
||||
ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_MetaEvalFrameArray)), str8_lit("slice"), 1);
|
||||
ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_MachineMetaEval)), str8_lit("scheduler_machine"), 1);
|
||||
ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_ProcessMetaEval)), str8_lit("scheduler_process"), 1);
|
||||
for EachElement(idx, rd_collection_name_table)
|
||||
{
|
||||
ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, collection_type_keys[idx], rd_collection_name_table[idx], 1);
|
||||
}
|
||||
RD_CfgList auto_view_rules = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("auto_view_rule"));
|
||||
for(RD_CfgNode *n = auto_view_rules.first; n != 0; n = n->next)
|
||||
{
|
||||
@@ -13437,11 +13188,11 @@ rd_frame(void)
|
||||
E_TypeKey type_key = e_type_from_expr(type_parse.expr);
|
||||
if(!e_type_key_match(e_type_key_zero(), type_key))
|
||||
{
|
||||
ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, type_key, view_rule_string, 0);
|
||||
// ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, type_key, view_rule_string, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
ev_select_auto_view_rule_table(auto_view_rule_table);
|
||||
// ev_select_auto_view_rule_table(auto_view_rule_table);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: autosave if needed
|
||||
|
||||
@@ -1303,18 +1303,8 @@ internal void rd_window_frame(void);
|
||||
////////////////////////////////
|
||||
//~ rjf: Eval Visualization
|
||||
|
||||
internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind);
|
||||
internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind, B32 add_new_at_top);
|
||||
internal U64 rd_ev_view_rule_expr_id_from_num__meta_entities(U64 num, void *user_data, RD_EntityKind kind, B32 add_new_at_top);
|
||||
internal U64 rd_ev_view_rule_expr_num_from_id__meta_entities(U64 id, void *user_data, RD_EntityKind kind, B32 add_new_at_top);
|
||||
|
||||
internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind);
|
||||
internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, CTRL_EntityKind kind);
|
||||
internal U64 rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(U64 num, void *user_data, CTRL_EntityKind kind);
|
||||
internal U64 rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(U64 id, void *user_data, CTRL_EntityKind kind);
|
||||
|
||||
internal F32 rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out);
|
||||
internal String8 rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules);
|
||||
internal F32 rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, String8List *out);
|
||||
internal String8 rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Hover Eval
|
||||
|
||||
@@ -987,6 +987,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
|
||||
//- rjf: row -> context info
|
||||
|
||||
#if 0 // TODO(rjf): @cfg
|
||||
internal RD_WatchViewRowInfo
|
||||
rd_watch_view_row_info_from_row(EV_Row *row)
|
||||
{
|
||||
@@ -1103,6 +1104,7 @@ rd_watch_view_row_info_from_row(EV_Row *row)
|
||||
}
|
||||
return info;
|
||||
}
|
||||
#endif
|
||||
|
||||
//- rjf: row * cell -> string
|
||||
|
||||
@@ -1204,7 +1206,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, RD_WatchRowInfo *row_info
|
||||
|
||||
//- rjf: evaluate wrapped expression
|
||||
result.eval = e_eval_from_expr(scratch.arena, root_expr);
|
||||
result.string = rd_value_string_from_eval(arena, 0, 10, font, font_size, max_size_px, result.eval, &e_member_nil, row->view_rules);
|
||||
result.string = rd_value_string_from_eval(arena, 0, 10, font, font_size, max_size_px, result.eval);
|
||||
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
@@ -1214,6 +1216,8 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, RD_WatchRowInfo *row_info
|
||||
|
||||
//- rjf: row/column -> strings
|
||||
|
||||
#if 0 // TODO(rjf): @cfg
|
||||
|
||||
internal E_Expr *
|
||||
rd_expr_from_watch_view_row_column(Arena *arena, EV_Row *row, RD_WatchViewColumn *col)
|
||||
{
|
||||
@@ -1409,6 +1413,8 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_Row *row, RD_WatchViewColumn
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//- rjf: table coordinates -> text edit state
|
||||
|
||||
internal RD_WatchViewTextEditState *
|
||||
@@ -1491,7 +1497,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view
|
||||
//////////////////////////////
|
||||
//- rjf: unpack arguments
|
||||
//
|
||||
EV_ViewRuleList *top_level_view_rules = ev_view_rule_list_from_string(scratch.arena, root_view_rule);
|
||||
EV_View *eval_view = rd_view_eval_view();
|
||||
String8 filter = rd_view_filter();
|
||||
F32 row_height_px = floor_f32(ui_top_font_size()*2.5f);
|
||||
@@ -1559,7 +1564,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view
|
||||
MemoryZeroStruct(&block_tree);
|
||||
MemoryZeroStruct(&block_ranges);
|
||||
ev_key_set_expansion(eval_view, ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1);
|
||||
block_tree = ev_block_tree_from_string(scratch.arena, eval_view, filter, root_expr, top_level_view_rules);
|
||||
block_tree = ev_block_tree_from_string(scratch.arena, eval_view, filter, root_expr);
|
||||
block_ranges = ev_block_range_list_from_tree(scratch.arena, &block_tree);
|
||||
}
|
||||
|
||||
@@ -2026,10 +2031,16 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view
|
||||
for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row_node != 0; y += 1, row_node = row_node->next)
|
||||
{
|
||||
EV_Row *row = &row_node->row;
|
||||
for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1)
|
||||
RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);
|
||||
S64 cell_x = 0;
|
||||
for(RD_WatchCell *cell = row_info.cells.first; cell != 0; cell = cell->next, cell_x += 1)
|
||||
{
|
||||
RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x);
|
||||
String8 cell_string = rd_string_from_eval_viz_row_column(scratch.arena, row, col, string_flags|EV_StringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), row_string_max_size_px);
|
||||
if(cell_x < selection_tbl.min.x || selection_tbl.max.x < cell_x)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px);
|
||||
String8 cell_string = cell_info.string;
|
||||
cell_string = str8_skip_chop_whitespace(cell_string);
|
||||
U64 comma_pos = str8_find_needle(cell_string, 0, str8_lit(","), 0);
|
||||
if(selection_tbl.min.x != selection_tbl.max.x || selection_tbl.min.y != selection_tbl.max.y)
|
||||
@@ -2038,7 +2049,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view
|
||||
comma_pos < cell_string.size ? "\"" : "",
|
||||
cell_string,
|
||||
comma_pos < cell_string.size ? "\"" : "",
|
||||
x+1 <= selection_tbl.max.x ? "," : "");
|
||||
cell_x+1 <= selection_tbl.max.x ? "," : "");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2288,6 +2299,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view
|
||||
RD_EntityKind collection_entity_kind = RD_EntityKind_Nil;
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, selection_block->expr);
|
||||
E_Type *type = e_type_from_key(scratch.arena, irtree.type_key);
|
||||
#if 0 // TODO(rjf): @cfg
|
||||
for EachElement(idx, rd_collection_name_table)
|
||||
{
|
||||
if(str8_match(type->name, rd_collection_name_table[idx], 0))
|
||||
@@ -2296,6 +2308,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// rjf: map selection endpoints to entities
|
||||
RD_Entity *first_entity = &rd_nil_entity;
|
||||
|
||||
@@ -239,14 +239,18 @@ internal Vec2S64 rd_tbl_from_watch_pt(EV_BlockRangeList *block_ranges, RD_WatchP
|
||||
internal RD_WatchRowInfo rd_watch_row_info_from_row(Arena *arena, EV_Row *row);
|
||||
|
||||
//- rjf: row -> context info
|
||||
#if 0 // TODO(rjf): @cfg
|
||||
internal RD_WatchViewRowInfo rd_watch_view_row_info_from_row(EV_Row *row);
|
||||
#endif
|
||||
|
||||
//- rjf: row * cell -> info
|
||||
internal RD_WatchRowCellInfo rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, RD_WatchRowInfo *row_info, RD_WatchCell *cell, FNT_Tag font, F32 font_size, F32 max_size_px);
|
||||
|
||||
//- rjf: row/column -> exprs / strings
|
||||
#if 0 // TODO(rjf): @cfg
|
||||
internal E_Expr *rd_expr_from_watch_view_row_column(Arena *arena, EV_Row *row, RD_WatchViewColumn *col);
|
||||
internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px);
|
||||
#endif
|
||||
|
||||
//- rjf: table coordinates -> text edit state
|
||||
internal RD_WatchViewTextEditState *rd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchPt pt);
|
||||
|
||||
@@ -1286,8 +1286,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
String8 eval_string = {0};
|
||||
if(!e_type_key_match(e_type_key_zero(), eval.type_key))
|
||||
{
|
||||
EV_ViewRuleList view_rules = {0};
|
||||
eval_string = rd_value_string_from_eval(scratch.arena, EV_StringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval, &e_member_nil, &view_rules);
|
||||
eval_string = rd_value_string_from_eval(scratch.arena, EV_StringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval);
|
||||
}
|
||||
ui_spacer(ui_em(1.5f, 1.f));
|
||||
ui_set_next_pref_width(ui_children_sum(1));
|
||||
|
||||
Reference in New Issue
Block a user