43 lines
1.0 KiB
Plaintext
43 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
|
|
|
|
var module_call_func=func(fptr,args){
|
|
return __dlcall;
|
|
}
|
|
var extern={
|
|
new: func(fptr){
|
|
var isopen=1;
|
|
return {
|
|
close:func(){isopen=0;},
|
|
call:func(args...){
|
|
return (!isopen)?
|
|
nil:
|
|
module_call_func(fptr,args);
|
|
}
|
|
};
|
|
}
|
|
};
|
|
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);
|
|
}
|
|
};
|
|
}
|
|
}; |