stage1 指针计算类型的错误修复 as运算符优先级的修改 ir2vm的bug修复

This commit is contained in:
zzy committed 2026-09-15 21:24:58 +08:00
1 parent 06f3884c30
commit 09d05e3a34
10 files changed
+191 -60

No files matched your search

+30 -4
View File
@@ -587,6 +587,25 @@ void spl_vm_drop(spl_vm_t *vm) {
vec_free(vm->breakpoints);
}
// FIXME
int spl_vm_addr_valid(uintptr_t p, usize size) {
if (p == 0)
return 0;
if (p < 0x1000)
return 0;
uintptr_t max =
(sizeof(void *) == 8) ? (uintptr_t)0x00007FFFFFFFFFFFULL : (uintptr_t)0x7FFFFFFF;
if (p > max)
return 0;
if (size > 0) {
if (p + size < p)
return 0;
if (p + size > max)
return 0;
}
return 1;
}
void spl_vm_add_breakpoint(spl_vm_t *vm, usize ip) {
if (!vm)
return;
@@ -1108,10 +1127,17 @@ int spl_vm_run_once(spl_vm_t *vm) {
VM_ERROR(vm->error_msg);
}
spl_vm_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_vm_val_t _result = _nat->impl_fn(_nargs, _arg_base);
spl_vm_val_t _result = _nat->impl_fn(vm, _nargs, _arg_base);
if (vm->exit_code) {
snprintf(vm->error_msg, sizeof(vm->error_msg), "NCALL %s failed (ip=%zd)",
_nat->name ? _nat->name : "?", vm->ip - 1);
fprintf(stderr, "native call: %s\n", _nat->name ? _nat->name : "?");
fprintf(stderr, " nargs=%zd arg_base=%p sp=%zu\n", _nargs, (void *)_arg_base,
vm->sp);
spl_vm_backtrace(vm, vm->fp);
spl_vm_stackdump(vm, vm->sp);
return -1;
}
vm->sp -= _nargs;
PUSH(_result);
break;