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
+11 -3
View File
@@ -6,9 +6,17 @@
internal E_Eval
e_eval_from_expr(Arena *arena, E_Expr *expr)
{
E_ExprChain exprs = {expr, expr};
E_Eval result = e_eval_from_exprs(arena, exprs);
return result;
}
internal E_Eval
e_eval_from_exprs(Arena *arena, E_ExprChain exprs)
{
ProfBeginFunction();
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr);
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);
@@ -17,7 +25,7 @@ e_eval_from_expr(Arena *arena, E_Expr *expr)
.value = interp.value,
.mode = irtree.mode,
.space = interp.space,
.expr = expr,
.exprs = exprs,
.type_key = irtree.type_key,
.code = interp.code,
};
@@ -35,7 +43,7 @@ e_eval_from_string(Arena *arena, String8 string)
{
E_TokenArray tokens = e_token_array_from_text(arena, string);
E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens);
E_Eval eval = e_eval_from_expr(arena, parse.last_expr);
E_Eval eval = e_eval_from_exprs(arena, parse.exprs);
e_msg_list_concat_in_place(&eval.msgs, &parse.msgs);
return eval;
}
+2 -1
View File
@@ -13,7 +13,7 @@ struct E_Eval
E_Value value;
E_Mode mode;
E_Space space;
E_Expr *expr;
E_ExprChain exprs;
E_TypeKey type_key;
E_InterpretationCode code;
E_MsgList msgs;
@@ -23,6 +23,7 @@ struct E_Eval
//~ rjf: Bundled Evaluation Functions
internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr);
internal E_Eval e_eval_from_exprs(Arena *arena, E_ExprChain exprs);
internal E_Eval e_eval_from_string(Arena *arena, String8 string);
internal E_Eval e_eval_from_stringf(Arena *arena, char *fmt, ...);
internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval);
+22 -15
View File
@@ -166,11 +166,15 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
}
else if(lhs_type_kind == E_TypeKind_Struct ||
lhs_type_kind == E_TypeKind_Class ||
lhs_type_kind == E_TypeKind_Union ||
lhs_type_kind == E_TypeKind_Enum)
lhs_type_kind == E_TypeKind_Union)
{
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
lookup_info.named_expr_count = lhs_type->count;
E_MemberArray data_members = e_type_data_members_from_key__cached(lhs_type_key);
lookup_info.named_expr_count = data_members.count;
}
else if(lhs_type_kind == E_TypeKind_Enum)
{
E_Type *direct_type = e_type_from_key__cached(lhs_type_key);
lookup_info.named_expr_count = direct_type->count;
}
else if(lhs_type_kind == E_TypeKind_Array)
{
@@ -570,12 +574,10 @@ E_IRGEN_FUNCTION_DEF(array)
E_TypeKind type_kind = e_type_kind_from_key(type_key);
if(e_type_kind_is_pointer_or_ref(type_kind))
{
Temp scratch = scratch_begin(&arena, 1);
E_Eval count_eval = e_eval_from_expr(scratch.arena, tag->first->next);
E_Value count_value = e_value_from_expr(tag->first->next);
E_TypeKey element_type_key = e_type_ptee_from_key(type_key);
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_eval.value.u64, 0);
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_value.u64, 0);
irtree.type_key = ptr_type_key;
scratch_end(scratch);
}
return irtree;
}
@@ -617,9 +619,8 @@ E_IRGEN_FUNCTION_DEF(slice)
if(count_member != 0)
{
E_Expr *count_member_expr = e_expr_irext_member_access(arena, expr, &irtree, count_member->name);
E_Eval count_member_eval = e_eval_from_expr(scratch.arena, count_member_expr);
E_Eval count_member_value_eval = e_value_eval_from_eval(count_member_eval);
count = count_member_value_eval.value.u64;
E_Value count_member_value = e_value_from_expr(count_member_expr);
count = count_member_value.u64;
}
// rjf: generate new struct slice type
@@ -760,14 +761,14 @@ e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *
{
E_TokenArray tokens = e_token_array_from_text(scratch.arena, params->type_pattern);
E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, params->type_pattern, &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);
type_key = irtree.type_key;
}
E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1);
node->type_key = type_key;
U8 pattern_split = '?';
node->type_pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, 0);
node->tag_expr = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string));
node->tag_exprs = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string)).exprs;
if(!e_type_key_match(e_type_key_zero(), type_key))
{
U64 hash = e_hash_from_string(5381, str8_struct(&type_key));
@@ -800,7 +801,10 @@ e_auto_hook_tag_exprs_from_type_key(Arena *arena, E_TypeKey type_key)
{
if(e_type_key_match(n->type_key, type_key))
{
e_expr_list_push(arena, &exprs, n->tag_expr);
for(E_Expr *e = n->tag_exprs.first; e != &e_expr_nil; e = e->next)
{
e_expr_list_push(arena, &exprs, e);
}
}
}
}
@@ -829,7 +833,10 @@ e_auto_hook_tag_exprs_from_type_key(Arena *arena, E_TypeKey type_key)
}
if(fits_this_type_string)
{
e_expr_list_push(arena, &exprs, auto_hook_node->tag_expr);
for(E_Expr *e = auto_hook_node->tag_exprs.first; e != &e_expr_nil; e = e->next)
{
e_expr_list_push(arena, &exprs, e);
}
}
}
}
+1 -1
View File
@@ -189,7 +189,7 @@ struct E_AutoHookNode
E_AutoHookNode *pattern_order_next;
E_TypeKey type_key;
String8List type_pattern_parts;
E_Expr *tag_expr;
E_ExprChain tag_exprs;
};
typedef struct E_AutoHookSlot E_AutoHookSlot;
+30 -30
View File
@@ -660,7 +660,7 @@ internal E_Expr *
e_push_expr(Arena *arena, E_ExprKind kind, void *location)
{
E_Expr *e = push_array(arena, E_Expr, 1);
e->first = e->last = e->next = e->ref = e->first_tag = e->last_tag = &e_expr_nil;
e->first = e->last = e->next = e->prev = e->ref = e->first_tag = e->last_tag = &e_expr_nil;
e->location = location;
e->kind = kind;
return e;
@@ -1110,14 +1110,14 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
}
// rjf: construct leaf type
parse.first_expr = parse.last_expr = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
parse.first_expr->type_key = type_key;
parse.exprs.first = parse.exprs.last = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
parse.exprs.first->type_key = type_key;
}
}
}
//- rjf: parse extensions
if(parse.first_expr != &e_expr_nil)
if(parse.exprs.first != &e_expr_nil)
{
for(;;)
{
@@ -1130,9 +1130,9 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
if(str8_match(token_string, str8_lit("*"), 0))
{
token_it += 1;
E_Expr *ptee = parse.first_expr;
parse.first_expr = parse.last_expr = e_push_expr(arena, E_ExprKind_Ptr, token_string.str);
e_expr_push_child(parse.first_expr, ptee);
E_Expr *ptee = parse.exprs.first;
parse.exprs.first = parse.exprs.last = e_push_expr(arena, E_ExprKind_Ptr, token_string.str);
e_expr_push_child(parse.exprs.first, ptee);
}
else
{
@@ -1246,7 +1246,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
// rjf: parse type expr
E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it, it_opl);
E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens);
E_Expr *type = type_parse.last_expr;
E_Expr *type = type_parse.exprs.last;
e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs);
it = type_parse.last_token;
location = token_string.str;
@@ -1329,7 +1329,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl);
E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence, 1);
e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs);
atom = nested_parse.last_expr;
atom = nested_parse.exprs.last;
it = nested_parse.last_token;
// rjf: expect )
@@ -1357,11 +1357,11 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl);
E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence, 1);
e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs);
atom = nested_parse.last_expr;
atom = nested_parse.exprs.last;
it = nested_parse.last_token;
// rjf: build cast-to-U64*, and dereference operators
if(nested_parse.last_expr == &e_expr_nil)
if(nested_parse.exprs.last == &e_expr_nil)
{
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression following `[`.");
}
@@ -1737,7 +1737,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
{
E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it-1, it_opl);
E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens);
E_Expr *type = type_parse.last_expr;
E_Expr *type = type_parse.exprs.last;
e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs);
it = type_parse.last_token;
atom = type;
@@ -2015,10 +2015,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
it = idx_expr_parse.last_token;
// rjf: valid indexing expression => produce index expr
if(idx_expr_parse.last_expr != &e_expr_nil)
if(idx_expr_parse.exprs.last != &e_expr_nil)
{
E_Expr *array_expr = atom;
E_Expr *index_expr = idx_expr_parse.last_expr;
E_Expr *index_expr = idx_expr_parse.exprs.last;
atom = e_push_expr(arena, E_ExprKind_ArrayIndex, token_string.str);
e_expr_push_child(atom, array_expr);
e_expr_push_child(atom, index_expr);
@@ -2055,11 +2055,11 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
E_Parse args_parse = e_parse_expr_from_text_tokens__prec(arena, text, &args_parse_tokens, e_max_precedence, max_U64);
e_msg_list_concat_in_place(&result.msgs, &args_parse.msgs);
it = args_parse.last_token;
if(args_parse.first_expr != &e_expr_nil)
if(args_parse.exprs.first != &e_expr_nil)
{
call_expr->last->next = args_parse.first_expr;
args_parse.first_expr->prev = call_expr->last;
call_expr->last = args_parse.last_expr;
call_expr->last->next = args_parse.exprs.first;
args_parse.exprs.first->prev = call_expr->last;
call_expr->last = args_parse.exprs.last;
}
atom = call_expr;
@@ -2153,7 +2153,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
E_TokenArray rhs_expr_parse_tokens = e_token_array_make_first_opl(it+1, it_opl);
E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &rhs_expr_parse_tokens, binary_precedence-1, 1);
e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);
E_Expr *rhs = rhs_expr_parse.last_expr;
E_Expr *rhs = rhs_expr_parse.exprs.last;
it = rhs_expr_parse.last_token;
if(rhs == &e_expr_nil)
{
@@ -2179,9 +2179,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
E_TokenArray middle_expr_tokens = e_token_array_make_first_opl(it, it_opl);
E_Parse middle_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &middle_expr_tokens, e_max_precedence, 1);
it = middle_expr_parse.last_token;
E_Expr *middle_expr = middle_expr_parse.last_expr;
E_Expr *middle_expr = middle_expr_parse.exprs.last;
e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs);
if(middle_expr_parse.last_expr == &e_expr_nil)
if(middle_expr_parse.exprs.last == &e_expr_nil)
{
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression after `?`.");
}
@@ -2213,7 +2213,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
{
it = rhs_expr_parse.last_token;
e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);
if(rhs_expr_parse.last_expr == &e_expr_nil)
if(rhs_expr_parse.exprs.last == &e_expr_nil)
{
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token_string.str, "Expected expression after `:`.");
}
@@ -2221,12 +2221,12 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
// rjf: build ternary
if(atom != &e_expr_nil &&
middle_expr_parse.last_expr != &e_expr_nil &&
rhs_expr_parse.last_expr != &e_expr_nil)
middle_expr_parse.exprs.last != &e_expr_nil &&
rhs_expr_parse.exprs.last != &e_expr_nil)
{
E_Expr *lhs = atom;
E_Expr *mhs = middle_expr_parse.last_expr;
E_Expr *rhs = rhs_expr_parse.last_expr;
E_Expr *mhs = middle_expr_parse.exprs.last;
E_Expr *rhs = rhs_expr_parse.exprs.last;
atom = e_push_expr(arena, E_ExprKind_Ternary, token_string.str);
e_expr_push_child(atom, lhs);
e_expr_push_child(atom, mhs);
@@ -2244,7 +2244,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
E_Parse tags_parse = e_parse_expr_from_text_tokens__prec(arena, text, &tags_tokens, e_max_precedence, max_U64);
e_msg_list_concat_in_place(&result.msgs, &tags_parse.msgs);
it = tags_parse.last_token;
for(E_Expr *tag = tags_parse.first_expr, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
for(E_Expr *tag = tags_parse.exprs.first, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
{
next = tag->next;
e_expr_push_tag(atom, tag);
@@ -2262,7 +2262,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
//- rjf: store parsed atom to expression chain - if we didn't get an expression, break
if(atom != &e_expr_nil)
{
DLLPushBack_NPZ(&e_expr_nil, result.first_expr, result.last_expr, atom, next, prev);
DLLPushBack_NPZ(&e_expr_nil, result.exprs.first, result.exprs.last, atom, next, prev);
chain_count += 1;
}
else
@@ -2287,14 +2287,14 @@ e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
return parse;
}
internal E_Expr *
internal E_Parse
e_parse_expr_from_text(Arena *arena, String8 text)
{
Temp scratch = scratch_begin(&arena, 1);
E_TokenArray tokens = e_token_array_from_text(scratch.arena, text);
E_Parse parse = e_parse_expr_from_text_tokens(arena, text, &tokens);
scratch_end(scratch);
return parse.last_expr;
return parse;
}
internal E_Parse
+9 -3
View File
@@ -68,6 +68,13 @@ struct E_Expr
String8 bytecode;
};
typedef struct E_ExprChain E_ExprChain;
struct E_ExprChain
{
E_Expr *first;
E_Expr *last;
};
typedef struct E_ExprNode E_ExprNode;
struct E_ExprNode
{
@@ -153,8 +160,7 @@ typedef struct E_Parse E_Parse;
struct E_Parse
{
E_Token *last_token;
E_Expr *first_expr;
E_Expr *last_expr;
E_ExprChain exprs;
E_MsgList msgs;
};
@@ -289,7 +295,7 @@ internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String
internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence, U64 max_chain_count);
internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
internal E_Expr *e_parse_expr_from_text(Arena *arena, String8 text);
internal E_Parse e_parse_expr_from_text(Arena *arena, String8 text);
internal E_Parse e_parse_expr_from_text__cached(String8 text);
#endif // EVAL_PARSE_H
@@ -485,7 +485,7 @@ ev_keyed_expr_push_tags(Arena *arena, EV_View *view, EV_Block *block, EV_Key key
String8 tag_expr = push_str8_copy(arena, ev_view_rule_from_key(view, key));
E_TokenArray tag_expr_tokens = e_token_array_from_text(scratch.arena, tag_expr);
E_Parse tag_expr_parse = e_parse_expr_from_text_tokens(arena, tag_expr, &tag_expr_tokens);
for(E_Expr *tag = tag_expr_parse.first_expr, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
for(E_Expr *tag = tag_expr_parse.exprs.first, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
{
next = tag->next;
e_expr_push_tag(expr, tag);
@@ -508,7 +508,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
//- rjf: generate root expression
EV_Key root_key = ev_key_root();
EV_Key root_row_key = ev_key_make(ev_hash_from_key(root_key), 1);
E_Expr *root_expr = e_expr_copy(arena, eval.expr);
E_Expr *root_expr = e_expr_copy(arena, eval.exprs.last);
ev_keyed_expr_push_tags(arena, view, &ev_nil_block, root_row_key, root_expr);
//- rjf: generate root block
@@ -432,7 +432,7 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterFlags flags, S
F32 right_side_bearing = 0;
if(font.face != 0)
{
atlas_dim.y = (S16)ceil_f32((96.f/72.f) * size * (font_metrics.ascent + font_metrics.descent) / design_units_per_em) + 1;
atlas_dim.y = (S16)round_f32((96.f/72.f) * size * (font_metrics.ascent + font_metrics.descent + font_metrics.lineGap) / design_units_per_em) + 1;
for(U64 idx = 0; idx < glyphs_count; idx += 1)
{
DWRITE_GLYPH_METRICS *glyph_metrics = glyphs_metrics + idx;
@@ -476,11 +476,14 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterFlags flags, S
}
//- rjf: draw glyph run
Vec2F32 draw_p = {0, (F32)atlas_dim.y};
Vec2F32 draw_p = {0, (F32)atlas_dim.y - 1};
if(font.face != 0)
{
F32 descent = round_f32((96.f/72.f)*size * font_metrics.descent / design_units_per_em);
F32 line_gap = round_f32((96.f/72.f)*size * font_metrics.lineGap / design_units_per_em);
draw_p.y -= descent;
draw_p.y -= line_gap;
draw_p.y += 1;
}
DWRITE_GLYPH_RUN glyph_run = {0};
if(font.face != 0)
+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())
{