diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index 0ee41d92..11c8e68a 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -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) { diff --git a/src/eval/eval_bundles.h b/src/eval/eval_bundles.h index c72fa6ee..311a752e 100644 --- a/src/eval/eval_bundles.h +++ b/src/eval/eval_bundles.h @@ -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); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index bb500064..9ab53f7a 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -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; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 2c5a71d4..81afc10e 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -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) diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 4c78ebe3..644cd104 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -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); //////////////////////////////// diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 0d2e47d7..e14a5b0a 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -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) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 0e3f87b7..3ccc4d96 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -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))