Nasal-Interpreter/std/module.nas

42 lines
1.0 KiB
Plaintext

# module.nas
# ValKmjolnir 2022/3/5
# this provides safe usage of dylib
# when dylib is closed,
# all the invalid functions cannot be called
use std.dylib;
var module_call_func = func(fptr, args) {
return __dlcallv;
}
var extern = {
new: func(fptr) {
var isopen = 1;
return {
close: func() {isopen = 0;},
call: func(args...) {
return isopen?module_call_func(fptr,args):nil;
}
};
}
};
var module = {
new: func(name) {
var lib = dylib.dlopen(name);
var f = {};
return {
get: func(symbol) {
if (contains(f,symbol))
return f[symbol];
var fp = extern.new(dylib.dlsym(lib,symbol));
f[symbol] = fp;
return fp;
},
close: func() {
foreach(var i; keys(f))
f[i].close();
dylib.dlclose(lib);
}
};
}
};