From be8ed940bda4c66cd9301e567ef07d354f7cb688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Mon, 27 Apr 2026 18:15:31 +0300 Subject: [PATCH] eval: implement Swap; soft-fail CallSiteValue; no-op piece markers --- src/eval/eval_interpret.c | 53 +++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 84b5f8a0..dc103061 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -996,20 +996,53 @@ e_interpret(String8 bytecode) } }break; + case RDI_EvalOp_CallSiteValue: + { + // DW_OP_entry_value: requires evaluating the embedded sub-bytecode + // in this frame's entry-time register state (i.e. caller's state + // at the call instruction). that state is not currently plumbed + // into the eval context. interpreting in the current ctx gives + // wrong values for spilled args, so report BadOp instead. + // skip past the embedded sub-bytecode in the outer stream so the + // bytes are not interpreted as outer ops on resume. + U32 sub_size = imm.u32; + if(ptr + sub_size <= opl) + { + ptr += sub_size; + } + result.code = E_InterpretationCode_BadOp; + goto done; + }break; + + case RDI_EvalOp_PartialValue: + { + // DW_OP_piece marker: top-of-stack is a piece of a composite value. + // we do not assemble composites; for single-piece expressions the + // value already on the stack is the result. for multi-piece, only + // the first piece is returned (stack[0] is the final result). + }break; + + case RDI_EvalOp_PartialValueBit: + { + // DW_OP_bit_piece marker. same caveat as PartialValue. + }break; + + case RDI_EvalOp_Swap: + { + if(stack_count + 2 > stack_cap) + { + result.code = E_InterpretationCode_InsufficientStackSpace; + goto done; + } + stack[stack_count + 0] = svals[1]; + stack[stack_count + 1] = svals[0]; + stack_count += 2; + }break; + case RDI_EvalOp_PushCfa: { nval.u64 = e_interpret_ctx->cfa; }break; - - case RDI_EvalOp_CallSiteValue: - case RDI_EvalOp_PartialValue: - case RDI_EvalOp_PartialValueBit: - case RDI_EvalOp_Swap: - { - // TODO(rjf) - result.code = E_InterpretationCode_BadOp; - goto done; - }break; } // rjf: push