diff --git a/src/base/base_meta.c b/src/base/base_meta.c index c60dc237..2bf14eb6 100644 --- a/src/base/base_meta.c +++ b/src/base/base_meta.c @@ -44,8 +44,7 @@ typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr) switch(t->type->kind) { default:{}break; - case TypeKind_Ptr: - if(!(t->type->flags & TypeFlag_IsExternal)) + case TypeKind_Ptr: { *(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr)); }break; @@ -173,13 +172,13 @@ serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerialize task->containing_type = t->containing_type; task->containing_ptr = t->containing_ptr; SLLQueuePush(first_task, last_task, task); - } - - // rjf: catch-all: write pointer value - else - { - str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count)); - } + } + + // rjf: catch-all: write pointer value + else + { + str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count)); + } }break; //- rjf: arrays -> descend to underlying type, + count @@ -345,14 +344,14 @@ deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSeriali task->containing_type = t->containing_type; task->containing_ptr = t->containing_ptr; SLLQueuePush(first_task, last_task, task); - } - - // rjf: catch-all: read pointer value - else - { + } + + // rjf: catch-all: read pointer value + else + { MemoryCopy(t->dst, t_src, t->type->size*t->count); - read_off += t->type->size*t->count; - } + read_off += t->type->size*t->count; + } }break; //- rjf: arrays -> descend to underlying type, + count diff --git a/src/base/base_meta.h b/src/base/base_meta.h index 45d01e72..62faafeb 100644 --- a/src/base/base_meta.h +++ b/src/base/base_meta.h @@ -100,10 +100,9 @@ TypeKind; typedef U32 TypeFlags; enum { - TypeFlag_IsExternal = (1<<0), - TypeFlag_IsPlainText = (1<<1), - TypeFlag_IsCodeText = (1<<2), - TypeFlag_IsPathText = (1<<3), + TypeFlag_IsPlainText = (1<<0), + TypeFlag_IsCodeText = (1<<1), + TypeFlag_IsPathText = (1<<2), }; typedef U32 MemberFlags; diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 4d73fadf..36fc7a34 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -73,6 +73,7 @@ E_TypeKindTable: {Variadic "variadic" 0 } {Set "set" 0 } {Lens "lens" 0 } + {LensSpec "lens_spec" 0 } } @table(name op_kind precedence op_pre op_sep op_pos) diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index e43002c3..c34d7992 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -274,11 +274,10 @@ enum { E_TypeFlag_Const = (1<<0), E_TypeFlag_Volatile = (1<<1), - E_TypeFlag_External = (1<<2), - E_TypeFlag_IsPlainText = (1<<3), - E_TypeFlag_IsCodeText = (1<<4), - E_TypeFlag_IsPathText = (1<<5), - E_TypeFlag_EditableChildren = (1<<6), + E_TypeFlag_IsPlainText = (1<<2), + E_TypeFlag_IsCodeText = (1<<3), + E_TypeFlag_IsPathText = (1<<4), + E_TypeFlag_EditableChildren = (1<<5), }; typedef struct E_Member E_Member; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index a4da10ff..9deae36e 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -98,7 +98,7 @@ e_select_ir_ctx(E_IRCtx *ctx) for EachElement(idx, builtin_view_rule_names) { E_Expr *expr = e_push_expr(e_ir_state->arena, E_ExprKind_LeafOffset, 0); - expr->type_key = e_type_key_cons(.kind = E_TypeKind_Lens, .name = builtin_view_rule_names[idx]); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec, .name = builtin_view_rule_names[idx]); e_string2expr_map_insert(e_ir_state->arena, ctx->macro_map, builtin_view_rule_names[idx], expr); } } @@ -2421,7 +2421,7 @@ E_IRGEN_FUNCTION_DEF(default) // rjf: calling a lens? -> generate IR for the first argument; wrap the type in // a lens type, which preserves the name & arguments of the lens call expression - if(lhs_type->kind == E_TypeKind_Lens) + if(lhs_type->kind == E_TypeKind_LensSpec) { Temp scratch = scratch_begin(&arena, 1); @@ -3347,6 +3347,17 @@ e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_Type //////////////////////////////// //~ rjf: Expression & IR-Tree => Rules +internal E_LookupRule * +e_lookup_rule_from_type_key(E_TypeKey type_key) +{ + E_LookupRule *rule = &e_lookup_rule__default; + + // rjf: unpack type + E_Type *type = e_type_from_key__cached(type_key); + + return rule; +} + internal E_LookupRuleExprPair e_lookup_rule_expr_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree) { diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 105765a9..d6d2a6fe 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -288,6 +288,7 @@ internal E_Expr *e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *r //////////////////////////////// //~ rjf: Expression & IR-Tree => Rules +internal E_LookupRule *e_lookup_rule_from_type_key(E_TypeKey type_key); internal E_LookupRuleExprPair e_lookup_rule_expr_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree); #if 0 // TODO(rjf): @eval diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index ee2f0cfb..25900532 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -483,7 +483,6 @@ e_type_key_cons_base(Type *type) { E_TypeKey direct_type = e_type_key_cons_base(type->direct); E_TypeFlags flags = 0; - if(type->flags & TypeFlag_IsExternal) { flags |= E_TypeFlag_External; } if(type->flags & TypeFlag_IsPlainText){ flags |= E_TypeFlag_IsPlainText; } if(type->flags & TypeFlag_IsCodeText) { flags |= E_TypeFlag_IsCodeText; } if(type->flags & TypeFlag_IsPathText) { flags |= E_TypeFlag_IsPathText; } diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index bd097d05..1973dbf0 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -14,7 +14,7 @@ str8_lit_comp("CharLiteral"), str8_lit_comp("Symbol"), }; -String8 e_type_kind_basic_string_table[57] = +String8 e_type_kind_basic_string_table[58] = { str8_lit_comp(""), str8_lit_comp("void"), @@ -73,9 +73,10 @@ str8_lit_comp("bitfield"), str8_lit_comp("variadic"), str8_lit_comp("set"), str8_lit_comp("lens"), +str8_lit_comp("lens_spec"), }; -U8 e_type_kind_basic_byte_size_table[57] = +U8 e_type_kind_basic_byte_size_table[58] = { 0, 0, @@ -134,6 +135,7 @@ U8 e_type_kind_basic_byte_size_table[57] = 0, 0, 0, +0, }; String8 e_expr_kind_strings[48] = diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 30cd7f64..d9212232 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -76,6 +76,7 @@ E_TypeKind_Bitfield, E_TypeKind_Variadic, E_TypeKind_Set, E_TypeKind_Lens, +E_TypeKind_LensSpec, E_TypeKind_COUNT, E_TypeKind_FirstBasic = E_TypeKind_Void, E_TypeKind_LastBasic = E_TypeKind_ComplexF128, @@ -161,8 +162,8 @@ E_InterpretationCode_COUNT, C_LINKAGE_BEGIN extern String8 e_token_kind_strings[6]; -extern String8 e_type_kind_basic_string_table[57]; -extern U8 e_type_kind_basic_byte_size_table[57]; +extern String8 e_type_kind_basic_string_table[58]; +extern U8 e_type_kind_basic_byte_size_table[58]; extern String8 e_expr_kind_strings[48]; extern E_OpInfo e_expr_kind_op_info_table[48]; extern String8 e_interpretation_code_display_strings[11]; diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 9332bf9c..56b6af70 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1367,14 +1367,14 @@ ev_string_from_hresult_code(U32 code) } internal String8 -ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, U32 min_digits, E_Eval eval) +ev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval) { String8 result = {0}; 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; - if(!(flags & EV_StringFlag_ReadOnlyDisplayRules)) + if(!(params->flags & EV_StringFlag_ReadOnlyDisplayRules)) { digit_group_separator = 0; } @@ -1385,19 +1385,19 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, case E_TypeKind_Handle: { - result = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator); + result = str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator); }break; case E_TypeKind_HResult: { - if(flags & EV_StringFlag_ReadOnlyDisplayRules) + if(params->flags & EV_StringFlag_ReadOnlyDisplayRules) { Temp scratch = scratch_begin(&arena, 1); U32 hresult_value = (U32)eval.value.u64; U32 is_error = !!(hresult_value & (1ull<<31)); U32 error_code = (hresult_value); U32 facility = (hresult_value & 0x7ff0000) >> 16; - String8 value_string = str8_from_s64(scratch.arena, eval.value.u64, radix, min_digits, digit_group_separator); + String8 value_string = str8_from_s64(scratch.arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator); String8 facility_string = ev_string_from_hresult_facility_code(facility); String8 error_string = ev_string_from_hresult_code(error_code); result = push_str8f(arena, "%S%s%s%S%s%s%S%s", @@ -1413,7 +1413,7 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, } else { - result = str8_from_s64(arena, eval.value.u64, radix, min_digits, digit_group_separator); + result = str8_from_s64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator); } }break; @@ -1428,11 +1428,11 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, String8 char_str = ev_string_from_ascii_value(arena, eval.value.s64); if(char_str.size != 0) { - if(flags & EV_StringFlag_ReadOnlyDisplayRules) + if(params->flags & EV_StringFlag_ReadOnlyDisplayRules) { String8 imm_string = (type_is_unsigned - ? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator) - : str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator)); + ? str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator) + : str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator)); result = push_str8f(arena, "'%S' (%S)", char_str, imm_string); } else @@ -1443,8 +1443,8 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, else { result = (type_is_unsigned - ? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator) - : str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator)); + ? str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator) + : str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator)); } }break; @@ -1453,7 +1453,7 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, case E_TypeKind_S32: case E_TypeKind_S64: { - result = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator); + result = str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator); }break; case E_TypeKind_U8: @@ -1461,14 +1461,14 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, case E_TypeKind_U32: case E_TypeKind_U64: { - result = str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator); + result = str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator); }break; case E_TypeKind_U128: { Temp scratch = scratch_begin(&arena, 1); - String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128.u64[0], radix, min_digits, digit_group_separator); - String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128.u64[1], radix, min_digits, digit_group_separator); + String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128.u64[0], params->radix, params->min_digits, digit_group_separator); + String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128.u64[1], params->radix, params->min_digits, digit_group_separator); result = push_str8f(arena, "%S:%S", upper64, lower64); scratch_end(scratch); }break; @@ -1477,7 +1477,7 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, case E_TypeKind_F64:{f64 = eval.value.f64;}goto f64_path; f64_path:; { - result = push_str8f(arena, "%.*f", min_digits ? min_digits : 16, f64); + result = push_str8f(arena, "%.*f", params->min_digits ? params->min_digits : 16, f64); U64 num_to_chop = 0; for(U64 num_trimmed = 0; num_trimmed < result.size; num_trimmed += 1) { @@ -1512,8 +1512,8 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, break; } } - String8 numeric_value_string = str8_from_u64(scratch.arena, eval.value.u64, radix, min_digits, digit_group_separator); - if(flags & EV_StringFlag_ReadOnlyDisplayRules) + String8 numeric_value_string = str8_from_u64(scratch.arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator); + if(params->flags & EV_StringFlag_ReadOnlyDisplayRules) { if(constant_name.size != 0) { @@ -1581,6 +1581,159 @@ ev_escaped_from_raw_string(Arena *arena, String8 raw) return result; } +//- rjf: tree stringification iterator + +internal EV_StringIter * +ev_string_iter_begin(Arena *arena, E_Eval eval, EV_StringParams *params) +{ + EV_StringIter *it = push_array(arena, EV_StringIter, 1); + it->top_task = push_array(arena, EV_StringIterTask, 1); + it->top_task->eval = eval; + MemoryCopyStruct(&it->top_task->params, params); + return it; +} + +internal B32 +ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) +{ + B32 result = 0; + + //- rjf: make progress on top task + MemoryZeroStruct(out_string); + B32 need_pop = 1; + B32 need_new_task = 0; + EV_StringIterTask new_task = {0}; + if(it->top_task != 0) + { + result = 1; + + //- rjf: unpack task + U64 task_idx = it->top_task->idx; + EV_StringParams *params = &it->top_task->params; + E_Eval eval = it->top_task->eval; + E_TypeKey type_key = eval.irtree.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + + //- rjf: type evaluations -> display type string + if(eval.irtree.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.irtree.type_key)) + { + *out_string = e_type_string_from_key(arena, type_key); + } + + //- rjf: non-type evaluations + else switch(type_kind) + { + //- rjf: default - leaf cases + default: + { + E_Eval value_eval = e_value_eval_from_eval(eval); + *out_string = ev_string_from_simple_typed_eval(arena, params, value_eval); + }break; + + //- rjf: lenses + case E_TypeKind_Lens: + switch(task_idx) + { + default:{}break; + + // rjf: step 0 -> generate lens description, then descend to same evaluation w/ direct type + case 0: + { + Temp scratch = scratch_begin(&arena, 1); + String8List strings = {0}; + { + E_Type *type = e_type_from_key__cached(type_key); + str8_list_pushf(scratch.arena, &strings, "%S(", type->name); + for EachIndex(idx, type->count) + { + String8 string = e_string_from_expr(scratch.arena, type->args[idx]); + str8_list_push(scratch.arena, &strings, string); + if(idx+1 < type->count) + { + str8_list_pushf(scratch.arena, &strings, ", "); + } + } + str8_list_pushf(scratch.arena, &strings, ") <- ("); + } + *out_string = str8_list_join(arena, &strings, 0); + need_new_task = 1; + new_task.params = *params; + new_task.eval = eval; + new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key); + scratch_end(scratch); + }break; + + // rjf: step 1 -> close + case 1: + { + *out_string = str8_lit(")"); + }break; + }break; + + //- rjf: pointers + case E_TypeKind_Function: + case E_TypeKind_Ptr: + case E_TypeKind_LRef: + case E_TypeKind_RRef: + { + + }break; + + //- rjf: arrays + case E_TypeKind_Array: + { + + }break; + + //- rjf: non-string-arrays/structs/sets + case E_TypeKind_Struct: + case E_TypeKind_Union: + case E_TypeKind_Class: + case E_TypeKind_IncompleteStruct: + case E_TypeKind_IncompleteUnion: + case E_TypeKind_IncompleteClass: + case E_TypeKind_Set: + arrays_and_sets_and_structs: + { + + }break; + } + } + + //- rjf: bump task counter + if(it->top_task != 0) + { + it->top_task->idx += 1; + } + + //- rjf: if result is good, and we have a new task? -> push + if(result && need_new_task) + { + EV_StringIterTask *new_t = it->free_task; + if(new_t != 0) + { + SLLStackPop(it->free_task); + } + else + { + new_t = push_array(arena, EV_StringIterTask, 1); + } + MemoryCopyStruct(new_t, &new_task); + SLLStackPush(it->top_task, new_t); + new_t->idx = 0; + } + + //- rjf: if result is good, but we don't have a new task? -> pop + else if(result && need_pop) + { + EV_StringIterTask *task = it->top_task; + SLLStackPop(it->top_task); + SLLStackPush(it->free_task, task); + } + + return result; +} + //////////////////////////////// //~ rjf: Expression & IR-Tree => Expand Rule diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index bb699ecf..adbf9ff7 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -237,6 +237,32 @@ enum { EV_StringFlag_ReadOnlyDisplayRules = (1<<0), EV_StringFlag_PrettyNames = (1<<1), + EV_StringFlag_DisableAddresses = (1<<2), + EV_StringFlag_DisableStrings = (1<<3), +}; + +typedef struct EV_StringParams EV_StringParams; +struct EV_StringParams +{ + EV_StringFlags flags; + U32 radix; + U32 min_digits; +}; + +typedef struct EV_StringIterTask EV_StringIterTask; +struct EV_StringIterTask +{ + EV_StringIterTask *next; + EV_StringParams params; + E_Eval eval; + U64 idx; +}; + +typedef struct EV_StringIter EV_StringIter; +struct EV_StringIter +{ + EV_StringIterTask *top_task; + EV_StringIterTask *free_task; }; //////////////////////////////// @@ -341,9 +367,13 @@ internal B32 ev_row_is_editable(EV_Row *row); internal String8 ev_string_from_ascii_value(Arena *arena, U8 val); internal String8 ev_string_from_hresult_facility_code(U32 code); internal String8 ev_string_from_hresult_code(U32 code); -internal String8 ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, U32 min_digits, E_Eval eval); +internal String8 ev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval); internal String8 ev_escaped_from_raw_string(Arena *arena, String8 raw); +//- rjf: tree stringification iterator +internal EV_StringIter *ev_string_iter_begin(Arena *arena, E_Eval eval, EV_StringParams *params); +internal B32 ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string); + //////////////////////////////// //~ rjf: Expression & IR-Tree => Expand Rule diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 82665e80..af904043 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -6839,7 +6839,8 @@ rd_window_frame(void) E_Eval eval = e_eval_from_string(scratch.arena, rd_state->drag_drop_regs->expr); 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); + EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10}; + String8 value_string = rd_value_string_from_eval_NEW(scratch.arena, str8_zero(), &string_params, 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); } } @@ -10419,7 +10420,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f U32 min_digits = 0; B32 no_addr = 0; B32 no_string = 0; - B32 has_array = 0; #if 0 // TODO(rjf): @eval for(E_Expr *tag = root_eval.exprs.last->first_tag; tag != &e_expr_nil; tag = tag->next) { @@ -10430,7 +10430,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f else if(str8_match(tag->string, str8_lit("oct"), 0)) {radix = 8; } else if(str8_match(tag->string, str8_lit("no_addr"), 0)) {no_addr = 1;} else if(str8_match(tag->string, str8_lit("no_string"), 0)) {no_string = 1;} - else if(str8_match(tag->string, str8_lit("array"), 0)) {has_array = 1;} else if(str8_match(tag->string, str8_lit("digits"), 0)) { E_Expr *num_expr = tag->first->next; @@ -10440,22 +10439,12 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f } } #endif + + //- rjf: force no_addr in non-address-spaces if(eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity || eval.space.kind == RD_EvalSpaceKind_MetaCfg) { - 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.irtree.type_key); - if(!(type->flags & E_TypeFlag_External)) - { - no_addr = 1; - } - } + no_addr = 1; } //- rjf: force no_string, if we are looking at padding members @@ -10507,7 +10496,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f default: { E_Eval value_eval = e_value_eval_from_eval(eval); - String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval); + String8 string = {0}; // ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval); space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; str8_list_push(arena, out, string); }break; @@ -10624,7 +10613,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, left_paren).x; str8_list_push(arena, out, left_paren); } - String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval); + String8 string = {0}; // ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval); space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; str8_list_push(arena, out, string); if(did_content) @@ -10889,6 +10878,25 @@ rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U3 return result; } +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) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List strs = {0}; + { + EV_StringIter *iter = ev_string_iter_begin(scratch.arena, eval, params); + F32 space_taken_px = 0; + for(String8 string = {0}; ev_string_iter_next(scratch.arena, iter, &string) && space_taken_px < max_size;) + { + str8_list_push(scratch.arena, &strs, string); + space_taken_px += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; + } + } + String8 result = str8_list_join(arena, &strs, 0); + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: Hover Eval @@ -13922,7 +13930,7 @@ rd_frame(void) for EachElement(idx, view_ui_rule_table) { E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = e_type_key_cons(.kind = E_TypeKind_Lens, .name = view_ui_rule_table[idx].name); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec, .name = view_ui_rule_table[idx].name); e_string2expr_map_insert(scratch.arena, e_ir_state->ctx->macro_map, view_ui_rule_table[idx].name, expr); } } diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 855445f8..d61f709e 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -1007,6 +1007,7 @@ internal void rd_window_frame(void); 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); +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); //////////////////////////////// //~ rjf: Hover Eval diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 0b33bad5..9985339d 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1503,7 +1503,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_query_input(), string_flags, default_radix, font, font_size, max_size_px, result.eval); + EV_StringParams string_params = {.flags = string_flags, .radix = default_radix}; + result.string = rd_value_string_from_eval_NEW(arena, rd_view_query_input(), &string_params, font, font_size, max_size_px, result.eval); 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)) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 2d472577..51c99ac5 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -1978,7 +1978,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe String8 eval_string = {0}; if(!e_type_key_match(e_type_key_zero(), eval.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); + EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10}; + eval_string = rd_value_string_from_eval_NEW(scratch.arena, str8_zero(), &string_params, params->font, params->font_size, params->font_size*60.f, eval); } ui_spacer(ui_em(1.5f, 1.f)); ui_set_next_pref_width(ui_children_sum(1));