exit(1);
}
-void out_of_memory()
-{
- return vm->out_of_memory();
-}
-
void factorvm::fatal_error(const char* msg, cell tagged)
{
print_string("fatal_error: "); print_string(msg);
exit(1);
}
-void fatal_error(const char* msg, cell tagged)
-{
- return vm->fatal_error(msg,tagged);
-}
-
void factorvm::critical_error(const char* msg, cell tagged)
{
print_string("You have triggered a bug in Factor. Please report.\n");
factorbug();
}
-void critical_error(const char* msg, cell tagged)
-{
- return vm->critical_error(msg,tagged);
-}
-
void factorvm::throw_error(cell error, stack_frame *callstack_top)
{
/* If the error handler is set, we rewind any C stack frames and
tag_fixnum(error),arg1,arg2),callstack_top);
}
-void general_error(vm_error_type error, cell arg1, cell arg2, stack_frame *callstack_top)
-{
- return vm->general_error(error,arg1,arg2,callstack_top);
-}
void factorvm::type_error(cell type, cell tagged)
{
general_error(ERROR_NOT_IMPLEMENTED,F,F,NULL);
}
-void not_implemented_error()
-{
- return vm->not_implemented_error();
-}
/* Test if 'fault' is in the guard page at the top or bottom (depending on
offset being 0 or -1) of area+area_size */
general_error(ERROR_DIVIDE_BY_ZERO,F,F,NULL);
}
-void divide_by_zero_error()
-{
- return vm->divide_by_zero_error();
-}
-
void factorvm::fp_trap_error(unsigned int fpu_status, stack_frame *signal_callstack_top)
{
general_error(ERROR_FP_TRAP,tag_fixnum(fpu_status),F,signal_callstack_top);
ERROR_FP_TRAP,
};
-void out_of_memory();
-void fatal_error(const char* msg, cell tagged);
-void critical_error(const char* msg, cell tagged);
-
PRIMITIVE(die);
-
-void general_error(vm_error_type error, cell arg1, cell arg2, stack_frame *native_stack);
-void not_implemented_error();
-void fp_trap_error(unsigned int fpu_status, stack_frame *signal_callstack_top);
-
PRIMITIVE(call_clear);
PRIMITIVE(unimplemented);
/* Allocate a port on which the thread shall listen for exceptions. */
if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
!= KERN_SUCCESS)
- fatal_error("mach_port_allocate() failed",0);
+ vm->fatal_error("mach_port_allocate() failed",0);
/* See http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */
if (mach_port_insert_right (self, our_exception_port, our_exception_port,
MACH_MSG_TYPE_MAKE_SEND)
!= KERN_SUCCESS)
- fatal_error("mach_port_insert_right() failed",0);
+ vm->fatal_error("mach_port_insert_right() failed",0);
/* The exceptions we want to catch. */
mask = EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC;
if (task_set_exception_ports (self, mask, our_exception_port,
EXCEPTION_DEFAULT, MACHINE_THREAD_STATE)
!= KERN_SUCCESS)
- fatal_error("task_set_exception_ports() failed",0);
+ vm->fatal_error("task_set_exception_ports() failed",0);
}
}
: "r0","r1","r2");
if(result < 0)
- critical_error("flush_icache() failed",result);
+ vm->critical_error("flush_icache() failed",result);
}
}
int size = readlink("/proc/self/exe", path, PATH_MAX);
if (size < 0)
{
- fatal_error("Cannot read /proc/self/exe",0);
+ vm->fatal_error("Cannot read /proc/self/exe",0);
return NULL;
}
else
VM_C_API int inotify_init()
{
- not_implemented_error();
+ vm->not_implemented_error();
return -1;
}
VM_C_API int inotify_add_watch(int fd, const char *name, u32 mask)
{
- not_implemented_error();
+ vm->not_implemented_error();
return -1;
}
VM_C_API int inotify_rm_watch(int fd, u32 wd)
{
- not_implemented_error();
+ vm->not_implemented_error();
return -1;
}
pthread_t thread;
if (pthread_attr_init (&attr) != 0)
- fatal_error("pthread_attr_init() failed",0);
+ vm->fatal_error("pthread_attr_init() failed",0);
if (pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) != 0)
- fatal_error("pthread_attr_setdetachstate() failed",0);
+ vm->fatal_error("pthread_attr_setdetachstate() failed",0);
if (pthread_create (&thread, &attr, start_routine, NULL) != 0)
- fatal_error("pthread_create() failed",0);
+ vm->fatal_error("pthread_create() failed",0);
pthread_attr_destroy (&attr);
}
void ffi_dlclose(dll *dll)
{
if(dlclose(dll->dll))
- general_error(ERROR_FFI,F,F,NULL);
+ vm->general_error(ERROR_FFI,F,F,NULL);
dll->dll = NULL;
}
MAP_ANON | MAP_PRIVATE,-1,0);
if(array == (char*)-1)
- out_of_memory();
+ vm->out_of_memory();
if(mprotect(array,pagesize,PROT_NONE) == -1)
- fatal_error("Cannot protect low guard page",(cell)array);
+ vm->fatal_error("Cannot protect low guard page",(cell)array);
if(mprotect(array + pagesize + size,pagesize,PROT_NONE) == -1)
- fatal_error("Cannot protect high guard page",(cell)array);
+ vm->fatal_error("Cannot protect high guard page",(cell)array);
segment *retval = (segment *)vm->safe_malloc(sizeof(segment));
pagesize + block->size + pagesize);
if(retval)
- fatal_error("dealloc_segment failed",0);
+ vm->fatal_error("dealloc_segment failed",0);
free(block);
}
{
stack_frame *ptr = (stack_frame *)ucontext_stack_pointer(uap);
if(!ptr)
- critical_error("Invalid uap",(cell)uap);
+ vm->critical_error("Invalid uap",(cell)uap);
return ptr;
}
else
while(ret == -1 && errno == EINTR);
if(ret == -1)
- fatal_error("sigaction failed", 0);
+ vm->fatal_error("sigaction failed", 0);
}
void unix_init_signals()
void safe_close(int fd)
{
if(close(fd) < 0)
- fatal_error("error closing fd",errno);
+ vm->fatal_error("error closing fd",errno);
}
bool check_write(int fd, void *data, ssize_t size)
void safe_write(int fd, void *data, ssize_t size)
{
if(!check_write(fd,data,size))
- fatal_error("error writing fd",errno);
+ vm->fatal_error("error writing fd",errno);
}
bool safe_read(int fd, void *data, ssize_t size)
return safe_read(fd,data,size);
else
{
- fatal_error("error reading fd",errno);
+ vm->fatal_error("error reading fd",errno);
return false;
}
}
break;
if(buf[0] != 'X')
- fatal_error("stdin_loop: bad data on control fd",buf[0]);
+ vm->fatal_error("stdin_loop: bad data on control fd",buf[0]);
for(;;)
{
int filedes[2];
if(pipe(filedes) < 0)
- fatal_error("Error opening control pipe",errno);
+ vm->fatal_error("Error opening control pipe",errno);
control_read = filedes[0];
control_write = filedes[1];
if(pipe(filedes) < 0)
- fatal_error("Error opening size pipe",errno);
+ vm->fatal_error("Error opening size pipe",errno);
size_read = filedes[0];
size_write = filedes[1];
if(pipe(filedes) < 0)
- fatal_error("Error opening stdin pipe",errno);
+ vm->fatal_error("Error opening stdin pipe",errno);
stdin_read = filedes[0];
stdin_write = filedes[1];
if(errno == EINTR)
wait_for_stdin();
else
- fatal_error("Error writing control fd",errno);
+ vm->fatal_error("Error writing control fd",errno);
}
}
char *getenv(char *name)
{
- not_implemented_error();
+ vm->not_implemented_error();
return 0; /* unreachable */
}
PRIMITIVE(os_envs)
{
- not_implemented_error();
+ vm->not_implemented_error();
}
void c_to_factor_toplevel(cell quot)
void memory_protection_error(cell addr, stack_frame *native_stack);
void signal_error(int signal, stack_frame *native_stack);
void divide_by_zero_error();
- void fp_trap_error(stack_frame *signal_callstack_top);
+ void fp_trap_error(unsigned int fpu_status, stack_frame *signal_callstack_top);
inline void vmprim_call_clear();
inline void vmprim_unimplemented();
void memory_signal_handler_impl();
void misc_signal_handler_impl();
void fp_signal_handler_impl();
void type_error(cell type, cell tagged);
- void general_error(vm_error_type error, cell arg1, cell arg2, stack_frame *callstack_top);
+ void general_error(vm_error_type error, cell arg1, cell arg2, stack_frame *native_stack);
//callstack