58 lines
886 B
C
58 lines
886 B
C
#include "factor.h"
|
|
|
|
void primitive_dlopen(void)
|
|
{
|
|
DLL* dll;
|
|
F_STRING* path;
|
|
|
|
maybe_garbage_collection();
|
|
|
|
path = untag_string(dpop());
|
|
dll = allot_object(DLL_TYPE,sizeof(DLL));
|
|
dll->path = tag_object(path);
|
|
ffi_dlopen(dll);
|
|
|
|
dpush(tag_object(dll));
|
|
}
|
|
|
|
void primitive_dlsym(void)
|
|
{
|
|
CELL dll;
|
|
F_STRING* sym;
|
|
|
|
maybe_garbage_collection();
|
|
|
|
dll = dpop();
|
|
sym = untag_string(dpop());
|
|
|
|
dpush(tag_cell((CELL)ffi_dlsym(
|
|
dll == F ? NULL : untag_dll(dll),
|
|
sym)));
|
|
}
|
|
|
|
void primitive_dlclose(void)
|
|
{
|
|
maybe_garbage_collection();
|
|
ffi_dlclose(untag_dll(dpop()));
|
|
}
|
|
|
|
DLL* untag_dll(CELL tagged)
|
|
{
|
|
DLL* dll = (DLL*)UNTAG(tagged);
|
|
type_check(DLL_TYPE,tagged);
|
|
if(dll->dll == NULL)
|
|
general_error(ERROR_EXPIRED,tagged);
|
|
return (DLL*)UNTAG(tagged);
|
|
}
|
|
|
|
void fixup_dll(DLL* dll)
|
|
{
|
|
data_fixup(&dll->path);
|
|
ffi_dlopen(dll);
|
|
}
|
|
|
|
void collect_dll(DLL* dll)
|
|
{
|
|
COPY_OBJECT(dll->path);
|
|
}
|