42 lines
1.0 KiB
Plaintext
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);
|
|
}
|
|
};
|
|
}
|
|
}; |