mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-14 08:02:23 -07:00
checkpoint in moving from old lookup hooks -> new type hooks; elimination of unnecessary recomputation of ir-trees/evals, just use information in already-computed evals
This commit is contained in:
@@ -4695,10 +4695,12 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread)
|
||||
ctx->member_map = e_push_member_map_from_rdi_voff(arena, eval_modules_primary->rdi, thread_rip_voff);
|
||||
ctx->macro_map = push_array(arena, E_String2ExprMap, 1);
|
||||
ctx->macro_map[0] = e_string2expr_map_make(arena, 512);
|
||||
#if 0 // TODO(rjf): @eval
|
||||
ctx->lookup_rule_map = push_array(arena, E_LookupRuleMap, 1);
|
||||
ctx->lookup_rule_map[0] = e_lookup_rule_map_make(arena, 512);
|
||||
ctx->irgen_rule_map = push_array(arena, E_IRGenRuleMap, 1);
|
||||
ctx->irgen_rule_map[0] = e_irgen_rule_map_make(arena, 512);
|
||||
#endif
|
||||
ctx->auto_hook_map = push_array(arena, E_AutoHookMap, 1);
|
||||
ctx->auto_hook_map[0] = e_auto_hook_map_make(arena, 512);
|
||||
}
|
||||
|
||||
+23
-31
@@ -6,17 +6,9 @@
|
||||
|
||||
internal E_Eval
|
||||
e_eval_from_expr(Arena *arena, E_Expr *expr)
|
||||
{
|
||||
E_ExprChain exprs = {expr, expr};
|
||||
E_Eval result = e_eval_from_exprs(arena, exprs);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal E_Eval
|
||||
e_eval_from_exprs(Arena *arena, E_ExprChain exprs)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, exprs.last);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr);
|
||||
E_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
E_Interpretation interp = e_interpret(bytecode);
|
||||
@@ -24,7 +16,7 @@ e_eval_from_exprs(Arena *arena, E_ExprChain exprs)
|
||||
{
|
||||
.value = interp.value,
|
||||
.space = interp.space,
|
||||
.exprs = exprs,
|
||||
.expr = expr,
|
||||
.irtree = irtree,
|
||||
.bytecode = bytecode,
|
||||
.code = interp.code,
|
||||
@@ -43,7 +35,7 @@ e_eval_from_string(Arena *arena, String8 string)
|
||||
{
|
||||
E_TokenArray tokens = e_token_array_from_text(arena, string);
|
||||
E_Parse parse = e_parse_expr_from_text_tokens(arena, string, tokens);
|
||||
E_Eval eval = e_eval_from_exprs(arena, parse.exprs);
|
||||
E_Eval eval = e_eval_from_expr(arena, parse.exprs.first);
|
||||
e_msg_list_concat_in_place(&eval.msgs, &parse.msgs);
|
||||
return eval;
|
||||
}
|
||||
@@ -252,22 +244,22 @@ e_value_from_expr(E_Expr *expr)
|
||||
E_Value result = value_eval.value;
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Debug Logging Functions
|
||||
|
||||
internal String8
|
||||
e_debug_log_from_expr_string(Arena *arena, String8 string)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
char *indent_spaces = " ";
|
||||
String8List strings = {0};
|
||||
|
||||
internal String8
|
||||
e_debug_log_from_expr_string(Arena *arena, String8 string)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
char *indent_spaces = " ";
|
||||
String8List strings = {0};
|
||||
|
||||
//- rjf: begin expression
|
||||
String8 expr_text = string;
|
||||
str8_list_pushf(scratch.arena, &strings, "`%S`\n", expr_text);
|
||||
|
||||
|
||||
//- rjf: tokenize
|
||||
E_TokenArray tokens = e_token_array_from_text(scratch.arena, expr_text);
|
||||
str8_list_pushf(scratch.arena, &strings, " tokens:\n");
|
||||
@@ -277,7 +269,7 @@ e_debug_log_from_expr_string(Arena *arena, String8 string)
|
||||
String8 token_string = str8_substr(expr_text, token.range);
|
||||
str8_list_pushf(scratch.arena, &strings, " %S: `%S`\n", e_token_kind_strings[token.kind], token_string);
|
||||
}
|
||||
|
||||
|
||||
//- rjf: parse
|
||||
E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, expr_text, tokens);
|
||||
{
|
||||
@@ -320,7 +312,7 @@ e_debug_log_from_expr_string(Arena *arena, String8 string)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//- rjf: type
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.exprs.first);
|
||||
{
|
||||
@@ -335,7 +327,7 @@ e_debug_log_from_expr_string(Arena *arena, String8 string)
|
||||
str8_list_pushf(scratch.arena, &strings, "%.*s%S\n", (int)indent*4, indent_spaces, e_type_kind_basic_string_table[type->kind]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//- rjf: irtree
|
||||
{
|
||||
typedef struct Task Task;
|
||||
@@ -376,10 +368,10 @@ e_debug_log_from_expr_string(Arena *arena, String8 string)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
str8_list_pushf(scratch.arena, &strings, "\n");
|
||||
|
||||
String8 result = str8_list_join(arena, &strings, 0);
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
str8_list_pushf(scratch.arena, &strings, "\n");
|
||||
|
||||
String8 result = str8_list_join(arena, &strings, 0);
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -12,18 +12,22 @@ struct E_Eval
|
||||
{
|
||||
E_Value value;
|
||||
E_Space space;
|
||||
E_ExprChain exprs;
|
||||
E_Expr *expr;
|
||||
E_IRTreeAndType irtree;
|
||||
String8 bytecode;
|
||||
E_InterpretationCode code;
|
||||
E_MsgList msgs;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Globals
|
||||
|
||||
read_only global E_Eval e_eval_nil = {zero_struct, zero_struct, &e_expr_nil, {&e_irnode_nil}};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Bundled Evaluation Functions
|
||||
|
||||
internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr);
|
||||
internal E_Eval e_eval_from_exprs(Arena *arena, E_ExprChain exprs);
|
||||
internal E_Eval e_eval_from_string(Arena *arena, String8 string);
|
||||
internal E_Eval e_eval_from_stringf(Arena *arena, char *fmt, ...);
|
||||
internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval);
|
||||
|
||||
+22
-5
@@ -268,6 +268,7 @@ struct E_IRTreeAndType
|
||||
{
|
||||
E_IRNode *root;
|
||||
E_TypeKey type_key;
|
||||
void *user_data;
|
||||
E_Mode mode;
|
||||
E_MsgList msgs;
|
||||
};
|
||||
@@ -288,7 +289,6 @@ typedef enum E_MemberKind
|
||||
E_MemberKind_VirtualBase,
|
||||
E_MemberKind_NestedType,
|
||||
E_MemberKind_Padding,
|
||||
E_MemberKind_Query,
|
||||
E_MemberKind_COUNT
|
||||
}
|
||||
E_MemberKind;
|
||||
@@ -357,6 +357,11 @@ struct E_TypeExpandInfo
|
||||
U64 expr_count;
|
||||
};
|
||||
|
||||
#define E_TYPE_IRGEN_FUNCTION_SIG(name) E_IRTreeAndType name(Arena *arena, E_IRTreeAndType *irtree)
|
||||
#define E_TYPE_IRGEN_FUNCTION_NAME(name) e_type_irgen__##name
|
||||
#define E_TYPE_IRGEN_FUNCTION_DEF(name) internal E_TYPE_IRGEN_FUNCTION_SIG(E_TYPE_IRGEN_FUNCTION_NAME(name))
|
||||
typedef E_TYPE_IRGEN_FUNCTION_SIG(E_TypeIRGenFunctionType);
|
||||
|
||||
#define E_TYPE_ACCESS_FUNCTION_SIG(name) E_IRTreeAndType name(Arena *arena, E_Expr *expr, E_IRTreeAndType *lhs_irtree)
|
||||
#define E_TYPE_ACCESS_FUNCTION_NAME(name) e_type_access__##name
|
||||
#define E_TYPE_ACCESS_FUNCTION_DEF(name) internal E_TYPE_ACCESS_FUNCTION_SIG(E_TYPE_ACCESS_FUNCTION_NAME(name))
|
||||
@@ -382,6 +387,15 @@ typedef E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_SIG(E_TypeExpandIDFromNumFunctionType
|
||||
#define E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(name) internal E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_SIG(E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name))
|
||||
typedef E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_SIG(E_TypeExpandNumFromIDFunctionType);
|
||||
|
||||
typedef struct E_TypeExpandRule E_TypeExpandRule;
|
||||
struct E_TypeExpandRule
|
||||
{
|
||||
E_TypeExpandInfoFunctionType *info;
|
||||
E_TypeExpandRangeFunctionType *range;
|
||||
E_TypeExpandIDFromNumFunctionType *id_from_num;
|
||||
E_TypeExpandNumFromIDFunctionType *num_from_id;
|
||||
};
|
||||
|
||||
typedef struct E_Type E_Type;
|
||||
struct E_Type
|
||||
{
|
||||
@@ -399,11 +413,9 @@ struct E_Type
|
||||
E_Member *members;
|
||||
E_EnumVal *enum_vals;
|
||||
E_Expr **args;
|
||||
E_TypeIRGenFunctionType *irgen;
|
||||
E_TypeAccessFunctionType *access;
|
||||
E_TypeExpandInfoFunctionType *expand_info;
|
||||
E_TypeExpandRangeFunctionType *expand_range;
|
||||
E_TypeExpandIDFromNumFunctionType *expand_id_from_num;
|
||||
E_TypeExpandNumFromIDFunctionType *expand_num_from_id;
|
||||
E_TypeExpandRule expand;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -483,6 +495,8 @@ struct E_String2ExprMap
|
||||
////////////////////////////////
|
||||
//~ rjf: Member/Index Lookup Hooks
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
|
||||
typedef struct E_LookupInfo E_LookupInfo;
|
||||
struct E_LookupInfo
|
||||
{
|
||||
@@ -565,10 +579,12 @@ struct E_LookupRuleExprPair
|
||||
E_LookupRule *rule;
|
||||
E_Expr *expr;
|
||||
};
|
||||
#endif
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: IR Generation Hooks
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
#define E_IRGEN_FUNCTION_SIG(name) E_IRTreeAndType name(Arena *arena, E_Expr *expr)
|
||||
#define E_IRGEN_FUNCTION_NAME(name) e_irgen_##name
|
||||
#define E_IRGEN_FUNCTION_DEF(name) internal E_IRGEN_FUNCTION_SIG(E_IRGEN_FUNCTION_NAME(name))
|
||||
@@ -602,6 +618,7 @@ struct E_IRGenRuleMap
|
||||
U64 slots_count;
|
||||
E_IRGenRuleSlot *slots;
|
||||
};
|
||||
#endif
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Type Pattern -> Hook Key Data Structure (Auto View Rules)
|
||||
|
||||
+1257
-1658
File diff suppressed because it is too large
Load Diff
@@ -134,8 +134,10 @@ struct E_IRCtx
|
||||
E_String2ExprMap *macro_map;
|
||||
|
||||
// rjf: hook maps
|
||||
#if 0 // TODO(rjf): @eval
|
||||
E_LookupRuleMap *lookup_rule_map;
|
||||
E_IRGenRuleMap *irgen_rule_map;
|
||||
#endif
|
||||
E_AutoHookMap *auto_hook_map;
|
||||
};
|
||||
|
||||
@@ -164,6 +166,7 @@ struct E_IRState
|
||||
////////////////////////////////
|
||||
//~ rjf: Globals
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
local_persist read_only E_LookupRule e_lookup_rule__nil =
|
||||
{
|
||||
str8_lit_comp("nil"),
|
||||
@@ -187,6 +190,8 @@ local_persist read_only E_IRGenRule e_irgen_rule__default =
|
||||
str8_lit_comp("default"),
|
||||
E_IRGEN_FUNCTION_NAME(default),
|
||||
};
|
||||
#endif
|
||||
|
||||
global read_only E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil};
|
||||
thread_static E_IRState *e_ir_state = 0;
|
||||
|
||||
@@ -204,20 +209,24 @@ internal void e_select_ir_ctx(E_IRCtx *ctx);
|
||||
////////////////////////////////
|
||||
//~ rjf: Lookups
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
internal E_LookupRuleMap e_lookup_rule_map_make(Arena *arena, U64 slots_count);
|
||||
internal void e_lookup_rule_map_insert(Arena *arena, E_LookupRuleMap *map, E_LookupRule *rule);
|
||||
#define e_lookup_rule_map_insert_new(arena, map, name_, ...) e_lookup_rule_map_insert((arena), (map), &(E_LookupRule){.name = (name_), __VA_ARGS__})
|
||||
|
||||
internal E_LookupRule *e_lookup_rule_from_string(String8 string);
|
||||
#endif
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: IR Gen Rules
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
internal E_IRGenRuleMap e_irgen_rule_map_make(Arena *arena, U64 slots_count);
|
||||
internal void e_irgen_rule_map_insert(Arena *arena, E_IRGenRuleMap *map, E_IRGenRule *rule);
|
||||
#define e_irgen_rule_map_insert_new(arena, map, name_, ...) e_irgen_rule_map_insert((arena), (map), &(E_IRGenRule){.name = (name_), __VA_ARGS__})
|
||||
|
||||
internal E_IRGenRule *e_irgen_rule_from_string(String8 string);
|
||||
#endif
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Auto Hooks
|
||||
@@ -288,7 +297,9 @@ internal E_Expr *e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *r
|
||||
////////////////////////////////
|
||||
//~ rjf: Expression & IR-Tree => Rules
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
internal E_LookupRule *e_lookup_rule_from_type_key(E_TypeKey type_key);
|
||||
#endif
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
internal E_LookupRuleExprPair e_lookup_rule_tag_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree);
|
||||
|
||||
+451
-4
@@ -396,6 +396,11 @@ e_type_key_cons_(E_ConsTypeParams *params)
|
||||
node->key = key;
|
||||
MemoryCopyStruct(&node->params, params);
|
||||
node->params.name = push_str8_copy(e_type_state->arena, params->name);
|
||||
if(node->params.expand.info != 0)
|
||||
{
|
||||
if(node->params.expand.id_from_num == 0) {node->params.expand.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity);}
|
||||
if(node->params.expand.num_from_id == 0) {node->params.expand.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity);}
|
||||
}
|
||||
if(params->members != 0)
|
||||
{
|
||||
node->params.members = push_array(e_type_state->arena, E_Member, params->count);
|
||||
@@ -632,11 +637,9 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
||||
type->count = node->params.count;
|
||||
type->depth = node->params.depth;
|
||||
type->arch = node->params.arch;
|
||||
type->irgen = node->params.irgen;
|
||||
type->access = node->params.access;
|
||||
type->expand_info = node->params.expand_info;
|
||||
type->expand_range = node->params.expand_range;
|
||||
type->expand_id_from_num = node->params.expand_id_from_num;
|
||||
type->expand_num_from_id = node->params.expand_num_from_id;
|
||||
type->expand = node->params.expand;
|
||||
type->byte_size = node->byte_size;
|
||||
switch(type->kind)
|
||||
{
|
||||
@@ -2067,3 +2070,447 @@ e_type_member_from_key_name__cached(E_TypeKey key, String8 name)
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: (Built-In Type Hooks) Default Hooks
|
||||
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(default)
|
||||
{
|
||||
E_TypeExpandInfo result = {0};
|
||||
{
|
||||
E_TypeKey type_key = e_type_unwrap(irtree->type_key);
|
||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||
if(e_type_kind_is_pointer_or_ref(type_kind))
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(type_key);
|
||||
result.expr_count = type->count;
|
||||
if(type->count == 1)
|
||||
{
|
||||
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);
|
||||
if(direct_type_kind == E_TypeKind_Struct ||
|
||||
direct_type_kind == E_TypeKind_Class ||
|
||||
direct_type_kind == E_TypeKind_Union)
|
||||
{
|
||||
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(direct_type_key, filter);
|
||||
result.expr_count = data_members.count;
|
||||
}
|
||||
else if(direct_type_kind == E_TypeKind_Enum)
|
||||
{
|
||||
E_Type *direct_type = e_type_from_key__cached(direct_type_key);
|
||||
result.expr_count = direct_type->count;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(type_kind == E_TypeKind_Struct ||
|
||||
type_kind == E_TypeKind_Class ||
|
||||
type_kind == E_TypeKind_Union)
|
||||
{
|
||||
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(type_key, filter);
|
||||
result.expr_count = data_members.count;
|
||||
}
|
||||
else if(type_kind == E_TypeKind_Enum)
|
||||
{
|
||||
E_Type *direct_type = e_type_from_key__cached(type_key);
|
||||
result.expr_count = direct_type->count;
|
||||
}
|
||||
else if(type_kind == E_TypeKind_Array)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(type_key);
|
||||
result.expr_count = type->count;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
{
|
||||
//- rjf: unpack type of expression
|
||||
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
|
||||
E_TypeKey lhs_type_key = lhs_irtree.type_key;
|
||||
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key);
|
||||
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_enum_range = 0;
|
||||
B32 do_index_range = 0;
|
||||
E_TypeKey enum_type_key = zero_struct;
|
||||
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__cached(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))
|
||||
{
|
||||
struct_type_key = direct_type_key;
|
||||
struct_type_kind = direct_type_kind;
|
||||
do_struct_range = 1;
|
||||
}
|
||||
else if(lhs_type->count == 1 && direct_type_kind == E_TypeKind_Enum)
|
||||
{
|
||||
do_enum_range = 1;
|
||||
enum_type_key = direct_type_key;
|
||||
}
|
||||
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)
|
||||
{
|
||||
struct_type_key = lhs_type_key;
|
||||
struct_type_kind = lhs_type_kind;
|
||||
do_struct_range = 1;
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Enum)
|
||||
{
|
||||
enum_type_key = lhs_type_key;
|
||||
do_enum_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_MemberArray data_members = e_type_data_members_from_key_filter__cached(struct_type_key, filter);
|
||||
Rng1U64 legal_idx_range = r1u64(0, data_members.count);
|
||||
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
|
||||
U64 read_range_count = dim_1u64(read_range);
|
||||
for(U64 idx = 0; idx < read_range_count; idx += 1)
|
||||
{
|
||||
U64 member_idx = idx + read_range.min;
|
||||
String8 member_name = data_members.v[member_idx].name;
|
||||
exprs_out[idx] = e_expr_irext_member_access(arena, expr, &lhs_irtree, member_name);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: enum case -> the lookup-range will return a range of enum constants
|
||||
else if(do_enum_range)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(enum_type_key);
|
||||
Rng1U64 legal_idx_range = r1u64(0, type->count);
|
||||
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
|
||||
U64 read_range_count = dim_1u64(read_range);
|
||||
for(U64 idx = 0; idx < read_range_count; idx += 1)
|
||||
{
|
||||
U64 member_idx = idx + read_range.min;
|
||||
String8 member_name = type->enum_vals[member_idx].name;
|
||||
exprs_out[idx] = e_expr_irext_member_access(arena, expr, &lhs_irtree, member_name);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: ptr case -> the lookup-range will return a range of dereferences
|
||||
else if(do_index_range)
|
||||
{
|
||||
U64 read_range_count = dim_1u64(idx_range);
|
||||
for(U64 idx = 0; idx < read_range_count; idx += 1)
|
||||
{
|
||||
exprs_out[idx] = e_expr_irext_array_index(arena, expr, &lhs_irtree, idx_range.min + idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
|
||||
E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity)
|
||||
{
|
||||
return num;
|
||||
}
|
||||
|
||||
E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity)
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: (Built-In Type Hooks) `folder` type
|
||||
|
||||
typedef struct E_FolderAccel E_FolderAccel;
|
||||
struct E_FolderAccel
|
||||
{
|
||||
String8 folder_path;
|
||||
String8Array folders;
|
||||
String8Array files;
|
||||
};
|
||||
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(folder)
|
||||
{
|
||||
E_TypeExpandInfo info = {0};
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
//- rjf: evaluate lhs file path ID
|
||||
E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, irtree->root);
|
||||
String8 lhs_bytecode = e_bytecode_from_oplist(scratch.arena, &lhs_oplist);
|
||||
E_Interpretation lhs_interp = e_interpret(lhs_bytecode);
|
||||
E_Value lhs_value = lhs_interp.value;
|
||||
U64 lhs_string_id = lhs_value.u64;
|
||||
String8 folder_path = e_string_from_id(lhs_string_id);
|
||||
|
||||
//- rjf: compute filter - omit common prefixes (common parent paths)
|
||||
String8 local_filter = filter;
|
||||
{
|
||||
U64 folder_pos_in_filter = str8_find_needle(filter, 0, folder_path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive);
|
||||
if(folder_pos_in_filter < filter.size)
|
||||
{
|
||||
local_filter = str8_skip(local_filter, folder_pos_in_filter+folder_path.size);
|
||||
local_filter = str8_skip_chop_slashes(local_filter);
|
||||
}
|
||||
else
|
||||
{
|
||||
MemoryZeroStruct(&local_filter);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: gather & filter files in this folder
|
||||
String8List folder_paths = {0};
|
||||
String8List file_paths = {0};
|
||||
{
|
||||
OS_FileIter *iter = os_file_iter_begin(scratch.arena, folder_path, 0);
|
||||
for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, iter, &info);)
|
||||
{
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, local_filter, info.name);
|
||||
if(matches.count == matches.needle_part_count)
|
||||
{
|
||||
if(info.props.flags & FilePropertyFlag_IsFolder)
|
||||
{
|
||||
str8_list_push(scratch.arena, &folder_paths, push_str8_copy(arena, info.name));
|
||||
}
|
||||
else
|
||||
{
|
||||
str8_list_push(scratch.arena, &file_paths, push_str8_copy(arena, info.name));
|
||||
}
|
||||
}
|
||||
}
|
||||
os_file_iter_end(iter);
|
||||
}
|
||||
|
||||
//- rjf: build accelerator
|
||||
E_FolderAccel *accel = push_array(arena, E_FolderAccel, 1);
|
||||
accel->folder_path = push_str8_copy(arena, folder_path);
|
||||
accel->folders = str8_array_from_list(arena, &folder_paths);
|
||||
accel->files = str8_array_from_list(arena, &file_paths);
|
||||
info.user_data = accel;
|
||||
info.expr_count = accel->folders.count + accel->files.count;
|
||||
scratch_end(scratch);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(folder)
|
||||
{
|
||||
E_FolderAccel *accel = (E_FolderAccel *)user_data;
|
||||
U64 out_idx = 0;
|
||||
for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_Expr *expr = &e_expr_nil;
|
||||
String8 expr_string = {0};
|
||||
if(0 <= idx && idx < accel->folders.count)
|
||||
{
|
||||
String8 folder_name = accel->folders.v[idx - 0];
|
||||
String8 folder_path = push_str8f(scratch.arena, "%S%s%S", accel->folder_path, accel->folder_path.size != 0 ? "/" : "", folder_name);
|
||||
expr = e_push_expr(arena, E_ExprKind_LeafValue, 0);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("folder"));
|
||||
expr->space = e_space_make(E_SpaceKind_FileSystem);
|
||||
expr->value.u64 = e_id_from_string(folder_path);
|
||||
expr_string = push_str8f(arena, "\"%S\"", escaped_from_raw_str8(scratch.arena, folder_name));
|
||||
}
|
||||
else if(accel->folders.count <= idx && idx < accel->folders.count + accel->files.count)
|
||||
{
|
||||
String8 file_name = accel->files.v[idx - accel->folders.count];
|
||||
String8 file_path = push_str8f(scratch.arena, "%S%s%S", accel->folder_path, accel->folder_path.size != 0 ? "/" : "", file_name);
|
||||
expr = e_push_expr(arena, E_ExprKind_LeafValue, 0);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("file"));
|
||||
expr->space = e_space_make(E_SpaceKind_FileSystem);
|
||||
expr->value.u64 = e_id_from_string(file_path);
|
||||
expr_string = push_str8f(arena, "\"%S\"", escaped_from_raw_str8(scratch.arena, file_name));
|
||||
}
|
||||
exprs_out[out_idx] = expr;
|
||||
exprs_strings_out[out_idx] = expr_string;
|
||||
scratch_end(scratch);
|
||||
}
|
||||
}
|
||||
|
||||
E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(folder)
|
||||
{
|
||||
U64 id = 0;
|
||||
E_FolderAccel *accel = (E_FolderAccel *)user_data;
|
||||
String8 name = {0};
|
||||
if(0 < num && num <= accel->folders.count)
|
||||
{
|
||||
name = accel->folders.v[num-1];
|
||||
}
|
||||
else if(accel->folders.count < num && num <= accel->folders.count+accel->files.count)
|
||||
{
|
||||
name = accel->files.v[num-accel->folders.count-1];
|
||||
}
|
||||
id = e_hash_from_string(5381, name);
|
||||
return id;
|
||||
}
|
||||
|
||||
E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(folder)
|
||||
{
|
||||
U64 num = 0;
|
||||
E_FolderAccel *accel = (E_FolderAccel *)user_data;
|
||||
for(U64 idx = 0; idx < accel->folders.count+accel->files.count; idx += 1)
|
||||
{
|
||||
String8 name = {0};
|
||||
if(0 <= idx && idx < accel->folders.count)
|
||||
{
|
||||
name = accel->folders.v[idx];
|
||||
}
|
||||
else if(accel->folders.count <= idx && idx < accel->folders.count+accel->files.count)
|
||||
{
|
||||
name = accel->files.v[idx-accel->folders.count];
|
||||
}
|
||||
U64 hash = e_hash_from_string(5381, name);
|
||||
if(hash == id)
|
||||
{
|
||||
num = idx+1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: (Built-In Type Hooks) `file` type
|
||||
|
||||
typedef struct E_FileAccel E_FileAccel;
|
||||
struct E_FileAccel
|
||||
{
|
||||
String8 file_path;
|
||||
FileProperties props;
|
||||
String8Array fields;
|
||||
};
|
||||
|
||||
E_TYPE_IRGEN_FUNCTION_DEF(file)
|
||||
{
|
||||
E_IRTreeAndType result = *irtree;
|
||||
E_FileAccel *accel = push_array(arena, E_FileAccel, 1);
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
//- rjf: evaluate lhs file path ID
|
||||
E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, irtree->root);
|
||||
String8 lhs_bytecode = e_bytecode_from_oplist(scratch.arena, &lhs_oplist);
|
||||
E_Interpretation lhs_interp = e_interpret(lhs_bytecode);
|
||||
E_Value lhs_value = lhs_interp.value;
|
||||
U64 lhs_string_id = lhs_value.u64;
|
||||
|
||||
//- rjf: get file path
|
||||
String8 file_path = e_string_from_id(lhs_string_id);
|
||||
|
||||
//- rjf: build field list
|
||||
String8List fields = {0};
|
||||
str8_list_pushf(arena, &fields, "size");
|
||||
str8_list_pushf(arena, &fields, "last_modified_time");
|
||||
str8_list_pushf(arena, &fields, "creation_time");
|
||||
str8_list_pushf(arena, &fields, "data");
|
||||
|
||||
//- rjf: fill accel
|
||||
accel->file_path = push_str8_copy(arena, file_path);
|
||||
accel->props = os_properties_from_file_path(file_path);
|
||||
accel->fields = str8_array_from_list(arena, &fields);
|
||||
|
||||
scratch_end(scratch);
|
||||
}
|
||||
result.user_data = accel;
|
||||
return result;
|
||||
}
|
||||
|
||||
E_TYPE_ACCESS_FUNCTION_DEF(file)
|
||||
{
|
||||
E_IRTreeAndType result = {&e_irnode_nil};
|
||||
E_FileAccel *accel = (E_FileAccel *)lhs_irtree->user_data;
|
||||
if(expr->kind == E_ExprKind_MemberAccess)
|
||||
{
|
||||
E_Expr *rhs = expr->first->next;
|
||||
String8 member_name = rhs->string;
|
||||
if(str8_match(member_name, str8_lit("size"), 0))
|
||||
{
|
||||
E_Space space = e_space_make(E_SpaceKind_FileSystem);
|
||||
space.u64_0 = e_id_from_string(accel->file_path);
|
||||
result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, accel->props.size));
|
||||
result.type_key = e_type_key_basic(E_TypeKind_U64);
|
||||
result.mode = E_Mode_Value;
|
||||
}
|
||||
else if(str8_match(member_name, str8_lit("last_modified_time"), 0))
|
||||
{
|
||||
E_Space space = e_space_make(E_SpaceKind_FileSystem);
|
||||
space.u64_0 = e_id_from_string(accel->file_path);
|
||||
result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, accel->props.modified));
|
||||
result.type_key = e_type_key_basic(E_TypeKind_U64);
|
||||
result.mode = E_Mode_Value;
|
||||
}
|
||||
else if(str8_match(member_name, str8_lit("creation_time"), 0))
|
||||
{
|
||||
E_Space space = e_space_make(E_SpaceKind_FileSystem);
|
||||
space.u64_0 = e_id_from_string(accel->file_path);
|
||||
result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, accel->props.created));
|
||||
result.type_key = e_type_key_basic(E_TypeKind_U64);
|
||||
result.mode = E_Mode_Value;
|
||||
}
|
||||
else if(str8_match(member_name, str8_lit("data"), 0))
|
||||
{
|
||||
E_Space space = e_space_make(E_SpaceKind_File);
|
||||
space.u64_0 = e_id_from_string(accel->file_path);
|
||||
result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0));
|
||||
result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), accel->props.size, 0);
|
||||
result.mode = E_Mode_Offset;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(file)
|
||||
{
|
||||
E_FileAccel *accel = push_array(arena, E_FileAccel, 1);
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
scratch_end(scratch);
|
||||
}
|
||||
E_TypeExpandInfo info = {accel, accel->fields.count};
|
||||
return info;
|
||||
}
|
||||
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(file)
|
||||
{
|
||||
E_FileAccel *accel = (E_FileAccel *)user_data;
|
||||
U64 out_idx = 0;
|
||||
for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)
|
||||
{
|
||||
E_Expr *expr = &e_expr_nil;
|
||||
String8 string = {0};
|
||||
if(0 <= idx && idx < accel->fields.count)
|
||||
{
|
||||
String8 name = accel->fields.v[idx];
|
||||
expr = e_push_expr(arena, E_ExprKind_MemberAccess, 0);
|
||||
E_Expr *lhs = e_expr_ref(arena, expr);
|
||||
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, 0);
|
||||
rhs->string = push_str8_copy(arena, name);
|
||||
e_expr_push_child(expr, lhs);
|
||||
e_expr_push_child(expr, rhs);
|
||||
}
|
||||
exprs_out[out_idx] = expr;
|
||||
exprs_strings_out[out_idx] = string;
|
||||
}
|
||||
}
|
||||
|
||||
+13
-4
@@ -47,11 +47,9 @@ struct E_ConsTypeParams
|
||||
E_Member *members;
|
||||
E_EnumVal *enum_vals;
|
||||
E_Expr **args;
|
||||
E_TypeIRGenFunctionType *irgen;
|
||||
E_TypeAccessFunctionType *access;
|
||||
E_TypeExpandInfoFunctionType *expand_info;
|
||||
E_TypeExpandRangeFunctionType *expand_range;
|
||||
E_TypeExpandIDFromNumFunctionType *expand_id_from_num;
|
||||
E_TypeExpandNumFromIDFunctionType *expand_num_from_id;
|
||||
E_TypeExpandRule expand;
|
||||
};
|
||||
|
||||
typedef struct E_ConsTypeNode E_ConsTypeNode;
|
||||
@@ -180,6 +178,17 @@ struct E_TypeState
|
||||
|
||||
global read_only E_Member e_member_nil = {E_MemberKind_Null};
|
||||
global read_only E_Type e_type_nil = {E_TypeKind_Null};
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(default);
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default);
|
||||
E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity);
|
||||
E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity);
|
||||
global read_only E_TypeExpandRule e_type_expand_rule__default =
|
||||
{
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_NAME(default),
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_NAME(default),
|
||||
E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity),
|
||||
E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity),
|
||||
};
|
||||
thread_static E_TypeState *e_type_state = 0;
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
@@ -535,7 +535,7 @@ ev_keyed_expr_push_tags(Arena *arena, EV_View *view, EV_Block *block, EV_Key key
|
||||
//~ rjf: Block Building
|
||||
|
||||
internal EV_BlockTree
|
||||
ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChain exprs)
|
||||
ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *expr)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
EV_BlockTree tree = {&ev_nil_block};
|
||||
@@ -545,7 +545,7 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai
|
||||
//- rjf: generate root expression
|
||||
EV_Key root_key = ev_key_root();
|
||||
EV_Key root_row_key = ev_key_make(ev_hash_from_key(root_key), 1);
|
||||
E_Expr *root_expr = e_expr_copy(arena, exprs.last);
|
||||
E_Expr *root_expr = e_expr_copy(arena, expr);
|
||||
#if 0 // TODO(rjf): @eval
|
||||
ev_keyed_expr_push_tags(arena, view, &ev_nil_block, root_row_key, root_expr);
|
||||
#endif
|
||||
@@ -555,7 +555,7 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai
|
||||
MemoryCopyStruct(tree.root, &ev_nil_block);
|
||||
tree.root->key = root_key;
|
||||
tree.root->string = str8_zero();
|
||||
tree.root->expr = root_expr;
|
||||
tree.root->eval = e_eval_from_expr(arena, root_expr);
|
||||
tree.root->row_count = 1;
|
||||
tree.total_row_count += 1;
|
||||
tree.total_item_count += 1;
|
||||
@@ -566,12 +566,12 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai
|
||||
{
|
||||
Task *next;
|
||||
EV_Block *parent_block;
|
||||
E_Expr *expr;
|
||||
E_Eval eval;
|
||||
U64 child_id;
|
||||
U64 split_relative_idx;
|
||||
B32 default_expanded;
|
||||
};
|
||||
Task start_task = {0, tree.root, tree.root->expr, 1, 0};
|
||||
Task start_task = {0, tree.root, tree.root->eval, 1, 0};
|
||||
Task *first_task = &start_task;
|
||||
Task *last_task = first_task;
|
||||
for(Task *t = first_task; t != 0; t = t->next)
|
||||
@@ -593,39 +593,41 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai
|
||||
continue;
|
||||
}
|
||||
|
||||
// rjf: unpack expr
|
||||
E_IRTreeAndType expr_irtree = e_irtree_and_type_from_expr(scratch.arena, t->expr);
|
||||
// rjf: unpack eval
|
||||
E_Mode mode = t->eval.irtree.mode;
|
||||
E_TypeKey type_key = t->eval.irtree.type_key;
|
||||
E_Type *type = e_type_from_key__cached(type_key);
|
||||
E_TypeExpandRule *type_expand_rule = &e_type_expand_rule__default;
|
||||
if(type->expand.info != 0)
|
||||
{
|
||||
type_expand_rule = &type->expand;
|
||||
}
|
||||
|
||||
// rjf: get expr's expansion rule
|
||||
// rjf: get eval's visualization expansion rule
|
||||
// TODO(rjf): @eval EV_ExpandRuleTagPair expand_rule_and_tag = ev_expand_rule_tag_pair_from_expr_irtree(t->expr, &expr_irtree);
|
||||
EV_ExpandRule *expand_rule = &ev_nil_expand_rule;
|
||||
E_Expr *expand_rule_tag = &e_expr_nil;
|
||||
EV_ExpandRule *viz_expand_rule = &ev_nil_expand_rule;
|
||||
E_Expr *viz_expand_rule_tag = &e_expr_nil;
|
||||
|
||||
// rjf: skip if no expansion rule, & type info disallows expansion
|
||||
if(expand_rule == &ev_nil_expand_rule && !ev_type_key_and_mode_is_expandable(expr_irtree.type_key, expr_irtree.mode))
|
||||
if(viz_expand_rule == &ev_nil_expand_rule && !ev_type_key_and_mode_is_expandable(type_key, mode))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// rjf: get expr's lookup rule
|
||||
// TODO(rjf): @eval E_LookupRuleExprPair lookup_rule_and_tag = &e_lookup_rule_tag_pair_from_expr_irtree(t->expr, &expr_irtree);
|
||||
E_LookupRule *lookup_rule = e_lookup_rule_from_type_key(expr_irtree.type_key);
|
||||
E_Expr *lookup_rule_tag = &e_expr_nil;
|
||||
|
||||
// rjf: get top-level lookup/expansion info
|
||||
E_LookupInfo lookup_info = lookup_rule->info(arena, &expr_irtree, lookup_rule_tag, filter);
|
||||
EV_ExpandInfo expand_info = expand_rule->info(arena, view, filter, t->expr, expand_rule_tag);
|
||||
E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, &t->eval.irtree, filter);
|
||||
EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, t->eval.expr, viz_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_expand_rule)
|
||||
U64 expansion_row_count = type_expand_info.expr_count;
|
||||
if(viz_expand_rule != &ev_nil_expand_rule)
|
||||
{
|
||||
expansion_row_count = expand_info.row_count;
|
||||
expansion_row_count = viz_expand_info.row_count;
|
||||
}
|
||||
|
||||
// rjf: determine if this expansion supports child expansions
|
||||
B32 allow_child_expansions = 1;
|
||||
if(expand_info.single_item)
|
||||
if(viz_expand_info.single_item)
|
||||
{
|
||||
// NOTE(rjf): for now, just plugging in the heuristic of "is this a single row (a.k.a. visualizer)?"
|
||||
allow_child_expansions = 0;
|
||||
@@ -641,25 +643,21 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai
|
||||
expansion_block->parent = t->parent_block;
|
||||
expansion_block->key = key;
|
||||
expansion_block->split_relative_idx = t->split_relative_idx;
|
||||
expansion_block->expr = t->expr;
|
||||
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->eval = t->eval;
|
||||
expansion_block->type_expand_info = type_expand_info;
|
||||
expansion_block->type_expand_rule = type_expand_rule;
|
||||
expansion_block->viz_expand_info = viz_expand_info;
|
||||
expansion_block->viz_expand_rule = viz_expand_rule;
|
||||
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 += expansion_row_count;
|
||||
tree.total_item_count += expand_info.single_item ? 1 : expansion_row_count;
|
||||
tree.total_item_count += viz_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(allow_child_expansions && !child_count && !expand_info.rows_default_expanded && expand_node != 0 && expansion_row_count != 0)
|
||||
if(allow_child_expansions && !child_count && !viz_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){}
|
||||
@@ -673,7 +671,7 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai
|
||||
for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next, idx += 1)
|
||||
{
|
||||
child_keys[idx] = child->key;
|
||||
child_nums[idx] = lookup_rule->num_from_id(child->key.child_id, lookup_info.user_data);
|
||||
child_nums[idx] = type_expand_rule->num_from_id(type_expand_info.user_data, child->key.child_id);
|
||||
if(child_nums[idx] != child_keys[idx].child_id)
|
||||
{
|
||||
needs_sort = 1;
|
||||
@@ -706,14 +704,14 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai
|
||||
}
|
||||
|
||||
// rjf: gather children expansions from inverse of expansion state
|
||||
if(allow_child_expansions && !child_count && (expand_info.rows_default_expanded || (expand_node == 0 && !expand_info.rows_default_expanded)))
|
||||
if(allow_child_expansions && !child_count && (viz_expand_info.rows_default_expanded || (expand_node == 0 && !viz_expand_info.rows_default_expanded)))
|
||||
{
|
||||
child_count = expand_info.row_count;
|
||||
child_count = viz_expand_info.row_count;
|
||||
child_keys = push_array(scratch.arena, EV_Key, child_count);
|
||||
child_nums = push_array(scratch.arena, U64, child_count);
|
||||
for(U64 idx = 0; idx < child_count; idx += 1)
|
||||
{
|
||||
U64 child_id = lookup_rule->id_from_num(idx+1, lookup_info.user_data);
|
||||
U64 child_id = type_expand_rule->id_from_num(type_expand_info.user_data, idx+1);
|
||||
child_keys[idx] = ev_key_make(ev_hash_from_key(key), child_id);
|
||||
child_nums[idx] = idx+1;
|
||||
}
|
||||
@@ -728,14 +726,15 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if(expand_info.rows_default_expanded || ev_expansion_from_key(view, child_keys[idx]))
|
||||
if(viz_expand_info.rows_default_expanded || ev_expansion_from_key(view, child_keys[idx]))
|
||||
{
|
||||
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, lookup_rule_tag, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_expr, &child_string, lookup_info.user_data);
|
||||
type_expand_rule->range(arena, type_expand_info.user_data, t->eval.expr, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_expr, &child_string);
|
||||
if(child_expr != &e_expr_nil)
|
||||
{
|
||||
E_Eval child_eval = e_eval_from_expr(arena, child_expr);
|
||||
EV_Key child_key = child_keys[idx];
|
||||
#if 0 // TODO(rjf): @eval
|
||||
ev_keyed_expr_push_tags(arena, view, expansion_block, child_key, child_expr);
|
||||
@@ -743,10 +742,10 @@ ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChai
|
||||
Task *task = push_array(scratch.arena, Task, 1);
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
task->parent_block = expansion_block;
|
||||
task->expr = child_expr;
|
||||
task->eval = child_eval;
|
||||
task->child_id = child_key.child_id;
|
||||
task->split_relative_idx = split_relative_idx;
|
||||
task->default_expanded = expand_info.rows_default_expanded;
|
||||
task->default_expanded = viz_expand_info.rows_default_expanded;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -771,6 +770,20 @@ ev_depth_from_block(EV_Block *block)
|
||||
////////////////////////////////
|
||||
//~ rjf: Block Coordinate Spaces
|
||||
|
||||
internal U64
|
||||
ev_block_id_from_num(EV_Block *block, U64 num)
|
||||
{
|
||||
U64 result = block->type_expand_rule->id_from_num(block->type_expand_info.user_data, num);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal U64
|
||||
ev_block_num_from_id(EV_Block *block, U64 id)
|
||||
{
|
||||
U64 result = block->type_expand_rule->num_from_id(block->type_expand_info.user_data, id);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal EV_BlockRangeList
|
||||
ev_block_range_list_from_tree(Arena *arena, EV_BlockTree *block_tree)
|
||||
{
|
||||
@@ -870,7 +883,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->lookup_rule->id_from_num(relative_num, n->v.block->lookup_rule_user_data);
|
||||
U64 child_id = ev_block_id_from_num(n->v.block, relative_num);
|
||||
EV_Key block_key = n->v.block->key;
|
||||
key = ev_key_make(ev_hash_from_key(block_key), child_id);
|
||||
break;
|
||||
@@ -890,7 +903,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->lookup_rule->num_from_id(key.child_id, n->v.block->lookup_rule_user_data);
|
||||
U64 relative_num = ev_block_num_from_id(n->v.block, key.child_id);
|
||||
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))
|
||||
{
|
||||
@@ -1011,7 +1024,7 @@ 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
|
||||
B32 is_root = 0;
|
||||
B32 is_standalone_row = 0;
|
||||
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);
|
||||
@@ -1019,18 +1032,17 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
|
||||
{
|
||||
range_exprs[idx] = &e_expr_nil;
|
||||
}
|
||||
if(n->v.block->lookup_rule == &e_lookup_rule__nil ||
|
||||
n->v.block->single_item)
|
||||
if(n->v.block->single_item)
|
||||
{
|
||||
is_root = 1;
|
||||
is_standalone_row = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
n->v.block->lookup_rule->range(arena, n->v.block->expr, n->v.block->lookup_tag, filter, block_relative_range__windowed, range_exprs, range_exprs_strings, n->v.block->lookup_rule_user_data);
|
||||
n->v.block->type_expand_rule->range(arena, n->v.block->type_expand_info.user_data, n->v.block->eval.expr, filter, block_relative_range__windowed, range_exprs, range_exprs_strings);
|
||||
}
|
||||
|
||||
// rjf: no expansion operator applied -> push row for block expression; pass through block info
|
||||
if(is_root)
|
||||
if(is_standalone_row)
|
||||
{
|
||||
EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);
|
||||
SLLQueuePush(rows.first, rows.last, row_node);
|
||||
@@ -1042,16 +1054,17 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
|
||||
row->key = ev_key_make(ev_hash_from_key(row->block->key), 1);
|
||||
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->eval = n->v.block->eval;
|
||||
}
|
||||
|
||||
// rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range
|
||||
else for EachIndex(idx, range_exprs_count)
|
||||
{
|
||||
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);
|
||||
U64 child_id = ev_block_id_from_num(n->v.block, child_num);
|
||||
EV_Key row_key = ev_key_make(ev_hash_from_key(n->v.block->key), child_id);
|
||||
E_Expr *row_expr = range_exprs[idx];
|
||||
E_Eval row_eval = e_eval_from_expr(arena, row_expr);
|
||||
#if 0 // TODO(rjf): @eval
|
||||
ev_keyed_expr_push_tags(arena, view, n->v.block, row_key, row_expr);
|
||||
#endif
|
||||
@@ -1063,7 +1076,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
|
||||
row->key = row_key;
|
||||
row->visual_size = 1;
|
||||
row->string = range_exprs_strings[idx];
|
||||
row->expr = row_expr;
|
||||
row->eval = row_eval;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1085,7 +1098,7 @@ ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *
|
||||
{
|
||||
result = push_array(arena, EV_Row, 1);
|
||||
result->block = &ev_nil_block;
|
||||
result->expr = &e_expr_nil;
|
||||
result->eval = e_eval_nil;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -1098,54 +1111,13 @@ ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRang
|
||||
return rows;
|
||||
}
|
||||
|
||||
internal String8
|
||||
ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags)
|
||||
{
|
||||
String8 result = row->string;
|
||||
E_Expr *notable_expr = row->expr;
|
||||
for(B32 good = 0; !good;)
|
||||
{
|
||||
switch(notable_expr->kind)
|
||||
{
|
||||
default:{good = 1;}break;
|
||||
case E_ExprKind_Address:
|
||||
case E_ExprKind_Deref:
|
||||
case E_ExprKind_Cast:
|
||||
{
|
||||
notable_expr = notable_expr->last;
|
||||
}break;
|
||||
case E_ExprKind_Ref:
|
||||
{
|
||||
notable_expr = notable_expr->ref;
|
||||
}break;
|
||||
}
|
||||
}
|
||||
if(result.size == 0) switch(notable_expr->kind)
|
||||
{
|
||||
default:
|
||||
{
|
||||
result = e_string_from_expr(arena, notable_expr);
|
||||
}break;
|
||||
case E_ExprKind_ArrayIndex:
|
||||
{
|
||||
result = push_str8f(arena, "[%S]", e_string_from_expr(arena, notable_expr->last));
|
||||
}break;
|
||||
case E_ExprKind_MemberAccess:
|
||||
{
|
||||
result = push_str8f(arena, ".%S", e_string_from_expr(arena, notable_expr->last));
|
||||
}break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal B32
|
||||
ev_row_is_expandable(EV_Row *row)
|
||||
{
|
||||
B32 result = 0;
|
||||
if(!ev_key_match(ev_key_root(), row->block->key))
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr);
|
||||
E_IRTreeAndType irtree = row->eval.irtree;
|
||||
|
||||
// rjf: determine if view rules force expandability
|
||||
if(!result)
|
||||
@@ -1162,10 +1134,8 @@ ev_row_is_expandable(EV_Row *row)
|
||||
// rjf: determine if type info force expandability
|
||||
if(!result)
|
||||
{
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr);
|
||||
result = ev_type_key_and_mode_is_expandable(irtree.type_key, irtree.mode);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -1174,10 +1144,8 @@ internal B32
|
||||
ev_row_is_editable(EV_Row *row)
|
||||
{
|
||||
B32 result = 0;
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr);
|
||||
E_IRTreeAndType irtree = row->eval.irtree;
|
||||
result = ev_type_key_is_editable(irtree.type_key);
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1826,7 +1794,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
||||
// rjf: single-length pointers -> just gen new task for deref'd expr
|
||||
if(ptr_data->type->count == 1)
|
||||
{
|
||||
E_Expr *deref_expr = e_expr_irext_deref(arena, eval.exprs.first, &eval.irtree);
|
||||
E_Expr *deref_expr = e_expr_irext_deref(arena, eval.expr, &eval.irtree);
|
||||
E_Eval deref_eval = e_eval_from_expr(arena, deref_expr);
|
||||
need_new_task = 1;
|
||||
new_task.params = *params;
|
||||
|
||||
@@ -146,15 +146,13 @@ struct EV_Block
|
||||
// rjf: split index, relative to parent's space
|
||||
U64 split_relative_idx;
|
||||
|
||||
// rjf: expression / visualization info
|
||||
String8 string;
|
||||
E_Expr *expr;
|
||||
E_Expr *lookup_tag;
|
||||
E_Expr *expand_tag;
|
||||
E_LookupRule *lookup_rule;
|
||||
EV_ExpandRule *expand_rule;
|
||||
void *lookup_rule_user_data;
|
||||
void *expand_rule_user_data;
|
||||
// rjf: evaluation info
|
||||
String8 string;
|
||||
E_Eval eval;
|
||||
E_TypeExpandInfo type_expand_info;
|
||||
E_TypeExpandRule *type_expand_rule;
|
||||
EV_ExpandInfo viz_expand_info;
|
||||
EV_ExpandRule *viz_expand_rule;
|
||||
|
||||
// rjf: expansion info
|
||||
U64 row_count;
|
||||
@@ -201,8 +199,8 @@ struct EV_Row
|
||||
EV_Block *block;
|
||||
EV_Key key;
|
||||
U64 visual_size;
|
||||
String8 string;
|
||||
E_Expr *expr;
|
||||
String8 string;
|
||||
E_Eval eval;
|
||||
};
|
||||
|
||||
typedef struct EV_WindowedRowNode EV_WindowedRowNode;
|
||||
@@ -282,7 +280,7 @@ global read_only EV_ExpandRule ev_nil_expand_rule =
|
||||
EV_EXPAND_RULE_INFO_FUNCTION_NAME(nil),
|
||||
};
|
||||
thread_static EV_ExpandRuleTable *ev_view_rule_info_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, &e_expr_nil, &e_expr_nil, &e_lookup_rule__nil, &ev_nil_expand_rule};
|
||||
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}, {zero_struct, zero_struct, &e_expr_nil, &e_irnode_nil}};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Key Functions
|
||||
@@ -340,12 +338,14 @@ internal void ev_keyed_expr_push_tags(Arena *arena, EV_View *view, EV_Block *blo
|
||||
////////////////////////////////
|
||||
//~ rjf: Block Building
|
||||
|
||||
internal EV_BlockTree ev_block_tree_from_exprs(Arena *arena, EV_View *view, String8 filter, E_ExprChain exprs);
|
||||
internal EV_BlockTree ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *expr);
|
||||
internal U64 ev_depth_from_block(EV_Block *block);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Block Coordinate Spaces
|
||||
|
||||
|
||||
internal U64 ev_block_id_from_num(EV_Block *block, U64 num);
|
||||
internal U64 ev_block_num_from_id(EV_Block *block, U64 id);
|
||||
internal EV_BlockRangeList ev_block_range_list_from_tree(Arena *arena, EV_BlockTree *block_tree);
|
||||
internal EV_BlockRange ev_block_range_from_num(EV_BlockRangeList *block_ranges, U64 num);
|
||||
internal EV_Key ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num);
|
||||
@@ -359,7 +359,6 @@ internal U64 ev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vidx);
|
||||
internal EV_WindowedRowList ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 vnum_range);
|
||||
internal EV_Row *ev_row_from_num(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, U64 num);
|
||||
internal EV_WindowedRowList ev_rows_from_num_range(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 num_range);
|
||||
internal String8 ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags);
|
||||
internal B32 ev_row_is_expandable(EV_Row *row);
|
||||
internal B32 ev_row_is_editable(EV_Row *row);
|
||||
|
||||
|
||||
@@ -37,8 +37,8 @@
|
||||
# define raddbg_watch(fmt, ...) raddbg_watch__impl((fmt), __VA_ARGS__)
|
||||
# define raddbg_pin(expr, ...) /* NOTE(rjf): inspected by debugger ui - does not change program execution */
|
||||
# define raddbg_log(fmt, ...) raddbg_log__impl((fmt), __VA_ARGS__)
|
||||
# define raddbg_entry_point(...) raddbg_exe_data static char raddbg_gen_data_id()[] = ("entry_point: " #__VA_ARGS__)
|
||||
# define raddbg_auto_view_rule(type, ...) raddbg_exe_data static char raddbg_gen_data_id()()[] = ("auto_view_rule: {type: \"" #type "\", view_rule: \"" #__VA_ARGS__ "\"}")
|
||||
# define raddbg_entry_point(...) raddbg_exe_data static char raddbg_gen_data_id()[] = ("entry_point: \"" #__VA_ARGS__ "\"")
|
||||
# define raddbg_auto_view_rule(type, ...) raddbg_exe_data static char raddbg_gen_data_id()[] = ("auto_view_rule: {type: \"" #type "\", view_rule: \"" #__VA_ARGS__ "\"}")
|
||||
#endif
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
+88
-1330
File diff suppressed because it is too large
Load Diff
@@ -1005,8 +1005,10 @@ internal void rd_window_frame(void);
|
||||
////////////////////////////////
|
||||
//~ rjf: Eval Visualization
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
internal F32 rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval root_eval, E_Eval eval, String8List *out);
|
||||
internal String8 rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval);
|
||||
#endif
|
||||
internal String8 rd_value_string_from_eval_NEW(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,88 @@
|
||||
// Copyright (c) 2024 Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
#ifndef RADDBG_EVAL_H
|
||||
#define RADDBG_EVAL_H
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: `commands` Type Hooks
|
||||
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands);
|
||||
E_TYPE_ACCESS_FUNCTION_DEF(commands);
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(commands);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: `watches` Type Hooks
|
||||
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(watches);
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(watches);
|
||||
E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watches);
|
||||
E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: `locals` Type Hooks
|
||||
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(locals);
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(locals);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: `registers` Type Hooks
|
||||
|
||||
E_LOOKUP_INFO_FUNCTION_DEF(registers);
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(registers);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Schema Type Hooks
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
E_TYPE_ACCESS_FUNCTION_DEF(schema);
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema);
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(schema);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Config Collection Type Hooks
|
||||
|
||||
E_LOOKUP_INFO_FUNCTION_DEF(cfgs);
|
||||
E_LOOKUP_ACCESS_FUNCTION_DEF(cfgs);
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(cfgs);
|
||||
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(cfgs);
|
||||
E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(cfgs);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: `call_stack` Type Hooks
|
||||
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack);
|
||||
E_TYPE_ACCESS_FUNCTION_DEF(call_stack);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: `environment` Type Hooks
|
||||
|
||||
E_TYPE_ACCESS_FUNCTION_DEF(environment);
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(environment);
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(environment);
|
||||
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(environment);
|
||||
E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(environment);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: `unattached_processes` Type Hooks
|
||||
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes);
|
||||
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(unattached_processes);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Control Entity List Type Hooks (`processes`, `threads`, etc.)
|
||||
|
||||
E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities);
|
||||
E_LOOKUP_ACCESS_FUNCTION_DEF(ctrl_entities);
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(ctrl_entities);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Debug Info Tables Eval Hooks
|
||||
|
||||
E_LOOKUP_INFO_FUNCTION_DEF(debug_info_table);
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table);
|
||||
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(debug_info_table);
|
||||
E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(debug_info_table);
|
||||
#endif
|
||||
|
||||
#endif // RADDBG_EVAL_H
|
||||
@@ -2,5 +2,6 @@
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
#include "raddbg_core.c"
|
||||
#include "raddbg_eval.c"
|
||||
#include "raddbg_widgets.c"
|
||||
#include "raddbg_views.c"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#define RADDBG_INC_H
|
||||
|
||||
#include "raddbg_core.h"
|
||||
#include "raddbg_eval.h"
|
||||
#include "raddbg_widgets.h"
|
||||
#include "raddbg_views.h"
|
||||
|
||||
|
||||
+45
-47
@@ -943,37 +943,32 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
// rjf: unpack key & block
|
||||
EV_Block *block = row->block;
|
||||
EV_Key key = row->key;
|
||||
E_IRTreeAndType parent_irtree = e_irtree_and_type_from_expr(scratch.arena, block->expr);
|
||||
E_Type *parent_type = e_type_from_key__cached(parent_irtree.type_key);
|
||||
E_Eval block_eval = e_eval_from_expr(scratch.arena, row->block->expr);
|
||||
E_Eval block_eval = row->block->eval;
|
||||
E_TypeKey block_type_key = block_eval.irtree.type_key;
|
||||
E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key);
|
||||
E_Type *block_type = e_type_from_key__cached(block_type_key);
|
||||
|
||||
// rjf: fill row's eval
|
||||
info.eval = e_eval_from_expr(arena, row->expr);
|
||||
|
||||
// rjf: determine if row's expression is editable
|
||||
if(block_type->flags & E_TypeFlag_EditableChildren || row->expr == &e_expr_nil)
|
||||
if(block_type->flags & E_TypeFlag_EditableChildren || row->eval.expr == &e_expr_nil)
|
||||
{
|
||||
info.expr_is_editable = 1;
|
||||
}
|
||||
|
||||
// rjf: determine row's module
|
||||
CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(info.eval.space);
|
||||
CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row->eval.space);
|
||||
CTRL_Entity *row_module = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->module);
|
||||
if(info.eval.space.kind == RD_EvalSpaceKind_CtrlEntity)
|
||||
if(row->eval.space.kind == RD_EvalSpaceKind_CtrlEntity)
|
||||
{
|
||||
switch(row_ctrl_entity->kind)
|
||||
{
|
||||
default:
|
||||
case CTRL_EntityKind_Process:
|
||||
if(info.eval.irtree.mode == E_Mode_Offset)
|
||||
if(row->eval.irtree.mode == E_Mode_Offset)
|
||||
{
|
||||
info.module = ctrl_module_from_process_vaddr(row_ctrl_entity, info.eval.value.u64);
|
||||
info.module = ctrl_module_from_process_vaddr(row_ctrl_entity, row->eval.value.u64);
|
||||
}break;
|
||||
case CTRL_EntityKind_Thread:
|
||||
if(info.eval.irtree.mode == E_Mode_Value)
|
||||
if(row->eval.irtree.mode == E_Mode_Value)
|
||||
{
|
||||
CTRL_Entity *process = ctrl_process_from_entity(row_ctrl_entity);
|
||||
info.module = ctrl_module_from_process_vaddr(process, d_query_cached_rip_from_thread(row_ctrl_entity));
|
||||
@@ -988,7 +983,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
if(entity->kind == CTRL_EntityKind_Thread)
|
||||
{
|
||||
info.callstack_thread = entity;
|
||||
U64 frame_num = block->lookup_rule->num_from_id(key.child_id, block->lookup_rule_user_data);
|
||||
U64 frame_num = ev_block_num_from_id(block, key.child_id);
|
||||
CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity);
|
||||
CTRL_CallStack call_stack = ctrl_call_stack_from_unwind(scratch.arena, di_scope, ctrl_process_from_entity(entity), &unwind);
|
||||
if(1 <= frame_num && frame_num <= call_stack.count)
|
||||
@@ -1005,7 +1000,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery ||
|
||||
block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity))
|
||||
{
|
||||
info.group_entity = rd_ctrl_entity_from_eval_space(info.eval.space);
|
||||
info.group_entity = rd_ctrl_entity_from_eval_space(row->eval.space);
|
||||
}
|
||||
|
||||
// rjf: determine cfg group name / parent
|
||||
@@ -1037,8 +1032,8 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
}
|
||||
|
||||
// rjf: determine cfgs/entities that this row is evaluating
|
||||
RD_Cfg *evalled_cfg = rd_cfg_from_eval_space(info.eval.space);
|
||||
CTRL_Entity *evalled_entity = (info.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ? rd_ctrl_entity_from_eval_space(info.eval.space) : &ctrl_entity_nil);
|
||||
RD_Cfg *evalled_cfg = rd_cfg_from_eval_space(row->eval.space);
|
||||
CTRL_Entity *evalled_entity = (row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ? rd_ctrl_entity_from_eval_space(row->eval.space) : &ctrl_entity_nil);
|
||||
|
||||
// rjf: determine if this cfg/entity evaluation is top-level - e.g. if we
|
||||
// are evaluating a cfg tree, or some descendant of it
|
||||
@@ -1046,33 +1041,36 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
if(evalled_cfg != &rd_nil_cfg)
|
||||
{
|
||||
E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, evalled_cfg->string);
|
||||
is_top_level = (info.eval.value.u64 == 0 && e_type_key_match(top_level_type_key, info.eval.irtree.type_key));
|
||||
is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key));
|
||||
}
|
||||
if(evalled_entity != &ctrl_entity_nil)
|
||||
{
|
||||
String8 top_level_name = ctrl_entity_kind_code_name_table[evalled_entity->kind];
|
||||
E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, top_level_name);
|
||||
is_top_level = (info.eval.value.u64 == 0 && e_type_key_match(top_level_type_key, info.eval.irtree.type_key));
|
||||
is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key));
|
||||
}
|
||||
|
||||
// rjf: determine view ui rule
|
||||
info.view_ui_rule = rd_view_ui_rule_from_string(row->block->expand_rule->string);
|
||||
// TODO(rjf): @eval
|
||||
info.view_ui_rule = &rd_nil_view_ui_rule; // rd_view_ui_rule_from_string(row->block->expand_rule->string);
|
||||
#if 0 // TODO(rjf): @eval
|
||||
if(info.view_ui_rule != &rd_nil_view_ui_rule)
|
||||
{
|
||||
info.view_ui_tag = row->block->expand_tag;
|
||||
}
|
||||
#endif
|
||||
|
||||
// rjf: fill row's cells
|
||||
{
|
||||
if(0){}
|
||||
|
||||
// rjf: folder / file rows
|
||||
else if(info.eval.space.kind == E_SpaceKind_FileSystem)
|
||||
else if(row->eval.space.kind == E_SpaceKind_FileSystem)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(info.eval.irtree.type_key);
|
||||
E_Type *type = e_type_from_key__cached(row->eval.irtree.type_key);
|
||||
if(type->kind == E_TypeKind_Set)
|
||||
{
|
||||
String8 file_path = e_string_from_id(info.eval.value.u64);
|
||||
String8 file_path = e_string_from_id(row->eval.value.u64);
|
||||
DR_FStrList fstrs = rd_title_fstrs_from_file_path(arena, file_path);
|
||||
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr,
|
||||
.flags = RD_WatchCellFlag_Button|RD_WatchCellFlag_IsNonCode,
|
||||
@@ -1098,13 +1096,13 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
}
|
||||
|
||||
// rjf: singular button for unattached processes
|
||||
else if(info.eval.space.kind == RD_EvalSpaceKind_MetaUnattachedProcess)
|
||||
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaUnattachedProcess)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(info.eval.irtree.type_key);
|
||||
E_Type *type = e_type_from_key__cached(row->eval.irtree.type_key);
|
||||
if(str8_match(type->name, str8_lit("unattached_process"), 0))
|
||||
{
|
||||
U64 pid = info.eval.value.u128.u64[0];
|
||||
String8 name = e_string_from_id(info.eval.value.u128.u64[1]);
|
||||
U64 pid = row->eval.value.u128.u64[0];
|
||||
String8 name = e_string_from_id(row->eval.value.u128.u64[1]);
|
||||
DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit("text")), ui_top_font_size()};
|
||||
DR_FStrList fstrs = {0};
|
||||
UI_TagF("weak")
|
||||
@@ -1217,22 +1215,22 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
}
|
||||
|
||||
// rjf: singular row for queries
|
||||
else if(info.eval.space.kind == RD_EvalSpaceKind_MetaQuery)
|
||||
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaQuery)
|
||||
{
|
||||
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .pct = 1.f);
|
||||
}
|
||||
|
||||
// rjf: singular button for commands
|
||||
else if(info.eval.space.kind == RD_EvalSpaceKind_MetaCmd)
|
||||
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaCmd)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(info.eval.irtree.type_key);
|
||||
E_Type *type = e_type_from_key__cached(row->eval.irtree.type_key);
|
||||
if(type->kind == E_TypeKind_Set)
|
||||
{
|
||||
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = 0, .pct = 1.f);
|
||||
}
|
||||
else
|
||||
{
|
||||
String8 cmd_name = e_string_from_id(e_value_eval_from_eval(info.eval).value.u64);
|
||||
String8 cmd_name = e_string_from_id(e_value_eval_from_eval(row->eval).value.u64);
|
||||
RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);
|
||||
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Button|RD_WatchCellFlag_ActivateWithSingleClick, .pct = 1.f, .fstrs = rd_title_fstrs_from_code_name(arena, cmd_kind_info->string));
|
||||
}
|
||||
@@ -1245,28 +1243,28 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
}
|
||||
|
||||
// rjf: for 'add-new' rows in meta-cfg evaluation spaces, only do expr
|
||||
else if(info.eval.exprs.last == &e_expr_nil && info.group_cfg_name.size != 0 && info.group_cfg_child == &rd_nil_cfg)
|
||||
else if(row->eval.expr == &e_expr_nil && info.group_cfg_name.size != 0 && info.group_cfg_child == &rd_nil_cfg)
|
||||
{
|
||||
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .pct = 1.f);
|
||||
}
|
||||
|
||||
// rjf: for meta-evaluation space booleans, only do expr
|
||||
else if(e_type_kind_from_key(info.eval.irtree.type_key) == E_TypeKind_Bool &&
|
||||
(info.eval.space.kind == RD_EvalSpaceKind_MetaCfg ||
|
||||
info.eval.space.kind == RD_EvalSpaceKind_MetaCmd ||
|
||||
info.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity))
|
||||
else if(e_type_kind_from_key(row->eval.irtree.type_key) == E_TypeKind_Bool &&
|
||||
(row->eval.space.kind == RD_EvalSpaceKind_MetaCfg ||
|
||||
row->eval.space.kind == RD_EvalSpaceKind_MetaCmd ||
|
||||
row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity))
|
||||
{
|
||||
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .pct = 1.f);
|
||||
}
|
||||
|
||||
// rjf: for meta-cfg evaluation spaces, only do expr/value
|
||||
else if(info.eval.space.kind == RD_EvalSpaceKind_MetaCfg ||
|
||||
info.eval.space.kind == RD_EvalSpaceKind_MetaCmd ||
|
||||
info.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||
|
||||
info.eval.space.kind == E_SpaceKind_File)
|
||||
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaCfg ||
|
||||
row->eval.space.kind == RD_EvalSpaceKind_MetaCmd ||
|
||||
row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||
|
||||
row->eval.space.kind == E_SpaceKind_File)
|
||||
{
|
||||
if(e_type_kind_from_key(info.eval.irtree.type_key) == E_TypeKind_Array &&
|
||||
e_type_kind_from_key(e_type_direct_from_key(info.eval.irtree.type_key)) == E_TypeKind_U8)
|
||||
if(e_type_kind_from_key(row->eval.irtree.type_key) == E_TypeKind_Array &&
|
||||
e_type_kind_from_key(e_type_direct_from_key(row->eval.irtree.type_key)) == E_TypeKind_U8)
|
||||
{
|
||||
info.can_expand = 0;
|
||||
}
|
||||
@@ -1371,11 +1369,11 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
|
||||
{
|
||||
result.flags |= RD_WatchCellFlag_CanEdit;
|
||||
}
|
||||
result.eval = (cell->eval.irtree.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, row->expr));
|
||||
result.eval = (cell->eval.irtree.mode != E_Mode_Null ? cell->eval : row->eval);
|
||||
result.string = row->string;
|
||||
if(result.string.size == 0)
|
||||
{
|
||||
E_Expr *notable_expr = row->expr;
|
||||
E_Expr *notable_expr = row->eval.expr;
|
||||
for(B32 good = 0; !good;)
|
||||
{
|
||||
switch(notable_expr->kind)
|
||||
@@ -1451,7 +1449,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
|
||||
|
||||
//- rjf: use cell's wrap string to wrap row's expression
|
||||
String8 wrap_string = cell->string;
|
||||
E_Expr *root_expr = row->expr;
|
||||
E_Expr *root_expr = row->eval.expr;
|
||||
if(wrap_string.size != 0)
|
||||
{
|
||||
E_Expr *wrap_expr = e_parse_expr_from_text(scratch.arena, wrap_string).exprs.last;
|
||||
@@ -1470,7 +1468,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
|
||||
{
|
||||
if(t->expr->kind == E_ExprKind_LeafIdentifier && str8_match(t->expr->string, str8_lit("$expr"), 0))
|
||||
{
|
||||
E_Expr *original_expr_ref = e_expr_ref(scratch.arena, row->expr);
|
||||
E_Expr *original_expr_ref = e_expr_ref(scratch.arena, row->eval.expr);
|
||||
if(t->parent != &e_expr_nil)
|
||||
{
|
||||
e_expr_insert_child(t->parent, t->expr, original_expr_ref);
|
||||
@@ -1526,7 +1524,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
|
||||
//- rjf: view ui cells
|
||||
case RD_WatchCellKind_ViewUI:
|
||||
{
|
||||
result.eval = (cell->eval.irtree.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, row->expr));
|
||||
result.eval = (cell->eval.irtree.mode != E_Mode_Null ? cell->eval : row->eval);
|
||||
result.view_ui_rule = row_info->view_ui_rule;
|
||||
result.view_ui_tag = row_info->view_ui_tag;
|
||||
}break;
|
||||
@@ -1948,7 +1946,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm)
|
||||
//
|
||||
B32 auto_selected = 0;
|
||||
E_Space auto_space = {0};
|
||||
if(eval.exprs.last == &e_expr_nil)
|
||||
if(eval.expr == &e_expr_nil)
|
||||
{
|
||||
if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == ctrl_run_gen())
|
||||
{
|
||||
|
||||
@@ -88,7 +88,6 @@ struct RD_WatchCellList
|
||||
typedef struct RD_WatchRowInfo RD_WatchRowInfo;
|
||||
struct RD_WatchRowInfo
|
||||
{
|
||||
E_Eval eval;
|
||||
CTRL_Entity *module;
|
||||
B32 can_expand;
|
||||
B32 expr_is_editable;
|
||||
|
||||
Reference in New Issue
Block a user