mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 05:48:40 +00:00
dead code deletion, begin extending eval/eval-viz to work on expr-chains rather than single expressions; fixes / convergence for watch window
This commit is contained in:
@@ -208,25 +208,19 @@ RD_VocabTable:
|
||||
```@collection_commands(add_auto_view_rule) @commands(remove_cfg) x:{'source':code_string, 'dest':code_string}```,
|
||||
}
|
||||
|
||||
//- rjf: machines
|
||||
//- rjf: control entities
|
||||
{
|
||||
machine,
|
||||
```x:{'label':code_string, 'frozen':bool, 'processes':query}```,
|
||||
}
|
||||
|
||||
//- rjf: processes
|
||||
{
|
||||
process,
|
||||
```x:{'label':code_string, 'id':u64, 'frozen':bool, 'modules':query, 'threads':query}```,
|
||||
}
|
||||
|
||||
//- rjf: modules
|
||||
{
|
||||
module,
|
||||
```x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}```,
|
||||
}
|
||||
|
||||
//- rjf: threads
|
||||
{
|
||||
thread,
|
||||
```x:{'label':code_string, 'id':u64, 'frozen':bool, 'call_stack':query}```,
|
||||
|
||||
+33
-134
@@ -102,7 +102,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(watches)
|
||||
if(cfg_idx < cfgs->count)
|
||||
{
|
||||
String8 expr_string = rd_cfg_child_from_string(cfgs->v[cfg_idx], str8_lit("expression"))->first->string;
|
||||
exprs[idx] = e_parse_expr_from_text(arena, expr_string);
|
||||
exprs[idx] = e_parse_expr_from_text(arena, expr_string).exprs.first;
|
||||
exprs_strings[idx] = push_str8_copy(arena, expr_string);
|
||||
}
|
||||
}
|
||||
@@ -184,7 +184,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(locals)
|
||||
for(U64 idx = 0; idx < read_range_count; idx += 1)
|
||||
{
|
||||
String8 expr_string = accel->v[read_range.min + idx];
|
||||
exprs[idx] = e_parse_expr_from_text(arena, expr_string);
|
||||
exprs[idx] = e_parse_expr_from_text(arena, expr_string).exprs.last;
|
||||
exprs_strings[idx] = push_str8_copy(arena, expr_string);
|
||||
}
|
||||
}
|
||||
@@ -236,7 +236,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(registers)
|
||||
String8 register_name = accel->v[read_range.min + idx];
|
||||
String8 register_expr = push_str8f(arena, "reg:%S", register_name);
|
||||
exprs_strings[idx] = register_name;
|
||||
exprs[idx] = e_parse_expr_from_text(arena, register_expr);
|
||||
exprs[idx] = e_parse_expr_from_text(arena, register_expr).exprs.last;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -340,7 +340,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(cfg)
|
||||
{
|
||||
Rng1U64 read_range = intersect_1u64(cmds_idx_range, idx_range);
|
||||
U64 read_count = dim_1u64(read_range);
|
||||
E_Expr *commands = e_parse_expr_from_text(arena, str8_lit("query:commands"));
|
||||
E_Expr *commands = e_parse_expr_from_text(arena, str8_lit("query:commands")).exprs.last;
|
||||
E_IRTreeAndType commands_irtree = e_irtree_and_type_from_expr(arena, commands);
|
||||
for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1)
|
||||
{
|
||||
@@ -425,7 +425,6 @@ E_LOOKUP_INFO_FUNCTION_DEF(call_stack)
|
||||
E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs->root);
|
||||
String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);
|
||||
E_Interpretation interp = e_interpret(bytecode);
|
||||
U128 u128 = interp.value.u128;
|
||||
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(interp.space);
|
||||
if(entity->kind == CTRL_EntityKind_Thread)
|
||||
{
|
||||
@@ -3371,7 +3370,7 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_un
|
||||
if((E_TypeKind_FirstBasic <= type_kind && type_kind <= E_TypeKind_LastBasic) ||
|
||||
type_kind == E_TypeKind_Enum)
|
||||
{
|
||||
E_Expr *src_expr = e_parse_expr_from_text(scratch.arena, string);
|
||||
E_Expr *src_expr = e_parse_expr_from_text(scratch.arena, string).exprs.last;
|
||||
E_Expr *src_expr__casted = e_expr_ref_cast(scratch.arena, type_key, src_expr);
|
||||
E_Eval src_eval = e_eval_from_expr(scratch.arena, src_expr__casted);
|
||||
commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value));
|
||||
@@ -3462,113 +3461,6 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_un
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: view rule config tree info extraction
|
||||
|
||||
internal E_Value
|
||||
rd_value_from_params_key(MD_Node *params, String8 key)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
MD_Node *key_node = md_child_from_string(params, key, 0);
|
||||
String8 expr = md_string_from_children(scratch.arena, key_node);
|
||||
E_Eval eval = e_eval_from_string(scratch.arena, expr);
|
||||
E_Eval value_eval = e_value_eval_from_eval(eval);
|
||||
scratch_end(scratch);
|
||||
return value_eval.value;
|
||||
}
|
||||
|
||||
internal Rng1U64
|
||||
rd_range_from_eval_params(E_Eval eval, MD_Node *params)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
U64 size = rd_value_from_params_key(params, str8_lit("size")).u64;
|
||||
E_TypeKey type_key = e_type_unwrap(eval.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_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)));
|
||||
}
|
||||
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))
|
||||
{
|
||||
size = e_type_byte_size_from_key(e_type_unwrap(eval.type_key));
|
||||
}
|
||||
if(size == 0)
|
||||
{
|
||||
size = KB(16);
|
||||
}
|
||||
Rng1U64 result = {0};
|
||||
result.min = rd_base_offset_from_eval(eval);
|
||||
result.max = result.min + size;
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal TXT_LangKind
|
||||
rd_lang_kind_from_eval_params(E_Eval eval, MD_Node *params)
|
||||
{
|
||||
TXT_LangKind lang_kind = TXT_LangKind_Null;
|
||||
if(eval.expr->kind == E_ExprKind_LeafFilePath)
|
||||
{
|
||||
lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(eval.expr->string));
|
||||
}
|
||||
else
|
||||
{
|
||||
MD_Node *lang_node = md_child_from_string(params, str8_lit("lang"), 0);
|
||||
String8 lang_kind_string = lang_node->first->string;
|
||||
lang_kind = txt_lang_kind_from_extension(lang_kind_string);
|
||||
}
|
||||
return lang_kind;
|
||||
}
|
||||
|
||||
internal Arch
|
||||
rd_arch_from_eval_params(E_Eval eval, MD_Node *params)
|
||||
{
|
||||
Arch arch = Arch_Null;
|
||||
MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0);
|
||||
String8 arch_kind_string = arch_node->first->string;
|
||||
if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
arch = Arch_x64;
|
||||
}
|
||||
return arch;
|
||||
}
|
||||
|
||||
internal Vec2S32
|
||||
rd_dim2s32_from_eval_params(E_Eval eval, MD_Node *params)
|
||||
{
|
||||
Vec2S32 dim = v2s32(1, 1);
|
||||
{
|
||||
dim.x = rd_value_from_params_key(params, str8_lit("w")).s32;
|
||||
dim.y = rd_value_from_params_key(params, str8_lit("h")).s32;
|
||||
}
|
||||
return dim;
|
||||
}
|
||||
|
||||
internal R_Tex2DFormat
|
||||
rd_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params)
|
||||
{
|
||||
R_Tex2DFormat result = R_Tex2DFormat_RGBA8;
|
||||
{
|
||||
MD_Node *fmt_node = md_child_from_string(params, str8_lit("fmt"), 0);
|
||||
for EachNonZeroEnumVal(R_Tex2DFormat, fmt)
|
||||
{
|
||||
if(str8_match(r_tex2d_format_display_string_table[fmt], fmt_node->first->string, StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
result = fmt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: eval <-> file path
|
||||
|
||||
internal String8
|
||||
@@ -3577,7 +3469,7 @@ rd_file_path_from_eval_string(Arena *arena, String8 string)
|
||||
String8 result = {0};
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_Expr *expr = e_parse_expr_from_text(scratch.arena, string);
|
||||
E_Expr *expr = e_parse_expr_from_text(scratch.arena, string).exprs.last;
|
||||
if(expr->kind == E_ExprKind_LeafFilePath)
|
||||
{
|
||||
result = raw_from_escaped_str8(arena, expr->string);
|
||||
@@ -3605,7 +3497,7 @@ rd_query_from_eval_string(Arena *arena, String8 string)
|
||||
String8 result = {0};
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_Expr *expr = e_parse_expr_from_text(scratch.arena, string);
|
||||
E_Expr *expr = e_parse_expr_from_text(scratch.arena, string).exprs.last;
|
||||
if(expr->kind == E_ExprKind_LeafIdent &&
|
||||
str8_match(expr->qualifier, str8_lit("query"), 0))
|
||||
{
|
||||
@@ -3791,7 +3683,7 @@ rd_view_ui(Rng2F32 rect)
|
||||
{
|
||||
ui_labelf("use");
|
||||
UI_TextAlignment(UI_TextAlign_Center) rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenLister].string);
|
||||
ui_labelf("to open the lister for commands and options");
|
||||
ui_labelf("to search for commands and options");
|
||||
}
|
||||
}
|
||||
scratch_end(scratch);
|
||||
@@ -4041,9 +3933,9 @@ internal TXT_LangKind
|
||||
rd_lang_kind_from_eval_tag(E_Eval eval, E_Expr *tag)
|
||||
{
|
||||
TXT_LangKind lang_kind = TXT_LangKind_Null;
|
||||
if(eval.expr->kind == E_ExprKind_LeafFilePath)
|
||||
if(eval.exprs.last->kind == E_ExprKind_LeafFilePath)
|
||||
{
|
||||
lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(eval.expr->string));
|
||||
lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(eval.exprs.last->string));
|
||||
}
|
||||
else for(E_Expr *param = tag->first->next; param != &e_expr_nil; param = param->next)
|
||||
{
|
||||
@@ -9100,9 +8992,9 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
}
|
||||
|
||||
//- rjf: force no_string, if we are looking at padding members
|
||||
if(eval.expr->kind == E_ExprKind_MemberAccess)
|
||||
if(eval.exprs.last->kind == E_ExprKind_MemberAccess)
|
||||
{
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.expr->first);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last->first);
|
||||
E_TypeKey struct_type = irtree.type_key;
|
||||
for(B32 done = 0; !done;)
|
||||
{
|
||||
@@ -9118,8 +9010,12 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
{
|
||||
struct_type = e_type_direct_from_key(struct_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
E_Member member = e_type_member_from_key_name__cached(struct_type, eval.expr->last->string);
|
||||
E_Member member = e_type_member_from_key_name__cached(struct_type, eval.exprs.last->last->string);
|
||||
if(member.kind == E_MemberKind_Padding)
|
||||
{
|
||||
no_string = 1;
|
||||
@@ -9288,7 +9184,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
{
|
||||
if(type->count == 1)
|
||||
{
|
||||
E_Expr *deref_expr = e_expr_ref_deref(scratch.arena, eval.expr);
|
||||
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, flags, radix, font, font_size, max_size-space_taken, depth+1, root_expr, deref_eval, out);
|
||||
}
|
||||
@@ -9305,8 +9201,8 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
|
||||
// rjf: contents
|
||||
{
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.expr);
|
||||
E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.expr, &irtree);
|
||||
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_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, str8_zero());
|
||||
@@ -9316,7 +9212,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
{
|
||||
E_Expr *expr = &e_expr_nil;
|
||||
String8 expr_string = {0};
|
||||
lookup_rule->range(scratch.arena, eval.expr, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data);
|
||||
lookup_rule->range(scratch.arena, eval.exprs.last, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data);
|
||||
if(expr != &e_expr_nil)
|
||||
{
|
||||
if(!is_first)
|
||||
@@ -9444,8 +9340,8 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
// rjf: build contents
|
||||
if(depth < 4)
|
||||
{
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.expr);
|
||||
E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.expr, &irtree);
|
||||
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_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, str8_zero());
|
||||
@@ -9455,7 +9351,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
|
||||
{
|
||||
E_Expr *expr = &e_expr_nil;
|
||||
String8 expr_string = {0};
|
||||
lookup_rule->range(scratch.arena, eval.expr, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data);
|
||||
lookup_rule->range(scratch.arena, eval.exprs.last, r1u64(idx, idx+1), &expr, &expr_string, lookup_info.user_data);
|
||||
if(expr != &e_expr_nil)
|
||||
{
|
||||
if(!is_first)
|
||||
@@ -9502,7 +9398,7 @@ rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix,
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
String8List strs = {0};
|
||||
rd_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval.expr, eval, &strs);
|
||||
rd_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval.exprs.last, eval, &strs);
|
||||
String8 result = str8_list_join(arena, &strs, 0);
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
@@ -12418,7 +12314,7 @@ rd_frame(void)
|
||||
|
||||
//- rjf: add macro for 'call_stack' -> 'current_thread.callstack'
|
||||
{
|
||||
E_Expr *expr = e_parse_expr_from_text(scratch.arena, str8_lit("current_thread.call_stack"));
|
||||
E_Expr *expr = e_parse_expr_from_text(scratch.arena, str8_lit("current_thread.call_stack")).exprs.first;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("call_stack"), expr);
|
||||
}
|
||||
|
||||
@@ -12568,7 +12464,7 @@ rd_frame(void)
|
||||
E_Parse parse = e_parse_expr_from_text__cached(expr);
|
||||
if(parse.msgs.max_kind == E_MsgKind_Null)
|
||||
{
|
||||
for(E_Expr *expr = parse.first_expr; expr != &e_expr_nil; expr = expr->next)
|
||||
for(E_Expr *expr = parse.exprs.first; expr != &e_expr_nil; expr = expr->next)
|
||||
{
|
||||
e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ctx->macro_map, expr);
|
||||
}
|
||||
@@ -14561,6 +14457,7 @@ Z(getting_started)
|
||||
|
||||
// rjf: choose panel for source code
|
||||
RD_PanelNode *src_code_dst_panel = &rd_nil_panel_node;
|
||||
if(file_path.size != 0)
|
||||
{
|
||||
if(src_code_dst_panel == &rd_nil_panel_node) { src_code_dst_panel = panel_w_this_src_code; }
|
||||
if(src_code_dst_panel == &rd_nil_panel_node) { src_code_dst_panel = panel_w_any_src_code; }
|
||||
@@ -14570,6 +14467,7 @@ Z(getting_started)
|
||||
|
||||
// rjf: choose panel for disassembly
|
||||
RD_PanelNode *disasm_dst_panel = &rd_nil_panel_node;
|
||||
if(vaddr != 0)
|
||||
{
|
||||
if(disasm_dst_panel == &rd_nil_panel_node) { disasm_dst_panel = panel_w_disasm; }
|
||||
if(disasm_dst_panel == &rd_nil_panel_node) { disasm_dst_panel = biggest_empty_panel; }
|
||||
@@ -14594,7 +14492,7 @@ Z(getting_started)
|
||||
// rjf: if disasm is not preferred, and we have no disassembly view
|
||||
// open at all, cancel disasm, so that it doesn't open if the user
|
||||
// doesn't want it.
|
||||
if(!rd_regs()->prefer_disasm && panel_w_disasm == &rd_nil_panel_node)
|
||||
if(!rd_regs()->prefer_disasm && panel_w_disasm == &rd_nil_panel_node && file_path.size != 0)
|
||||
{
|
||||
disasm_dst_panel = &rd_nil_panel_node;
|
||||
}
|
||||
@@ -14602,7 +14500,8 @@ Z(getting_started)
|
||||
// rjf: if disasm is not preferred, and we have no disassembly view
|
||||
// *selected* at all, cancel disasm, so that it doesn't open if the user
|
||||
// doesn't want it.
|
||||
if(!rd_regs()->prefer_disasm && view_w_disasm != &rd_nil_cfg && rd_cfg_child_from_string(view_w_disasm, str8_lit("selected")) == &rd_nil_cfg)
|
||||
if(!rd_regs()->prefer_disasm && view_w_disasm != &rd_nil_cfg && rd_cfg_child_from_string(view_w_disasm, str8_lit("selected")) == &rd_nil_cfg &&
|
||||
file_path.size != 0)
|
||||
{
|
||||
disasm_dst_panel = &rd_nil_panel_node;
|
||||
}
|
||||
@@ -15773,7 +15672,7 @@ Z(getting_started)
|
||||
ExprWalkTask *next;
|
||||
E_Expr *expr;
|
||||
};
|
||||
E_Expr *expr = e_parse_expr_from_text(scratch.arena, src_bp_cnd);
|
||||
E_Expr *expr = e_parse_expr_from_text(scratch.arena, src_bp_cnd).exprs.last;
|
||||
ExprWalkTask start_task = {0, expr};
|
||||
ExprWalkTask *first_task = &start_task;
|
||||
for(ExprWalkTask *t = first_task; t != 0; t = t->next)
|
||||
|
||||
@@ -1036,14 +1036,6 @@ internal Rng1U64 rd_whole_range_from_eval_space(E_Space space);
|
||||
//- rjf: writing values back to child processes
|
||||
internal B32 rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_unescaping);
|
||||
|
||||
//- rjf: eval / view rule params tree info extraction
|
||||
internal E_Value rd_value_from_params_key(MD_Node *params, String8 key);
|
||||
internal Rng1U64 rd_range_from_eval_params(E_Eval eval, MD_Node *params);
|
||||
internal TXT_LangKind rd_lang_kind_from_eval_params(E_Eval eval, MD_Node *params);
|
||||
internal Arch rd_arch_from_eval_params(E_Eval eval, MD_Node *params);
|
||||
internal Vec2S32 rd_dim2s32_from_eval_params(E_Eval eval, MD_Node *params);
|
||||
internal R_Tex2DFormat rd_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params);
|
||||
|
||||
//- rjf: eval <-> file path
|
||||
internal String8 rd_file_path_from_eval_string(Arena *arena, String8 string);
|
||||
internal String8 rd_eval_string_from_file_path(Arena *arena, String8 string);
|
||||
|
||||
+36
-26
@@ -1108,7 +1108,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
}
|
||||
|
||||
// rjf: for 'add-new' rows in meta-cfg evaluation spaces, only do expr
|
||||
else if(info.eval.space.kind == E_SpaceKind_Null && info.group_cfg_parent != &rd_nil_cfg)
|
||||
else if(info.eval.exprs.last == &e_expr_nil && info.group_cfg_name.size != 0)
|
||||
{
|
||||
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .pct = 1.f);
|
||||
}
|
||||
@@ -1269,7 +1269,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
|
||||
E_Expr *root_expr = row->expr;
|
||||
if(wrap_string.size != 0)
|
||||
{
|
||||
E_Expr *wrap_expr = e_parse_expr_from_text(scratch.arena, wrap_string);
|
||||
E_Expr *wrap_expr = e_parse_expr_from_text(scratch.arena, wrap_string).exprs.last;
|
||||
root_expr = wrap_expr;
|
||||
typedef struct Task Task;
|
||||
struct Task
|
||||
@@ -1308,8 +1308,23 @@ 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.string = rd_value_string_from_eval(arena, string_flags, 10, font, font_size, max_size_px, result.eval);
|
||||
|
||||
//- rjf: determine default radix
|
||||
U32 default_radix = 10;
|
||||
if(result.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity &&
|
||||
rd_ctrl_entity_from_eval_space(result.eval.space)->kind == CTRL_EntityKind_Module)
|
||||
{
|
||||
default_radix = 16;
|
||||
}
|
||||
|
||||
//- rjf: generate strings/flags based on that expression & fill
|
||||
result.string = rd_value_string_from_eval(arena, 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);
|
||||
if(type->flags & (E_TypeFlag_IsPlainText|E_TypeFlag_IsPathText))
|
||||
{
|
||||
result.flags |= RD_WatchCellFlag_IsNonCode;
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
@@ -2061,22 +2076,22 @@ RD_VIEW_UI_FUNCTION_DEF(watch)
|
||||
if(cfg != &rd_nil_cfg)
|
||||
{
|
||||
rd_cfg_list_push(scratch.arena, &cfgs_to_remove, cfg);
|
||||
U64 deleted_num = ev_num_from_key(&block_ranges, row->key);
|
||||
U64 deleted_num = row->block->lookup_rule->num_from_id(row->key.child_id, row->block->lookup_rule_user_data);
|
||||
if(deleted_num != 0)
|
||||
{
|
||||
EV_Key parent_key = row->block->parent->key;
|
||||
EV_Key key = row->block->key;
|
||||
EV_Key fallback_key_prev = ev_key_from_num(&block_ranges, deleted_num-1);
|
||||
EV_Key fallback_key_next = ev_key_from_num(&block_ranges, deleted_num+1);
|
||||
if(fallback_key_next.child_id != 0)
|
||||
U64 fallback_id_prev = row->block->lookup_rule->id_from_num(deleted_num-1, row->block->lookup_rule_user_data);
|
||||
U64 fallback_id_next = row->block->lookup_rule->id_from_num(deleted_num+1, row->block->lookup_rule_user_data);
|
||||
if(fallback_id_next != 0)
|
||||
{
|
||||
parent_key = row->block->key;
|
||||
key = fallback_key_next;
|
||||
key = ev_key_make(row->key.parent_hash, fallback_id_next);
|
||||
}
|
||||
else if(fallback_key_prev.child_id != 0)
|
||||
else if(fallback_id_prev != 0)
|
||||
{
|
||||
parent_key = row->block->key;
|
||||
key = fallback_key_prev;
|
||||
key = ev_key_make(row->key.parent_hash, fallback_id_prev);
|
||||
}
|
||||
RD_WatchPt new_pt = {parent_key, key, pt.cell_id};
|
||||
next_cursor_pt = new_pt;
|
||||
@@ -2694,16 +2709,6 @@ RD_VIEW_UI_FUNCTION_DEF(watch)
|
||||
{
|
||||
row_flags |= UI_BoxFlag_DrawSideTop;
|
||||
}
|
||||
#if 0 // TODO(rjf): @cfg
|
||||
switch(row_kind)
|
||||
{
|
||||
default:{}break;
|
||||
case RD_WatchViewRowKind_Normal:{row_flags |= UI_BoxFlag_DisableFocusOverlay;}break;
|
||||
case RD_WatchViewRowKind_Header:{row_flags |= UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DisableFocusOverlay;}break;
|
||||
case RD_WatchViewRowKind_Canvas:{row_flags |= UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder;}break;
|
||||
case RD_WatchViewRowKind_PrettyEntityControls:{row_flags |= UI_BoxFlag_DisableFocusOverlay;}break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
ProfEnd();
|
||||
|
||||
@@ -2871,7 +2876,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch)
|
||||
RD_Cfg *root = rd_immediate_cfg_from_keyf("view_%I64x_%I64x", rd_regs()->view, row_hash);
|
||||
RD_Cfg *view = rd_cfg_child_from_string_or_alloc(root, cell_info.view_ui_rule->name);
|
||||
RD_Cfg *expr = rd_cfg_child_from_string_or_alloc(view, str8_lit("expression"));
|
||||
rd_cfg_new(expr, e_string_from_expr(scratch.arena, cell_info.eval.expr));
|
||||
rd_cfg_new(expr, e_string_from_expr(scratch.arena, cell_info.eval.exprs.last));
|
||||
rd_cfg_new(view, str8_lit("selected"));
|
||||
RD_RegsScope(.view = view->id)
|
||||
UI_PermissionFlags(UI_PermissionFlag_Clicks|UI_PermissionFlag_ScrollX)
|
||||
@@ -2945,10 +2950,15 @@ RD_VIEW_UI_FUNCTION_DEF(watch)
|
||||
{
|
||||
B32 is_non_code = !!(cell_info.flags & RD_WatchCellFlag_IsNonCode);
|
||||
String8 ghost_text = {0};
|
||||
if(cell->kind == RD_WatchCellKind_Tag && cell_info.string.size == 0 && global_row_idx == 0)
|
||||
if(cell->kind == RD_WatchCellKind_Expr && cell_info.string.size == 0)
|
||||
{
|
||||
ghost_text = str8_lit("Expression");
|
||||
is_non_code = !cell_selected || !ewv->text_editing;
|
||||
}
|
||||
else if(cell->kind == RD_WatchCellKind_Tag && cell_info.string.size == 0 && global_row_idx == 0)
|
||||
{
|
||||
ghost_text = str8_lit("View Rules");
|
||||
is_non_code = !ui_is_focus_active();
|
||||
is_non_code = !cell_selected || !ewv->text_editing;
|
||||
}
|
||||
RD_Font(is_non_code ? RD_FontSlot_Main : RD_FontSlot_Code)
|
||||
{
|
||||
@@ -3111,7 +3121,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch)
|
||||
String8 string = ev_expr_string_from_row(scratch.arena, row, 0);
|
||||
E_TokenArray tokens = e_token_array_from_text(scratch.arena, string);
|
||||
E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, string, &tokens);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.last_expr);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.exprs.last);
|
||||
E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree.root);
|
||||
String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);
|
||||
UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Text:");
|
||||
@@ -3133,7 +3143,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch)
|
||||
E_Expr *expr;
|
||||
S64 depth;
|
||||
};
|
||||
Task start_task = {0, 0, parse.last_expr};
|
||||
Task start_task = {0, 0, parse.exprs.last};
|
||||
Task *first_task = &start_task;
|
||||
Task *last_task = first_task;
|
||||
for(Task *t = first_task; t != 0; t = t->next)
|
||||
@@ -3562,7 +3572,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm)
|
||||
//
|
||||
B32 auto_selected = 0;
|
||||
E_Space auto_space = {0};
|
||||
if(eval.expr == &e_expr_nil)
|
||||
if(eval.exprs.last == &e_expr_nil)
|
||||
{
|
||||
if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == ctrl_run_gen())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user