diff --git a/lang/bytecode.c b/lang/bytecode.c index 3af1285..74491c5 100644 --- a/lang/bytecode.c +++ b/lang/bytecode.c @@ -8,10 +8,17 @@ enum opcodes { OP_RET = 0x00, OP_NUM = 0x01, + OP_DROP = 0x02, }; // clang-format off static const unsigned char bytecode[] = { + OP_NUM, 0xaa, 0xaa, 0xaa, 0xaa, + OP_DROP, + OP_NUM, 0xbb, 0xbb, 0xbb, 0xbb, + OP_DROP, + OP_NUM, 0xcc, 0xcc, 0xcc, 0xcc, + OP_DROP, OP_NUM, 0xd2, 0x04, 0x00, 0x00, OP_RET }; @@ -33,6 +40,10 @@ *pos_stack++ = number_create(num); break; } + case OP_DROP: { + object_drop(--pos_stack); + break; + } } } } diff --git a/lang/main.c b/lang/main.c index 7aab790..cfff5bc 100644 --- a/lang/main.c +++ b/lang/main.c @@ -25,7 +25,8 @@ static void test_func(void) { struct object *funcA = func_create(); - struct object *args[] = {NULL}; + // args must have space for a stack + struct object *args[8] = {NULL, NULL}; dispatch_call(funcA, "Call", 0, &args[0]); printf("funcA is %p\n", (void *)funcA); object_drop(&funcA);