diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index 2921afc8..f5e4a5c3 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -3196,9 +3196,14 @@ e2_bytecode_from_irnode(Arena *arena, E2_IRNode *irnode) E2_IRNode *ir = t->ir; //- rjf: unpack this op - U16 ctrlbits = rdi_eval_op_ctrlbits_table[ir->op]; - U64 child_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); - if(ir->op == 0) + U16 ctrlbits = 0; + U64 child_count = 0; + if(0 < ir->op && ir->op < RDI_EvalOp_COUNT) + { + ctrlbits = rdi_eval_op_ctrlbits_table[ir->op]; + child_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); + } + else { child_count = ir->child_count; } @@ -3235,6 +3240,15 @@ e2_bytecode_from_irnode(Arena *arena, E2_IRNode *irnode) { ctrlbits = rdi_eval_op_ctrlbits_table[ir->op]; } + else switch(ir->op) + { + default:{}break; + case E2_EvalOp_SetCtxID: + case E2_EvalOp_LeafBytecode: + { + ctrlbits = RDI_EVAL_CTRLBITS(8, 0, 0); + }break; + } U64 decode_byte_count = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); U64 op_size = 1 + decode_byte_count; U8 *op_buffer = push_array(scratch.arena, U8, op_size); diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index af0488ea..ab134099 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -26,7 +26,7 @@ E2_ExprParseKind; enum { E2_EvalOp_SetCtxID = RDI_EvalOp_COUNT, - E2_EvalOp_LeafMacroArgument, + E2_EvalOp_LeafBytecode, }; //////////////////////////////// diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 435ca84c..1c7618a6 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -44,7 +44,6 @@ entry_point(CmdLine *cmdline) // int & B // (1 + (int)&B) s("int32(*)(int32, int32)"), -#if 0 s("123(1, 2, 3)"), s("int32 (*) [100]"), s("(3 * 4) + 2"), @@ -85,6 +84,7 @@ entry_point(CmdLine *cmdline) s("123 + "), s("-123"), s("sizeof 123"), +#if 0 // TODO(rjf): these are ambiguous with regular C type expressions with a naive parse: // s("float32(111)"), // s("float64(111)"),