add module.nas to safely use dylib

This commit is contained in:
ValKmjolnir 2022-03-05 21:52:29 +08:00
parent a0b341deb5
commit ca9b8581b4
6 changed files with 62 additions and 2 deletions

View File

@ -284,6 +284,7 @@ var unix=
};
# dylib is the core hashmap for developers to load their own library.
# for safe using dynamic library, you could use 'module' in stl/module.nas
var dylib=
{
# open dynamic lib.

View File

@ -8,6 +8,8 @@ double fibonaci(double x){
}
extern "C" nasal_ref fib(std::vector<nasal_ref>& args,nasal_gc& gc){
std::cout<<"[mod] this is the first test module of nasal\n";
if(!args.size())
return builtin_err("fib","lack arguments");
nasal_ref num=args[0];
if(num.type!=vm_num)
return builtin_err("extern_fib","\"num\" must be number");
@ -15,6 +17,8 @@ extern "C" nasal_ref fib(std::vector<nasal_ref>& args,nasal_gc& gc){
}
extern "C" nasal_ref quick_fib(std::vector<nasal_ref>& args,nasal_gc& gc){
std::cout<<"[mod] this is the first test module of nasal\n";
if(!args.size())
return builtin_err("fib","lack arguments");
nasal_ref num=args[0];
if(num.type!=vm_num)
return builtin_err("extern_quick_fib","\"num\" must be number");

View File

@ -5,6 +5,7 @@
#include <crt_externs.h>
#define environ (*_NSGetEnviron())
#endif
/*
builtin functions must be called inside a function like this:
var print=func(elems...){

View File

@ -137,8 +137,16 @@ struct nasal_obj
{
uint32_t type;
void* ptr;
nasal_obj():ptr(nullptr){}
void clear(){ptr=nullptr;}
void* destructor;
nasal_obj():ptr(nullptr),destructor(nullptr){}
~nasal_obj(){clear();}
void clear()
{
typedef void (*func)(void*);
if(destructor)
(func(destructor))(ptr);
ptr=nullptr;
}
};
const uint8_t GC_UNCOLLECTED=0;

View File

@ -284,6 +284,7 @@ var unix=
};
# dylib is the core hashmap for developers to load their own library.
# for safe using dynamic library, you could use 'module' in stl/module.nas
var dylib=
{
# open dynamic lib.

45
stl/module.nas Normal file
View File

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