Skip to content

Commit 50b195d

Browse files
committed
eliminate member-expr-extension irtree/oplist/etc. recomputations; just convert lhs irtree to bytecode and attach that to new expr as a leaf bytecode
1 parent c31b155 commit 50b195d

File tree

5 files changed

+27
-24
lines changed

5 files changed

+27
-24
lines changed

src/eval/eval_ir.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
481481
U64 member_idx = idx + read_range.min;
482482
String8 member_name = (struct_type->members ? struct_type->members[member_idx].name :
483483
struct_type->enum_vals ? struct_type->enum_vals[member_idx].name : str8_lit(""));
484-
exprs[idx] = e_expr_ref_member_access(arena, lhs, member_name);
484+
exprs[idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, member_name);
485485
}
486486
}
487487

@@ -582,7 +582,7 @@ E_IRGEN_FUNCTION_DEF(slice)
582582
U64 count = 0;
583583
if(count_member != 0)
584584
{
585-
E_Expr *count_member_expr = e_expr_ref_member_access(scratch.arena, expr, count_member->name);
585+
E_Expr *count_member_expr = e_expr_irext_member_access(arena, expr, &irtree, count_member->name);
586586
E_Eval count_member_eval = e_eval_from_expr(scratch.arena, count_member_expr);
587587
E_Eval count_member_value_eval = e_value_eval_from_eval(count_member_eval);
588588
count = count_member_value_eval.value.u64;
@@ -2283,6 +2283,26 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist)
22832283
return result;
22842284
}
22852285

2286+
//- rjf: leaf-bytecode expression extensions
2287+
2288+
internal E_Expr *
2289+
e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name)
2290+
{
2291+
E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, 0);
2292+
E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->location);
2293+
E_OpList lhs_oplist = e_oplist_from_irtree(arena, lhs_irtree->root);
2294+
lhs_bytecode->string = lhs->string;
2295+
lhs_bytecode->space = lhs->space;
2296+
lhs_bytecode->mode = lhs_irtree->mode;
2297+
lhs_bytecode->type_key = lhs_irtree->type_key;
2298+
lhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &lhs_oplist);
2299+
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafMember, 0);
2300+
rhs->string = push_str8_copy(arena, member_name);
2301+
e_expr_push_child(root, lhs_bytecode);
2302+
e_expr_push_child(root, rhs);
2303+
return root;
2304+
}
2305+
22862306
////////////////////////////////
22872307
//~ rjf: IRified Expression Cache
22882308

src/eval/eval_ir.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,9 @@ internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space
420420
internal E_OpList e_oplist_from_irtree(Arena *arena, E_IRNode *root);
421421
internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist);
422422

423+
//- rjf: leaf-bytecode expression extensions
424+
internal E_Expr *e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name);
425+
423426
////////////////////////////////
424427
//~ rjf: IRified Expression Cache
425428

src/eval/eval_parse.c

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -698,15 +698,6 @@ e_expr_ref(Arena *arena, E_Expr *ref)
698698
return expr;
699699
}
700700

701-
internal E_Expr *
702-
e_expr_ref_addr(Arena *arena, E_Expr *rhs)
703-
{
704-
E_Expr *expr = e_push_expr(arena, E_ExprKind_Address, 0);
705-
E_Expr *rhs_ref = e_expr_ref(arena, rhs);
706-
e_expr_push_child(expr, rhs_ref);
707-
return expr;
708-
}
709-
710701
internal E_Expr *
711702
e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name)
712703
{
@@ -752,15 +743,6 @@ e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs)
752743
return root;
753744
}
754745

755-
internal E_Expr *
756-
e_expr_ref_bswap(Arena *arena, E_Expr *rhs)
757-
{
758-
E_Expr *root = e_push_expr(arena, E_ExprKind_ByteSwap, 0);
759-
E_Expr *rhs_ref = e_expr_ref(arena, rhs);
760-
e_expr_push_child(root, rhs_ref);
761-
return root;
762-
}
763-
764746
internal E_Expr *
765747
e_expr_copy(Arena *arena, E_Expr *src)
766748
{

src/eval/eval_parse.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,12 +269,10 @@ internal void e_expr_push_child(E_Expr *parent, E_Expr *child);
269269
internal void e_expr_remove_child(E_Expr *parent, E_Expr *child);
270270
internal void e_expr_push_tag(E_Expr *parent, E_Expr *child);
271271
internal E_Expr *e_expr_ref(Arena *arena, E_Expr *ref);
272-
internal E_Expr *e_expr_ref_addr(Arena *arena, E_Expr *rhs);
273272
internal E_Expr *e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name);
274273
internal E_Expr *e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index);
275274
internal E_Expr *e_expr_ref_deref(Arena *arena, E_Expr *rhs);
276275
internal E_Expr *e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs);
277-
internal E_Expr *e_expr_ref_bswap(Arena *arena, E_Expr *rhs);
278276
internal E_Expr *e_expr_copy(Arena *arena, E_Expr *src);
279277
internal void e_expr_list_push(Arena *arena, E_ExprList *list, E_Expr *expr);
280278

src/raddbg/raddbg_core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8650,7 +8650,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(thread)
86508650
for(U64 extras_idx = 0; extras_idx < extras_count; extras_idx += 1)
86518651
{
86528652
U64 out_idx = extras_idx_range.min - idx_range.min + extras_idx;
8653-
exprs[out_idx] = e_expr_ref_member_access(arena, lhs, str8_lit("call_stack"));
8653+
exprs[out_idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, str8_lit("call_stack"));
86548654
}
86558655
scratch_end(scratch);
86568656
}
@@ -8754,7 +8754,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(target)
87548754
for(U64 extras_idx = 0; extras_idx < extras_count; extras_idx += 1)
87558755
{
87568756
U64 out_idx = extras_idx_range.min - idx_range.min + extras_idx;
8757-
exprs[out_idx] = e_expr_ref_member_access(arena, lhs, str8_lit("environment"));
8757+
exprs[out_idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, str8_lit("environment"));
87588758
}
87598759
scratch_end(scratch);
87608760
}

0 commit comments

Comments
 (0)