void factor_vm::primitive_callback() { tagged<word> w(dpop()); w.untag_check(this); callback *stub = callbacks->add(w->code); box_alien(stub + 1); }
/* look up a symbol in a native library */ inline void factorvm::vmprim_dlsym() { gc_root<object> library(dpop(),this); gc_root<byte_array> name(dpop(),this); name.untag_check(this); symbol_char *sym = name->data<symbol_char>(); if(library.value() == F) box_alien(ffi_dlsym(NULL,sym)); else { dll *d = untag_check<dll>(library.value()); if(d->dll == NULL) dpush(F); else box_alien(ffi_dlsym(d,sym)); } }
void primitive_fopen(void) { char *mode = unbox_char_string(); REGISTER_C_STRING(mode); char *path = unbox_char_string(); UNREGISTER_C_STRING(mode); for(;;) { FILE *file = fopen(path,mode); if(file == NULL) io_error(); else { box_alien(file); break; } } }
inline void factorvm::vmprim_vm_ptr() { box_alien(this); }