mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
eliminate member-expr-extension irtree/oplist/etc. recomputations; just convert lhs irtree to bytecode and attach that to new expr as a leaf bytecode
This commit is contained in:
+22
-2
@@ -481,7 +481,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
|
||||
U64 member_idx = idx + read_range.min;
|
||||
String8 member_name = (struct_type->members ? struct_type->members[member_idx].name :
|
||||
struct_type->enum_vals ? struct_type->enum_vals[member_idx].name : str8_lit(""));
|
||||
exprs[idx] = e_expr_ref_member_access(arena, lhs, member_name);
|
||||
exprs[idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, member_name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -582,7 +582,7 @@ E_IRGEN_FUNCTION_DEF(slice)
|
||||
U64 count = 0;
|
||||
if(count_member != 0)
|
||||
{
|
||||
E_Expr *count_member_expr = e_expr_ref_member_access(scratch.arena, expr, count_member->name);
|
||||
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;
|
||||
@@ -2283,6 +2283,26 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist)
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: leaf-bytecode expression extensions
|
||||
|
||||
internal E_Expr *
|
||||
e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name)
|
||||
{
|
||||
E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, 0);
|
||||
E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->location);
|
||||
E_OpList lhs_oplist = e_oplist_from_irtree(arena, lhs_irtree->root);
|
||||
lhs_bytecode->string = lhs->string;
|
||||
lhs_bytecode->space = lhs->space;
|
||||
lhs_bytecode->mode = lhs_irtree->mode;
|
||||
lhs_bytecode->type_key = lhs_irtree->type_key;
|
||||
lhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &lhs_oplist);
|
||||
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafMember, 0);
|
||||
rhs->string = push_str8_copy(arena, member_name);
|
||||
e_expr_push_child(root, lhs_bytecode);
|
||||
e_expr_push_child(root, rhs);
|
||||
return root;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: IRified Expression Cache
|
||||
|
||||
|
||||
@@ -420,6 +420,9 @@ internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space
|
||||
internal E_OpList e_oplist_from_irtree(Arena *arena, E_IRNode *root);
|
||||
internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist);
|
||||
|
||||
//- rjf: leaf-bytecode expression extensions
|
||||
internal E_Expr *e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: IRified Expression Cache
|
||||
|
||||
|
||||
@@ -698,15 +698,6 @@ e_expr_ref(Arena *arena, E_Expr *ref)
|
||||
return expr;
|
||||
}
|
||||
|
||||
internal E_Expr *
|
||||
e_expr_ref_addr(Arena *arena, E_Expr *rhs)
|
||||
{
|
||||
E_Expr *expr = e_push_expr(arena, E_ExprKind_Address, 0);
|
||||
E_Expr *rhs_ref = e_expr_ref(arena, rhs);
|
||||
e_expr_push_child(expr, rhs_ref);
|
||||
return expr;
|
||||
}
|
||||
|
||||
internal E_Expr *
|
||||
e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name)
|
||||
{
|
||||
@@ -752,15 +743,6 @@ e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs)
|
||||
return root;
|
||||
}
|
||||
|
||||
internal E_Expr *
|
||||
e_expr_ref_bswap(Arena *arena, E_Expr *rhs)
|
||||
{
|
||||
E_Expr *root = e_push_expr(arena, E_ExprKind_ByteSwap, 0);
|
||||
E_Expr *rhs_ref = e_expr_ref(arena, rhs);
|
||||
e_expr_push_child(root, rhs_ref);
|
||||
return root;
|
||||
}
|
||||
|
||||
internal E_Expr *
|
||||
e_expr_copy(Arena *arena, E_Expr *src)
|
||||
{
|
||||
|
||||
@@ -269,12 +269,10 @@ internal void e_expr_push_child(E_Expr *parent, E_Expr *child);
|
||||
internal void e_expr_remove_child(E_Expr *parent, E_Expr *child);
|
||||
internal void e_expr_push_tag(E_Expr *parent, E_Expr *child);
|
||||
internal E_Expr *e_expr_ref(Arena *arena, E_Expr *ref);
|
||||
internal E_Expr *e_expr_ref_addr(Arena *arena, E_Expr *rhs);
|
||||
internal E_Expr *e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name);
|
||||
internal E_Expr *e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index);
|
||||
internal E_Expr *e_expr_ref_deref(Arena *arena, E_Expr *rhs);
|
||||
internal E_Expr *e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs);
|
||||
internal E_Expr *e_expr_ref_bswap(Arena *arena, E_Expr *rhs);
|
||||
internal E_Expr *e_expr_copy(Arena *arena, E_Expr *src);
|
||||
internal void e_expr_list_push(Arena *arena, E_ExprList *list, E_Expr *expr);
|
||||
|
||||
|
||||
@@ -8650,7 +8650,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(thread)
|
||||
for(U64 extras_idx = 0; extras_idx < extras_count; extras_idx += 1)
|
||||
{
|
||||
U64 out_idx = extras_idx_range.min - idx_range.min + extras_idx;
|
||||
exprs[out_idx] = e_expr_ref_member_access(arena, lhs, str8_lit("call_stack"));
|
||||
exprs[out_idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, str8_lit("call_stack"));
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
@@ -8754,7 +8754,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(target)
|
||||
for(U64 extras_idx = 0; extras_idx < extras_count; extras_idx += 1)
|
||||
{
|
||||
U64 out_idx = extras_idx_range.min - idx_range.min + extras_idx;
|
||||
exprs[out_idx] = e_expr_ref_member_access(arena, lhs, str8_lit("environment"));
|
||||
exprs[out_idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, str8_lit("environment"));
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user