stage1 指针计算类型的错误修复 as运算符优先级的修改 ir2vm的bug修复
This commit is contained in:
1 parent
06f3884c30
commit
09d05e3a34
10 files changed
+191
-60
No files matched your search
+30
-4
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user