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:
Ryan Fleury
2025-02-15 18:11:22 -08:00
parent 176c2590a0
commit c603457460
12 changed files with 152 additions and 232 deletions
+1 -7
View File
@@ -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
View File
@@ -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)
-8
View File
@@ -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
View File
@@ -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())
{