stage1 部分功能测试00,01,02,06成功
This commit is contained in:
@@ -50,7 +50,7 @@ static int spl_type_size(spl_type_t t) {
|
||||
case SPL_ISIZE:
|
||||
case SPL_USIZE:
|
||||
case SPL_PTR:
|
||||
return sizeof(void *) / 8;
|
||||
return sizeof(void *);
|
||||
case SPL_TYPE_COUNT:
|
||||
return 0;
|
||||
}
|
||||
@@ -554,18 +554,27 @@ void spl_vm_set_debug(spl_vm_t *vm, int enabled) {
|
||||
vm->debug = enabled ? 1 : 0;
|
||||
}
|
||||
|
||||
#define STACK_CANARY(vm) (vm)->stacks.data[(vm)->fp - 1]
|
||||
|
||||
static inline int spl_vm_call(spl_vm_t *vm, spl_val_t addr, spl_val_t nargs) {
|
||||
if (vm->cp >= vm->config.max_call_depth)
|
||||
VM_ERROR("CALLI: call stack overflow");
|
||||
// spl_vm_stackdump(vm, vm->sp);
|
||||
PUSH(SPL_STACK_CANARY);
|
||||
/* Shift args right by 1 to create gap for canary at fp-1 */
|
||||
for (usize i = vm->sp; i >= vm->sp - nargs; --i) {
|
||||
vm->stacks.data[i] = vm->stacks.data[i - 1];
|
||||
}
|
||||
vm->frames.data[vm->cp].saved_sp = vm->sp - nargs - 1;
|
||||
vm->frames.data[vm->cp].saved_fp = vm->fp;
|
||||
vm->frames.data[vm->cp].saved_ip = vm->ip;
|
||||
vm->frames.data[vm->cp].nargs = nargs;
|
||||
vm->cp++;
|
||||
vm->ip = addr;
|
||||
vm->fp = vm->sp - nargs;
|
||||
/* Transparent canary at fp-1 — invisible to normal LADDR/ST */
|
||||
if (vm->fp > 0)
|
||||
vm->stacks.data[vm->fp - 1] = SPL_STACK_CANARY;
|
||||
STACK_CANARY(vm) = SPL_STACK_CANARY;
|
||||
// spl_vm_stackdump(vm, vm->sp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -670,6 +679,18 @@ int spl_vm_run_once(spl_vm_t *vm) {
|
||||
break;
|
||||
}
|
||||
|
||||
case SPL_ROT: {
|
||||
if (vm->sp < 3)
|
||||
VM_ERROR("ROT: stack underflow");
|
||||
spl_val_t _a = vm->stacks.data[vm->sp - 3];
|
||||
spl_val_t _b = vm->stacks.data[vm->sp - 2];
|
||||
spl_val_t _c = vm->stacks.data[vm->sp - 1];
|
||||
vm->stacks.data[vm->sp - 3] = _b;
|
||||
vm->stacks.data[vm->sp - 2] = _c;
|
||||
vm->stacks.data[vm->sp - 1] = _a;
|
||||
break;
|
||||
}
|
||||
|
||||
/* ========== Arithmetic ========== */
|
||||
case SPL_ADD:
|
||||
ARITH_BINOP(+);
|
||||
@@ -821,6 +842,7 @@ int spl_vm_run_once(spl_vm_t *vm) {
|
||||
if (vm->cp <= 0)
|
||||
VM_ERROR("RET: call stack underflow");
|
||||
vm->cp--;
|
||||
intptr_t _saved_sp = vm->frames.data[vm->cp].saved_sp;
|
||||
intptr_t _saved_fp = vm->frames.data[vm->cp].saved_fp;
|
||||
intptr_t _saved_ip = vm->frames.data[vm->cp].saved_ip;
|
||||
/* entry return -> halt */
|
||||
@@ -828,11 +850,12 @@ int spl_vm_run_once(spl_vm_t *vm) {
|
||||
vm->exit_code = (int)_retval;
|
||||
return 1;
|
||||
}
|
||||
vm->sp = vm->fp;
|
||||
vm->sp = _saved_sp;
|
||||
vm->fp = _saved_fp;
|
||||
vm->ip = _saved_ip;
|
||||
if (ins->type != SPL_VOID)
|
||||
PUSH(_retval);
|
||||
// spl_vm_stackdump(vm, vm->sp);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -933,6 +956,9 @@ int spl_vm_run_once(spl_vm_t *vm) {
|
||||
VM_ERROR(vm->error_msg);
|
||||
}
|
||||
spl_val_t *_arg_base = vm->stacks.data + vm->sp - _nargs;
|
||||
// spl_vm_stackdump(vm, vm->sp);
|
||||
// printf("addr %p nargs %zd sp %zd stack %p arg_base %p\n", _nat->impl_fn, _nargs, vm->sp,
|
||||
// vm->stacks.data, _arg_base);
|
||||
spl_val_t _result = _nat->impl_fn(_nargs, _arg_base);
|
||||
vm->sp -= _nargs;
|
||||
PUSH(_result);
|
||||
@@ -969,8 +995,7 @@ int spl_vm_run_once(spl_vm_t *vm) {
|
||||
|
||||
/* canary check in debug mode (canary is at fp-1, invisible to compiled code) */
|
||||
if (vm->debug && vm->fp > 0) {
|
||||
spl_val_t val = vm->stacks.data[vm->fp - 1];
|
||||
if (val != SPL_STACK_CANARY) {
|
||||
if (STACK_CANARY(vm) != SPL_STACK_CANARY) {
|
||||
snprintf(vm->error_msg, sizeof(vm->error_msg),
|
||||
"STACK CANARY CORRUPTED at ip=%zd, fp=%zd\n", vm->ip - 1, vm->fp);
|
||||
VM_ERROR(vm->error_msg);
|
||||
|
||||
Reference in New Issue
Block a user