expand eval to collecting irtree/type/lookup-rule, base all value string generation on entire root_eval rather than just root_expr; fixes wrong inheritance of tags in single-line visualization

This commit is contained in:
Ryan Fleury
2025-02-20 19:16:27 -08:00
parent 92df402ad1
commit 04c40e8359
7 changed files with 107 additions and 163 deletions
+23 -85
View File
@@ -16,18 +16,19 @@ 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_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
E_Interpretation interp = e_interpret(bytecode);
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, exprs.last);
E_LookupRuleTagPair lookup = e_lookup_rule_tag_pair_from_expr_irtree(exprs.last, &irtree);
E_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
E_Interpretation interp = e_interpret(bytecode);
E_Eval eval =
{
.value = interp.value,
.mode = irtree.mode,
.space = interp.space,
.exprs = exprs,
.type_key = irtree.type_key,
.code = interp.code,
.value = interp.value,
.space = interp.space,
.exprs = exprs,
.irtree = irtree,
.lookup_rule_tag = lookup,
.code = interp.code,
};
e_msg_list_concat_in_place(&eval.msgs, &irtree.msgs);
if(E_InterpretationCode_Good < eval.code && eval.code < E_InterpretationCode_COUNT)
@@ -68,10 +69,10 @@ e_autoresolved_eval_from_eval(E_Eval eval)
e_interpret_ctx &&
e_parse_state->ctx->modules_count > 0 &&
e_interpret_ctx->module_base != 0 &&
(e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S64)) ||
e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U64)) ||
e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S32)) ||
e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U32))))
(e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S64)) ||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U64)) ||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S32)) ||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U32))))
{
U64 vaddr = eval.value.u64;
U64 voff = vaddr - e_interpret_ctx->module_base[0];
@@ -84,7 +85,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), 1, 0);
eval.irtree.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;
@@ -93,7 +94,7 @@ e_autoresolved_eval_from_eval(E_Eval eval)
internal E_Eval
e_dynamically_typed_eval_from_eval(E_Eval eval)
{
E_TypeKey type_key = eval.type_key;
E_TypeKey type_key = eval.irtree.type_key;
E_TypeKind type_kind = e_type_kind_from_key(type_key);
if(e_type_state != 0 &&
e_interpret_ctx != 0 &&
@@ -151,7 +152,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
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, 1, 0);
eval.type_key = ptr_to_derived_type_key;
eval.irtree.type_key = ptr_to_derived_type_key;
}
}
}
@@ -166,13 +167,13 @@ internal E_Eval
e_value_eval_from_eval(E_Eval eval)
{
ProfBeginFunction();
if(eval.mode == E_Mode_Offset)
if(eval.irtree.mode == E_Mode_Offset)
{
E_TypeKey type_key = e_type_unwrap(eval.type_key);
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
E_TypeKind type_kind = e_type_kind_from_key(type_key);
if(type_kind == E_TypeKind_Array)
{
eval.mode = E_Mode_Value;
eval.irtree.mode = E_Mode_Value;
}
else
{
@@ -183,7 +184,7 @@ e_value_eval_from_eval(E_Eval eval)
type_byte_size <= sizeof(E_Value) &&
e_space_read(eval.space, &eval.value, value_vaddr_range))
{
eval.mode = E_Mode_Value;
eval.irtree.mode = E_Mode_Value;
// rjf: mask&shift, for bitfields
if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64))
@@ -197,7 +198,7 @@ e_value_eval_from_eval(E_Eval eval)
}
eval.value.u64 = eval.value.u64 >> type->off;
eval.value.u64 = eval.value.u64 & valid_bits_mask;
eval.type_key = type->direct_type_key;
eval.irtree.type_key = type->direct_type_key;
scratch_end(scratch);
}
@@ -219,69 +220,6 @@ e_value_eval_from_eval(E_Eval eval)
return eval;
}
internal E_Eval
e_element_eval_from_array_eval_index(E_Eval eval, U64 index)
{
E_Eval result = {0};
result.mode = eval.mode;
result.space = eval.space;
result.type_key = e_type_direct_from_key(eval.type_key);
result.code = eval.code;
result.msgs = eval.msgs;
U64 element_size = e_type_byte_size_from_key(result.type_key);
switch(eval.mode)
{
default:{}break;
case E_Mode_Value:
if(element_size <= sizeof(E_Value) &&
index < sizeof(E_Value)/element_size)
{
MemoryCopy((U8 *)(&result.value.u512[0]),
(U8 *)(&eval.value.u512[0]) + index*element_size,
element_size);
}break;
case E_Mode_Offset:
{
result.value.u64 = eval.value.u64 + element_size*index;
}break;
}
return result;
}
internal E_Eval
e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name)
{
E_Eval result = {0};
{
E_Member member = e_type_member_from_key_name__cached(eval.type_key, member_name);
if(member.kind != E_MemberKind_Null)
{
result.mode = eval.mode;
result.space = eval.space;
result.type_key = member.type_key;
result.code = eval.code;
result.msgs = eval.msgs;
switch(eval.mode)
{
default:{}break;
case E_Mode_Value:
if(member.off < sizeof(eval.value))
{
U64 member_size = e_type_byte_size_from_key(member.type_key);
MemoryCopy((U8 *)(&result.value.u512[0]),
(U8 *)(&eval.value.u512[0]) + member.off,
Min(member_size, sizeof(eval.value) - member.off));
}break;
case E_Mode_Offset:
{
result.value.u64 = eval.value.u64 + member.off;
}break;
}
}
}
return result;
}
internal E_Value
e_value_from_string(String8 string)
{
+2 -4
View File
@@ -11,10 +11,10 @@ typedef struct E_Eval E_Eval;
struct E_Eval
{
E_Value value;
E_Mode mode;
E_Space space;
E_ExprChain exprs;
E_TypeKey type_key;
E_IRTreeAndType irtree;
E_LookupRuleTagPair lookup_rule_tag;
E_InterpretationCode code;
E_MsgList msgs;
};
@@ -29,8 +29,6 @@ internal E_Eval e_eval_from_stringf(Arena *arena, char *fmt, ...);
internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval);
internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval);
internal E_Eval e_value_eval_from_eval(E_Eval eval);
internal E_Eval e_element_eval_from_array_eval_index(E_Eval eval, U64 index);
internal E_Eval e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name);
internal E_Value e_value_from_string(String8 string);
internal E_Value e_value_from_stringf(char *fmt, ...);
internal E_Value e_value_from_expr(E_Expr *expr);
@@ -1341,7 +1341,7 @@ internal String8
ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, U32 min_digits, E_Eval eval)
{
String8 result = {0};
E_TypeKey type_key = e_type_unwrap(eval.type_key);
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
E_TypeKind type_kind = e_type_kind_from_key(type_key);
U64 type_byte_size = e_type_byte_size_from_key(type_key);
U8 digit_group_separator = 0;
+55 -47
View File
@@ -85,7 +85,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(watches)
if(filter.size != 0)
{
E_Eval eval = e_eval_from_string(scratch.arena, expr);
E_Type *type = e_type_from_key__cached(eval.type_key);
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
if(type->kind != E_TypeKind_Set)
{
passes_filter = 0;
@@ -3120,12 +3120,12 @@ internal B32
rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_unescaping)
{
B32 result = 0;
if(dst_eval.mode == E_Mode_Offset)
if(dst_eval.irtree.mode == E_Mode_Offset)
{
Temp scratch = scratch_begin(0, 0);
E_TypeKey type_key = e_type_unwrap(dst_eval.type_key);
E_TypeKey type_key = e_type_unwrap(dst_eval.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(e_type_unwrap(dst_eval.type_key)));
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(dst_eval.irtree.type_key)));
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
String8 commit_data = {0};
B32 commit_at_ptr_dest = 0;
@@ -3142,7 +3142,7 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_un
{
E_Eval src_eval = e_eval_from_string(scratch.arena, string);
E_Eval src_eval_value = e_value_eval_from_eval(src_eval);
E_TypeKind src_eval_value_type_kind = e_type_kind_from_key(src_eval_value.type_key);
E_TypeKind src_eval_value_type_kind = e_type_kind_from_key(src_eval_value.irtree.type_key);
if(direct_type_kind == E_TypeKind_Char8 ||
direct_type_kind == E_TypeKind_Char16 ||
direct_type_kind == E_TypeKind_Char32 ||
@@ -3201,17 +3201,17 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_un
else if(type_kind == E_TypeKind_Ptr &&
(e_type_kind_is_pointer_or_ref(src_eval_value_type_kind) ||
e_type_kind_is_integer(src_eval_value_type_kind)) &&
src_eval_value.mode == E_Mode_Value)
src_eval_value.irtree.mode == E_Mode_Value)
{
commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value));
commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(src_eval.type_key));
commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(src_eval.irtree.type_key));
commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key));
}
}
if(commit_data.size != 0 && e_type_byte_size_from_key(type_key) != 0)
{
U64 dst_offset = dst_eval.value.u64;
if(dst_eval.mode == E_Mode_Offset && commit_at_ptr_dest)
if(dst_eval.irtree.mode == E_Mode_Offset && commit_at_ptr_dest)
{
E_Eval dst_value_eval = e_value_eval_from_eval(dst_eval);
dst_offset = dst_value_eval.value.u64;
@@ -4177,7 +4177,7 @@ rd_view_ui(Rng2F32 rect)
case RD_WatchCellKind_Eval:
{
RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px);
if(cell_info.eval.mode == E_Mode_Offset)
if(cell_info.eval.irtree.mode == E_Mode_Offset)
{
B32 should_commit_asap = editing_complete;
if(cell_info.eval.space.kind == RD_EvalSpaceKind_MetaCfg)
@@ -4870,7 +4870,7 @@ rd_view_ui(Rng2F32 rect)
ProfBegin("determine if row's data is fresh and/or bad");
B32 row_is_fresh = 0;
B32 row_is_bad = 0;
switch(row_info->eval.mode)
switch(row_info->eval.irtree.mode)
{
default:{}break;
case E_Mode_Offset:
@@ -4878,7 +4878,7 @@ rd_view_ui(Rng2F32 rect)
CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(row_info->eval.space);
if(row_info->eval.space.kind == RD_EvalSpaceKind_CtrlEntity && space_entity->kind == CTRL_EntityKind_Process)
{
U64 size = e_type_byte_size_from_key(row_info->eval.type_key);
U64 size = e_type_byte_size_from_key(row_info->eval.irtree.type_key);
size = Min(size, 64);
Rng1U64 vaddr_rng = r1u64(row_info->eval.value.u64, row_info->eval.value.u64+size);
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, space_entity->handle, vaddr_rng, d_state->frame_eval_memread_endt_us);
@@ -4940,7 +4940,7 @@ rd_view_ui(Rng2F32 rect)
if(row_info->eval.space.kind == RD_EvalSpaceKind_CtrlEntity && row_info->view_ui_rule == &rd_nil_view_ui_rule)
{
U64 row_offset = row_info->eval.value.u64;
if((row_info->eval.mode == E_Mode_Offset || row_info->eval.mode == E_Mode_Null) &&
if((row_info->eval.irtree.mode == E_Mode_Offset || row_info->eval.irtree.mode == E_Mode_Null) &&
row_offset%64 == 0 && row_depth > 0)
{
ui_set_next_fixed_x(0);
@@ -4956,12 +4956,12 @@ rd_view_ui(Rng2F32 rect)
//
if(row_info->eval.space.kind == RD_EvalSpaceKind_CtrlEntity && row_info->view_ui_rule == &rd_nil_view_ui_rule)
{
if((row_info->eval.mode == E_Mode_Offset || row_info->eval.mode == E_Mode_Null) &&
if((row_info->eval.irtree.mode == E_Mode_Offset || row_info->eval.irtree.mode == E_Mode_Null) &&
row_info->eval.value.u64%64 != 0 &&
row_depth > 0 &&
!row_expanded)
{
U64 next_off = (row_info->eval.value.u64 + e_type_byte_size_from_key(row_info->eval.type_key));
U64 next_off = (row_info->eval.value.u64 + e_type_byte_size_from_key(row_info->eval.irtree.type_key));
if(next_off%64 != 0 && row_info->eval.value.u64/64 < next_off/64)
{
ui_set_next_fixed_x(0);
@@ -5622,7 +5622,7 @@ rd_view_cfg_value_from_string(String8 string)
internal U64
rd_base_offset_from_eval(E_Eval eval)
{
if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(eval.type_key)))
if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(eval.irtree.type_key)))
{
eval = e_value_eval_from_eval(eval);
}
@@ -5641,23 +5641,23 @@ rd_range_from_eval_tag(E_Eval eval, E_Expr *tag)
break;
}
}
E_TypeKey type_key = e_type_unwrap(eval.type_key);
E_TypeKey type_key = e_type_unwrap(eval.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(eval.type_key));
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(eval.irtree.type_key));
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
if(size == 0 && 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 ||
direct_type_kind == E_TypeKind_Array))
{
size = e_type_byte_size_from_key(e_type_direct_from_key(e_type_unwrap(eval.type_key)));
size = e_type_byte_size_from_key(e_type_direct_from_key(e_type_unwrap(eval.irtree.type_key)));
}
if(size == 0 && eval.mode == E_Mode_Offset && (type_kind == E_TypeKind_Struct ||
type_kind == E_TypeKind_Union ||
type_kind == E_TypeKind_Class ||
type_kind == E_TypeKind_Array))
if(size == 0 && eval.irtree.mode == E_Mode_Offset && (type_kind == E_TypeKind_Struct ||
type_kind == E_TypeKind_Union ||
type_kind == E_TypeKind_Class ||
type_kind == E_TypeKind_Array))
{
size = e_type_byte_size_from_key(e_type_unwrap(eval.type_key));
size = e_type_byte_size_from_key(e_type_unwrap(eval.irtree.type_key));
}
if(size == 0)
{
@@ -6520,7 +6520,7 @@ rd_window_frame(void)
rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), rd_state->drag_drop_regs->expr);
ui_spacer(ui_em(2.f, 1.f));
E_Eval eval = e_eval_from_string(scratch.arena, rd_state->drag_drop_regs->expr);
if(eval.mode != E_Mode_Null)
if(eval.irtree.mode != E_Mode_Null)
{
String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), EV_StringFlag_ReadOnlyDisplayRules, 10, ui_top_font(), ui_top_font_size(), ui_top_font_size()*20.f, eval);
rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), value_string);
@@ -9858,7 +9858,7 @@ rd_window_frame(void)
//~ rjf: Eval Visualization
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_Expr *root_expr, E_Eval eval, String8List *out)
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)
{
ProfBeginFunction();
Temp scratch = scratch_begin(&arena, 1);
@@ -9870,7 +9870,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
B32 no_addr = 0;
B32 no_string = 0;
B32 has_array = 0;
for(E_Expr *tag = root_expr->first_tag; tag != &e_expr_nil; tag = tag->next)
for(E_Expr *tag = root_eval.exprs.last->first_tag; tag != &e_expr_nil; tag = tag->next)
{
if(0){}
else if(str8_match(tag->string, str8_lit("dec"), 0)) {radix = 10;}
@@ -9891,14 +9891,14 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
if(eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||
eval.space.kind == RD_EvalSpaceKind_MetaCfg)
{
E_TypeKind kind = e_type_kind_from_key(eval.type_key);
E_TypeKind kind = e_type_kind_from_key(eval.irtree.type_key);
if(kind != E_TypeKind_Ptr)
{
no_addr = 1;
}
else
{
E_Type *type = e_type_from_key__cached(eval.type_key);
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
if(!(type->flags & E_TypeFlag_External))
{
no_addr = 1;
@@ -9938,16 +9938,16 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
}
//- rjf: type evaluations -> display type string
if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key))
if(eval.irtree.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.irtree.type_key))
{
String8 string = e_type_string_from_key(arena, eval.type_key);
String8 string = e_type_string_from_key(arena, eval.irtree.type_key);
str8_list_push(arena, out, string);
}
//- rjf: value/offset evaluations
else if(max_size > 0)
{
E_TypeKey type_key = e_type_unwrap(eval.type_key);
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
E_TypeKind kind = e_type_kind_from_key(type_key);
switch(kind)
{
@@ -9967,7 +9967,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
case E_TypeKind_RRef:
{
// rjf: unpack type info
E_TypeKey type_key = e_type_unwrap(eval.type_key);
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
E_Type *type = e_type_from_key__cached(type_key);
E_TypeKind type_kind = type->kind;
E_TypeKey direct_type_key = e_type_unwrap(e_type_ptee_from_key(type_key));
@@ -10101,15 +10101,19 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
{
E_Expr *deref_expr = e_expr_ref_deref(scratch.arena, eval.exprs.last);
E_Eval deref_eval = e_eval_from_expr(scratch.arena, deref_expr);
space_taken += rd_append_value_strings_from_eval(arena, filter, flags, radix, font, font_size, max_size-space_taken, depth+1, root_expr, deref_eval, out);
space_taken += rd_append_value_strings_from_eval(arena, filter, flags, radix, font, font_size, max_size-space_taken, depth+1, root_eval, deref_eval, out);
}
else
{
// rjf: unpack
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last);
E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.exprs.last, &irtree);
E_LookupRule *lookup_rule = lookup_rule_and_tag.rule;
E_Expr *lookup_rule_tag = lookup_rule_and_tag.tag;
E_IRTreeAndType irtree = eval.irtree;
E_LookupRule *lookup_rule = eval.lookup_rule_tag.rule;
E_Expr *lookup_rule_tag = eval.lookup_rule_tag.tag;
if(lookup_rule == &e_lookup_rule__default)
{
lookup_rule = root_eval.lookup_rule_tag.rule;
lookup_rule_tag = root_eval.lookup_rule_tag.tag;
}
E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, lookup_rule_tag, filter);
U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count);
String8 opener_string = str8_lit("[");
@@ -10139,7 +10143,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
}
is_first = 0;
E_Eval child_eval = e_eval_from_expr(scratch.arena, expr);
space_taken += rd_append_value_strings_from_eval(arena, filter, flags, radix, font, font_size, max_size-space_taken, depth+1, root_expr, child_eval, out);
space_taken += rd_append_value_strings_from_eval(arena, filter, flags, radix, font, font_size, max_size-space_taken, depth+1, root_eval, child_eval, out);
if(space_taken > max_size && idx+1 < total_possible_child_count)
{
String8 ellipses = str8_lit(", ...");
@@ -10170,7 +10174,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
case E_TypeKind_Array:
{
// rjf: unpack type info
E_Type *eval_type = e_type_from_key__cached(e_type_unwrap(eval.type_key));
E_Type *eval_type = e_type_from_key__cached(e_type_unwrap(eval.irtree.type_key));
E_TypeKey direct_type_key = e_type_unwrap(eval_type->direct_type_key);
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
U64 array_count = eval_type->count;
@@ -10188,7 +10192,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
did_content = 1;
U64 string_buffer_size = Clamp(1, array_count, 1024);
U8 *string_buffer = push_array(arena, U8, string_buffer_size);
switch(eval.mode)
switch(eval.irtree.mode)
{
default:{}break;
case E_Mode_Offset:
@@ -10240,10 +10244,14 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
arrays_and_sets_and_structs:
{
// rjf: unpack
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last);
E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.exprs.last, &irtree);
E_LookupRule *lookup_rule = lookup_rule_and_tag.rule;
E_Expr *lookup_rule_tag = lookup_rule_and_tag.tag;
E_IRTreeAndType irtree = eval.irtree;
E_LookupRule *lookup_rule = eval.lookup_rule_tag.rule;
E_Expr *lookup_rule_tag = eval.lookup_rule_tag.tag;
if(lookup_rule == &e_lookup_rule__default)
{
lookup_rule = root_eval.lookup_rule_tag.rule;
lookup_rule_tag = root_eval.lookup_rule_tag.tag;
}
E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, lookup_rule_tag, filter);
U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count);
String8 opener_string = str8_lit("{");
@@ -10279,7 +10287,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
}
is_first = 0;
E_Eval child_eval = e_eval_from_expr(scratch.arena, expr);
space_taken += rd_append_value_strings_from_eval(arena, filter, flags, radix, font, font_size, max_size-space_taken, depth+1, root_expr, child_eval, out);
space_taken += rd_append_value_strings_from_eval(arena, filter, flags, radix, font, font_size, max_size-space_taken, depth+1, root_eval, child_eval, out);
if(space_taken > max_size && idx+1 < total_possible_child_count)
{
String8 ellipses = str8_lit(", ...");
@@ -10315,7 +10323,7 @@ rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U3
{
Temp scratch = scratch_begin(&arena, 1);
String8List strs = {0};
rd_append_value_strings_from_eval(scratch.arena, filter, flags, default_radix, font, font_size, max_size, 0, eval.exprs.last, eval, &strs);
rd_append_value_strings_from_eval(scratch.arena, filter, flags, default_radix, font, font_size, max_size, 0, eval, eval, &strs);
String8 result = str8_list_join(arena, &strs, 0);
scratch_end(scratch);
return result;
@@ -11843,7 +11851,7 @@ rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 string)
E_Eval eval = e_eval_from_string(scratch.arena, string);
if(eval.msgs.max_kind == E_MsgKind_Null)
{
E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_unwrap(eval.type_key));
E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_unwrap(eval.irtree.type_key));
if(eval_type_kind == E_TypeKind_Ptr ||
eval_type_kind == E_TypeKind_LRef ||
eval_type_kind == E_TypeKind_RRef)
+1 -1
View File
@@ -1123,7 +1123,7 @@ internal void rd_window_frame(void);
////////////////////////////////
//~ rjf: Eval Visualization
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_Expr *root_expr, E_Eval eval, String8List *out);
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);
////////////////////////////////
+23 -23
View File
@@ -782,7 +782,7 @@ rd_id_from_watch_cell(RD_WatchCell *cell)
result = e_hash_from_string(result, str8_struct(&cell->kind));
if(cell->kind != RD_WatchCellKind_Expr)
{
result = e_hash_from_string(result, str8_struct(&cell->eval.mode));
result = e_hash_from_string(result, str8_struct(&cell->eval.irtree.mode));
result = e_hash_from_string(result, str8_struct(&cell->index));
result = e_hash_from_string(result, str8_struct(&cell->default_pct));
}
@@ -903,7 +903,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
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_TypeKey block_type_key = block_eval.type_key;
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);
@@ -925,12 +925,12 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
{
default:
case CTRL_EntityKind_Process:
if(info.eval.mode == E_Mode_Offset)
if(info.eval.irtree.mode == E_Mode_Offset)
{
info.module = ctrl_module_from_process_vaddr(row_ctrl_entity, info.eval.value.u64);
}break;
case CTRL_EntityKind_Thread:
if(info.eval.mode == E_Mode_Value)
if(info.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));
@@ -996,13 +996,13 @@ 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.type_key));
is_top_level = (info.eval.value.u64 == 0 && e_type_key_match(top_level_type_key, info.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.type_key));
is_top_level = (info.eval.value.u64 == 0 && e_type_key_match(top_level_type_key, info.eval.irtree.type_key));
}
// rjf: determine view ui rule
@@ -1093,7 +1093,7 @@ 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)
{
E_Type *type = e_type_from_key__cached(info.eval.type_key);
E_Type *type = e_type_from_key__cached(info.eval.irtree.type_key);
if(str8_match(type->name, str8_lit("unattached_process"), 0))
{
U64 pid = info.eval.value.u128.u64[0];
@@ -1119,7 +1119,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
// rjf: singular button for commands
else if(info.eval.space.kind == RD_EvalSpaceKind_MetaCmd)
{
E_Type *type = e_type_from_key__cached(info.eval.type_key);
E_Type *type = e_type_from_key__cached(info.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);
@@ -1137,7 +1137,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
{
String8 file_path = e_string_from_id(info.eval.value.u64);
DR_FStrList fstrs = rd_title_fstrs_from_file_path(arena, file_path);
E_Type *type = e_type_from_key__cached(info.eval.type_key);
E_Type *type = e_type_from_key__cached(info.eval.irtree.type_key);
if(str8_match(type->name, str8_lit("folder"), 0))
{
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr,
@@ -1287,7 +1287,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
{
result.flags |= RD_WatchCellFlag_CanEdit;
}
result.eval = (cell->eval.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, row->expr));
result.eval = (cell->eval.irtree.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, row->expr));
result.string = row->string;
if(result.string.size == 0)
{
@@ -1392,7 +1392,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
}
//- rjf: evaluate wrapped expression
result.eval = (cell->eval.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, root_expr));
result.eval = (cell->eval.irtree.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, root_expr));
//- rjf: determine default radix
U32 default_radix = 10;
@@ -1404,8 +1404,8 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
//- rjf: generate strings/flags based on that expression & fill
result.string = rd_value_string_from_eval(arena, rd_view_search(), string_flags, default_radix, font, font_size, max_size_px, result.eval);
result.flags |= !!(ev_type_key_is_editable(result.eval.type_key) && result.eval.mode == E_Mode_Offset) * RD_WatchCellFlag_CanEdit;
E_Type *type = e_type_from_key__cached(result.eval.type_key);
result.flags |= !!(ev_type_key_is_editable(result.eval.irtree.type_key) && result.eval.irtree.mode == E_Mode_Offset) * RD_WatchCellFlag_CanEdit;
E_Type *type = e_type_from_key__cached(result.eval.irtree.type_key);
if(type->flags & (E_TypeFlag_IsPlainText|E_TypeFlag_IsPathText))
{
result.flags |= RD_WatchCellFlag_IsNonCode;
@@ -1425,7 +1425,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.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, row->expr));
result.eval = (cell->eval.irtree.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, row->expr));
result.view_ui_rule = row_info->view_ui_rule;
result.view_ui_tag = row_info->view_ui_tag;
}break;
@@ -1442,7 +1442,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
{
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(result.eval.space);
E_TypeKey cfg_type = e_string2typekey_map_lookup(rd_state->meta_name2type_map, ctrl_entity_kind_code_name_table[entity->kind]);
if(e_type_key_match(cfg_type, result.eval.type_key))
if(e_type_key_match(cfg_type, result.eval.irtree.type_key))
{
result.entity = entity;
}
@@ -1452,7 +1452,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
{
RD_Cfg *cfg = rd_cfg_from_eval_space(result.eval.space);
E_TypeKey cfg_type = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg->string);
if(e_type_key_match(cfg_type, result.eval.type_key))
if(e_type_key_match(cfg_type, result.eval.irtree.type_key))
{
result.cfg = cfg;
}
@@ -1475,7 +1475,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
{
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(result.eval.space);
E_TypeKey cfg_type = e_string2typekey_map_lookup(rd_state->meta_name2type_map, ctrl_entity_kind_code_name_table[entity->kind]);
if(e_type_key_match(cfg_type, result.eval.type_key))
if(e_type_key_match(cfg_type, result.eval.irtree.type_key))
{
result.fstrs = rd_title_fstrs_from_ctrl_entity(arena, entity, 1);
result.flags |= RD_WatchCellFlag_Button;
@@ -1487,7 +1487,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
{
RD_Cfg *cfg = rd_cfg_from_eval_space(result.eval.space);
E_TypeKey cfg_type = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg->string);
if(e_type_key_match(cfg_type, result.eval.type_key))
if(e_type_key_match(cfg_type, result.eval.irtree.type_key))
{
result.fstrs = rd_title_fstrs_from_cfg(arena, cfg);
result.flags |= RD_WatchCellFlag_Button;
@@ -2361,10 +2361,10 @@ RD_VIEW_UI_FUNCTION_DEF(memory)
{
String8 local_name = n->string;
E_Eval local_eval = e_eval_from_string(scratch.arena, local_name);
if(local_eval.mode == E_Mode_Offset)
if(local_eval.irtree.mode == E_Mode_Offset)
{
E_TypeKind local_eval_type_kind = e_type_kind_from_key(local_eval.type_key);
U64 local_eval_type_size = e_type_byte_size_from_key(local_eval.type_key);
E_TypeKind local_eval_type_kind = e_type_kind_from_key(local_eval.irtree.type_key);
U64 local_eval_type_size = e_type_byte_size_from_key(local_eval.irtree.type_key);
Rng1U64 vaddr_rng = r1u64(local_eval.value.u64, local_eval.value.u64+local_eval_type_size);
Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng);
if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min)
@@ -2373,7 +2373,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory)
{
annotation->name_string = push_str8_copy(scratch.arena, local_name);
annotation->kind_string = str8_lit("Local");
annotation->type_string = e_type_string_from_key(scratch.arena, local_eval.type_key);
annotation->type_string = e_type_string_from_key(scratch.arena, local_eval.irtree.type_key);
annotation->color = color_gen_table[(vaddr_rng.min/8)%ArrayCount(color_gen_table)];
annotation->vaddr_range = vaddr_rng;
}
@@ -3150,7 +3150,7 @@ rd_rgba_from_eval_params(E_Eval eval, MD_Node *params)
Vec4F32 rgba = {0};
{
E_Eval value_eval = e_value_eval_from_eval(eval);
E_TypeKey type_key = eval.type_key;
E_TypeKey type_key = eval.irtree.type_key;
E_TypeKind type_kind = e_type_kind_from_key(type_key);
U64 type_size = e_type_byte_size_from_key(type_key);
if(16 <= type_size)
+2 -2
View File
@@ -1832,7 +1832,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
String8 full_pin_expr = push_str8f(scratch.arena, "%S => %S", pin_expr, pin_view_rule);
E_Eval eval = e_eval_from_string(scratch.arena, full_pin_expr);
String8 eval_string = {0};
if(!e_type_key_match(e_type_key_zero(), eval.type_key))
if(!e_type_key_match(e_type_key_zero(), eval.irtree.type_key))
{
eval_string = rd_value_string_from_eval(scratch.arena, str8_zero(), EV_StringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval);
}
@@ -2185,7 +2185,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
if(!ui_dragging(text_container_sig) && text_container_sig.event_flags == 0 && mouse_expr.size != 0)
{
E_Eval eval = e_eval_from_string(scratch.arena, mouse_expr);
if(eval.msgs.max_kind == E_MsgKind_Null && (eval.mode != E_Mode_Null || mouse_expr_is_explicit))
if(eval.msgs.max_kind == E_MsgKind_Null && (eval.irtree.mode != E_Mode_Null || mouse_expr_is_explicit))
{
U64 line_vaddr = 0;
if(contains_1s64(params->line_num_range, mouse_pt.line))