diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index f87ee218..9a2204c3 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -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 diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index bc642f31..2d97568d 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -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 diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index e6509523..7f1e4ef5 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -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) { diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 75c6d399..d525a155 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -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); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index ca48aee6..6819994c 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -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); }