Skip to content

Commit c603457

Browse files
committed
dead code deletion, begin extending eval/eval-viz to work on expr-chains rather than single expressions; fixes / convergence for watch window
1 parent 176c259 commit c603457

File tree

12 files changed

+152
-232
lines changed

12 files changed

+152
-232
lines changed

src/eval/eval_bundles.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,17 @@
66

77
internal E_Eval
88
e_eval_from_expr(Arena *arena, E_Expr *expr)
9+
{
10+
E_ExprChain exprs = {expr, expr};
11+
E_Eval result = e_eval_from_exprs(arena, exprs);
12+
return result;
13+
}
14+
15+
internal E_Eval
16+
e_eval_from_exprs(Arena *arena, E_ExprChain exprs)
917
{
1018
ProfBeginFunction();
11-
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr);
19+
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, exprs.last);
1220
E_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
1321
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
1422
E_Interpretation interp = e_interpret(bytecode);
@@ -17,7 +25,7 @@ e_eval_from_expr(Arena *arena, E_Expr *expr)
1725
.value = interp.value,
1826
.mode = irtree.mode,
1927
.space = interp.space,
20-
.expr = expr,
28+
.exprs = exprs,
2129
.type_key = irtree.type_key,
2230
.code = interp.code,
2331
};
@@ -35,7 +43,7 @@ e_eval_from_string(Arena *arena, String8 string)
3543
{
3644
E_TokenArray tokens = e_token_array_from_text(arena, string);
3745
E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens);
38-
E_Eval eval = e_eval_from_expr(arena, parse.last_expr);
46+
E_Eval eval = e_eval_from_exprs(arena, parse.exprs);
3947
e_msg_list_concat_in_place(&eval.msgs, &parse.msgs);
4048
return eval;
4149
}

src/eval/eval_bundles.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ struct E_Eval
1313
E_Value value;
1414
E_Mode mode;
1515
E_Space space;
16-
E_Expr *expr;
16+
E_ExprChain exprs;
1717
E_TypeKey type_key;
1818
E_InterpretationCode code;
1919
E_MsgList msgs;
@@ -23,6 +23,7 @@ struct E_Eval
2323
//~ rjf: Bundled Evaluation Functions
2424

2525
internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr);
26+
internal E_Eval e_eval_from_exprs(Arena *arena, E_ExprChain exprs);
2627
internal E_Eval e_eval_from_string(Arena *arena, String8 string);
2728
internal E_Eval e_eval_from_stringf(Arena *arena, char *fmt, ...);
2829
internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval);

src/eval/eval_ir.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,15 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
166166
}
167167
else if(lhs_type_kind == E_TypeKind_Struct ||
168168
lhs_type_kind == E_TypeKind_Class ||
169-
lhs_type_kind == E_TypeKind_Union ||
170-
lhs_type_kind == E_TypeKind_Enum)
169+
lhs_type_kind == E_TypeKind_Union)
171170
{
172-
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
173-
lookup_info.named_expr_count = lhs_type->count;
171+
E_MemberArray data_members = e_type_data_members_from_key__cached(lhs_type_key);
172+
lookup_info.named_expr_count = data_members.count;
173+
}
174+
else if(lhs_type_kind == E_TypeKind_Enum)
175+
{
176+
E_Type *direct_type = e_type_from_key__cached(lhs_type_key);
177+
lookup_info.named_expr_count = direct_type->count;
174178
}
175179
else if(lhs_type_kind == E_TypeKind_Array)
176180
{
@@ -570,12 +574,10 @@ E_IRGEN_FUNCTION_DEF(array)
570574
E_TypeKind type_kind = e_type_kind_from_key(type_key);
571575
if(e_type_kind_is_pointer_or_ref(type_kind))
572576
{
573-
Temp scratch = scratch_begin(&arena, 1);
574-
E_Eval count_eval = e_eval_from_expr(scratch.arena, tag->first->next);
577+
E_Value count_value = e_value_from_expr(tag->first->next);
575578
E_TypeKey element_type_key = e_type_ptee_from_key(type_key);
576-
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);
579+
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_value.u64, 0);
577580
irtree.type_key = ptr_type_key;
578-
scratch_end(scratch);
579581
}
580582
return irtree;
581583
}
@@ -617,9 +619,8 @@ E_IRGEN_FUNCTION_DEF(slice)
617619
if(count_member != 0)
618620
{
619621
E_Expr *count_member_expr = e_expr_irext_member_access(arena, expr, &irtree, count_member->name);
620-
E_Eval count_member_eval = e_eval_from_expr(scratch.arena, count_member_expr);
621-
E_Eval count_member_value_eval = e_value_eval_from_eval(count_member_eval);
622-
count = count_member_value_eval.value.u64;
622+
E_Value count_member_value = e_value_from_expr(count_member_expr);
623+
count = count_member_value.u64;
623624
}
624625

625626
// rjf: generate new struct slice type
@@ -760,14 +761,14 @@ e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *
760761
{
761762
E_TokenArray tokens = e_token_array_from_text(scratch.arena, params->type_pattern);
762763
E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, params->type_pattern, &tokens);
763-
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.last_expr);
764+
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.exprs.last);
764765
type_key = irtree.type_key;
765766
}
766767
E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1);
767768
node->type_key = type_key;
768769
U8 pattern_split = '?';
769770
node->type_pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, 0);
770-
node->tag_expr = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string));
771+
node->tag_exprs = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string)).exprs;
771772
if(!e_type_key_match(e_type_key_zero(), type_key))
772773
{
773774
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)
800801
{
801802
if(e_type_key_match(n->type_key, type_key))
802803
{
803-
e_expr_list_push(arena, &exprs, n->tag_expr);
804+
for(E_Expr *e = n->tag_exprs.first; e != &e_expr_nil; e = e->next)
805+
{
806+
e_expr_list_push(arena, &exprs, e);
807+
}
804808
}
805809
}
806810
}
@@ -829,7 +833,10 @@ e_auto_hook_tag_exprs_from_type_key(Arena *arena, E_TypeKey type_key)
829833
}
830834
if(fits_this_type_string)
831835
{
832-
e_expr_list_push(arena, &exprs, auto_hook_node->tag_expr);
836+
for(E_Expr *e = auto_hook_node->tag_exprs.first; e != &e_expr_nil; e = e->next)
837+
{
838+
e_expr_list_push(arena, &exprs, e);
839+
}
833840
}
834841
}
835842
}

src/eval/eval_ir.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ struct E_AutoHookNode
189189
E_AutoHookNode *pattern_order_next;
190190
E_TypeKey type_key;
191191
String8List type_pattern_parts;
192-
E_Expr *tag_expr;
192+
E_ExprChain tag_exprs;
193193
};
194194

195195
typedef struct E_AutoHookSlot E_AutoHookSlot;

src/eval/eval_parse.c

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ internal E_Expr *
660660
e_push_expr(Arena *arena, E_ExprKind kind, void *location)
661661
{
662662
E_Expr *e = push_array(arena, E_Expr, 1);
663-
e->first = e->last = e->next = e->ref = e->first_tag = e->last_tag = &e_expr_nil;
663+
e->first = e->last = e->next = e->prev = e->ref = e->first_tag = e->last_tag = &e_expr_nil;
664664
e->location = location;
665665
e->kind = kind;
666666
return e;
@@ -1110,14 +1110,14 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
11101110
}
11111111

11121112
// rjf: construct leaf type
1113-
parse.first_expr = parse.last_expr = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
1114-
parse.first_expr->type_key = type_key;
1113+
parse.exprs.first = parse.exprs.last = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
1114+
parse.exprs.first->type_key = type_key;
11151115
}
11161116
}
11171117
}
11181118

11191119
//- rjf: parse extensions
1120-
if(parse.first_expr != &e_expr_nil)
1120+
if(parse.exprs.first != &e_expr_nil)
11211121
{
11221122
for(;;)
11231123
{
@@ -1130,9 +1130,9 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
11301130
if(str8_match(token_string, str8_lit("*"), 0))
11311131
{
11321132
token_it += 1;
1133-
E_Expr *ptee = parse.first_expr;
1134-
parse.first_expr = parse.last_expr = e_push_expr(arena, E_ExprKind_Ptr, token_string.str);
1135-
e_expr_push_child(parse.first_expr, ptee);
1133+
E_Expr *ptee = parse.exprs.first;
1134+
parse.exprs.first = parse.exprs.last = e_push_expr(arena, E_ExprKind_Ptr, token_string.str);
1135+
e_expr_push_child(parse.exprs.first, ptee);
11361136
}
11371137
else
11381138
{
@@ -1246,7 +1246,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
12461246
// rjf: parse type expr
12471247
E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it, it_opl);
12481248
E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens);
1249-
E_Expr *type = type_parse.last_expr;
1249+
E_Expr *type = type_parse.exprs.last;
12501250
e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs);
12511251
it = type_parse.last_token;
12521252
location = token_string.str;
@@ -1329,7 +1329,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
13291329
E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl);
13301330
E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence, 1);
13311331
e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs);
1332-
atom = nested_parse.last_expr;
1332+
atom = nested_parse.exprs.last;
13331333
it = nested_parse.last_token;
13341334

13351335
// rjf: expect )
@@ -1357,11 +1357,11 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
13571357
E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl);
13581358
E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence, 1);
13591359
e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs);
1360-
atom = nested_parse.last_expr;
1360+
atom = nested_parse.exprs.last;
13611361
it = nested_parse.last_token;
13621362

13631363
// rjf: build cast-to-U64*, and dereference operators
1364-
if(nested_parse.last_expr == &e_expr_nil)
1364+
if(nested_parse.exprs.last == &e_expr_nil)
13651365
{
13661366
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression following `[`.");
13671367
}
@@ -1737,7 +1737,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
17371737
{
17381738
E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it-1, it_opl);
17391739
E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens);
1740-
E_Expr *type = type_parse.last_expr;
1740+
E_Expr *type = type_parse.exprs.last;
17411741
e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs);
17421742
it = type_parse.last_token;
17431743
atom = type;
@@ -2015,10 +2015,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
20152015
it = idx_expr_parse.last_token;
20162016

20172017
// rjf: valid indexing expression => produce index expr
2018-
if(idx_expr_parse.last_expr != &e_expr_nil)
2018+
if(idx_expr_parse.exprs.last != &e_expr_nil)
20192019
{
20202020
E_Expr *array_expr = atom;
2021-
E_Expr *index_expr = idx_expr_parse.last_expr;
2021+
E_Expr *index_expr = idx_expr_parse.exprs.last;
20222022
atom = e_push_expr(arena, E_ExprKind_ArrayIndex, token_string.str);
20232023
e_expr_push_child(atom, array_expr);
20242024
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
20552055
E_Parse args_parse = e_parse_expr_from_text_tokens__prec(arena, text, &args_parse_tokens, e_max_precedence, max_U64);
20562056
e_msg_list_concat_in_place(&result.msgs, &args_parse.msgs);
20572057
it = args_parse.last_token;
2058-
if(args_parse.first_expr != &e_expr_nil)
2058+
if(args_parse.exprs.first != &e_expr_nil)
20592059
{
2060-
call_expr->last->next = args_parse.first_expr;
2061-
args_parse.first_expr->prev = call_expr->last;
2062-
call_expr->last = args_parse.last_expr;
2060+
call_expr->last->next = args_parse.exprs.first;
2061+
args_parse.exprs.first->prev = call_expr->last;
2062+
call_expr->last = args_parse.exprs.last;
20632063
}
20642064
atom = call_expr;
20652065

@@ -2153,7 +2153,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
21532153
E_TokenArray rhs_expr_parse_tokens = e_token_array_make_first_opl(it+1, it_opl);
21542154
E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &rhs_expr_parse_tokens, binary_precedence-1, 1);
21552155
e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);
2156-
E_Expr *rhs = rhs_expr_parse.last_expr;
2156+
E_Expr *rhs = rhs_expr_parse.exprs.last;
21572157
it = rhs_expr_parse.last_token;
21582158
if(rhs == &e_expr_nil)
21592159
{
@@ -2179,9 +2179,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
21792179
E_TokenArray middle_expr_tokens = e_token_array_make_first_opl(it, it_opl);
21802180
E_Parse middle_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &middle_expr_tokens, e_max_precedence, 1);
21812181
it = middle_expr_parse.last_token;
2182-
E_Expr *middle_expr = middle_expr_parse.last_expr;
2182+
E_Expr *middle_expr = middle_expr_parse.exprs.last;
21832183
e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs);
2184-
if(middle_expr_parse.last_expr == &e_expr_nil)
2184+
if(middle_expr_parse.exprs.last == &e_expr_nil)
21852185
{
21862186
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression after `?`.");
21872187
}
@@ -2213,20 +2213,20 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
22132213
{
22142214
it = rhs_expr_parse.last_token;
22152215
e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);
2216-
if(rhs_expr_parse.last_expr == &e_expr_nil)
2216+
if(rhs_expr_parse.exprs.last == &e_expr_nil)
22172217
{
22182218
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token_string.str, "Expected expression after `:`.");
22192219
}
22202220
}
22212221

22222222
// rjf: build ternary
22232223
if(atom != &e_expr_nil &&
2224-
middle_expr_parse.last_expr != &e_expr_nil &&
2225-
rhs_expr_parse.last_expr != &e_expr_nil)
2224+
middle_expr_parse.exprs.last != &e_expr_nil &&
2225+
rhs_expr_parse.exprs.last != &e_expr_nil)
22262226
{
22272227
E_Expr *lhs = atom;
2228-
E_Expr *mhs = middle_expr_parse.last_expr;
2229-
E_Expr *rhs = rhs_expr_parse.last_expr;
2228+
E_Expr *mhs = middle_expr_parse.exprs.last;
2229+
E_Expr *rhs = rhs_expr_parse.exprs.last;
22302230
atom = e_push_expr(arena, E_ExprKind_Ternary, token_string.str);
22312231
e_expr_push_child(atom, lhs);
22322232
e_expr_push_child(atom, mhs);
@@ -2244,7 +2244,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
22442244
E_Parse tags_parse = e_parse_expr_from_text_tokens__prec(arena, text, &tags_tokens, e_max_precedence, max_U64);
22452245
e_msg_list_concat_in_place(&result.msgs, &tags_parse.msgs);
22462246
it = tags_parse.last_token;
2247-
for(E_Expr *tag = tags_parse.first_expr, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
2247+
for(E_Expr *tag = tags_parse.exprs.first, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
22482248
{
22492249
next = tag->next;
22502250
e_expr_push_tag(atom, tag);
@@ -2262,7 +2262,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
22622262
//- rjf: store parsed atom to expression chain - if we didn't get an expression, break
22632263
if(atom != &e_expr_nil)
22642264
{
2265-
DLLPushBack_NPZ(&e_expr_nil, result.first_expr, result.last_expr, atom, next, prev);
2265+
DLLPushBack_NPZ(&e_expr_nil, result.exprs.first, result.exprs.last, atom, next, prev);
22662266
chain_count += 1;
22672267
}
22682268
else
@@ -2287,14 +2287,14 @@ e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
22872287
return parse;
22882288
}
22892289

2290-
internal E_Expr *
2290+
internal E_Parse
22912291
e_parse_expr_from_text(Arena *arena, String8 text)
22922292
{
22932293
Temp scratch = scratch_begin(&arena, 1);
22942294
E_TokenArray tokens = e_token_array_from_text(scratch.arena, text);
22952295
E_Parse parse = e_parse_expr_from_text_tokens(arena, text, &tokens);
22962296
scratch_end(scratch);
2297-
return parse.last_expr;
2297+
return parse;
22982298
}
22992299

23002300
internal E_Parse

src/eval/eval_parse.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ struct E_Expr
6868
String8 bytecode;
6969
};
7070

71+
typedef struct E_ExprChain E_ExprChain;
72+
struct E_ExprChain
73+
{
74+
E_Expr *first;
75+
E_Expr *last;
76+
};
77+
7178
typedef struct E_ExprNode E_ExprNode;
7279
struct E_ExprNode
7380
{
@@ -153,8 +160,7 @@ typedef struct E_Parse E_Parse;
153160
struct E_Parse
154161
{
155162
E_Token *last_token;
156-
E_Expr *first_expr;
157-
E_Expr *last_expr;
163+
E_ExprChain exprs;
158164
E_MsgList msgs;
159165
};
160166

@@ -289,7 +295,7 @@ internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String
289295
internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
290296
internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence, U64 max_chain_count);
291297
internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
292-
internal E_Expr *e_parse_expr_from_text(Arena *arena, String8 text);
298+
internal E_Parse e_parse_expr_from_text(Arena *arena, String8 text);
293299
internal E_Parse e_parse_expr_from_text__cached(String8 text);
294300

295301
#endif // EVAL_PARSE_H

src/eval_visualization/eval_visualization_core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ ev_keyed_expr_push_tags(Arena *arena, EV_View *view, EV_Block *block, EV_Key key
485485
String8 tag_expr = push_str8_copy(arena, ev_view_rule_from_key(view, key));
486486
E_TokenArray tag_expr_tokens = e_token_array_from_text(scratch.arena, tag_expr);
487487
E_Parse tag_expr_parse = e_parse_expr_from_text_tokens(arena, tag_expr, &tag_expr_tokens);
488-
for(E_Expr *tag = tag_expr_parse.first_expr, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
488+
for(E_Expr *tag = tag_expr_parse.exprs.first, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
489489
{
490490
next = tag->next;
491491
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
508508
//- rjf: generate root expression
509509
EV_Key root_key = ev_key_root();
510510
EV_Key root_row_key = ev_key_make(ev_hash_from_key(root_key), 1);
511-
E_Expr *root_expr = e_expr_copy(arena, eval.expr);
511+
E_Expr *root_expr = e_expr_copy(arena, eval.exprs.last);
512512
ev_keyed_expr_push_tags(arena, view, &ev_nil_block, root_row_key, root_expr);
513513

514514
//- rjf: generate root block

0 commit comments

Comments
 (0)