2023-07-25 00:22:11 +08:00
|
|
|
# dylib.nas
|
|
|
|
# 2023 by ValKmjolnir
|
|
|
|
# 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
|
2023-12-06 20:10:07 +08:00
|
|
|
use std.os;
|
|
|
|
use std.io;
|
|
|
|
use std.unix;
|
2023-07-25 00:22:11 +08:00
|
|
|
|
|
|
|
# open dynamic lib. return a hash including dl pointer and function pointers
|
|
|
|
var dlopen = func(libname) {
|
|
|
|
return __dlopen(libname);
|
|
|
|
}
|
|
|
|
|
|
|
|
# close dynamic lib, this operation will make all the symbols loaded from it invalid.
|
|
|
|
var dlclose = func(lib) {
|
|
|
|
return __dlclose;
|
|
|
|
}
|
|
|
|
|
|
|
|
# call the loaded symbol, with infinite parameters:
|
|
|
|
# Caution: this may cause garbage collection process, be aware of the performance.
|
|
|
|
var dlcall = func(ptr, args...) {
|
|
|
|
return __dlcallv;
|
|
|
|
}
|
|
|
|
|
|
|
|
# get dlcall function with limited parameter list
|
|
|
|
var limitcall = func(arg_size = 0) {
|
2023-11-16 23:19:03 +08:00
|
|
|
if (arg_size==0) {return func(ptr) {return __dlcall};}
|
|
|
|
elsif (arg_size==1) {return func(ptr, _0) {return __dlcall};}
|
|
|
|
elsif (arg_size==2) {return func(ptr, _0, _1) {return __dlcall};}
|
|
|
|
elsif (arg_size==3) {return func(ptr, _0, _1, _2) {return __dlcall};}
|
|
|
|
elsif (arg_size==4) {return func(ptr, _0, _1, _2, _3) {return __dlcall};}
|
|
|
|
elsif (arg_size==5) {return func(ptr, _0, _1, _2, _3, _4) {return __dlcall};}
|
|
|
|
elsif (arg_size==6) {return func(ptr, _0, _1, _2, _3, _4, _5) {return __dlcall};}
|
|
|
|
elsif (arg_size==7) {return func(ptr, _0, _1, _2, _3, _4, _5, _6) {return __dlcall};}
|
|
|
|
elsif (arg_size==8) {return func(ptr, _0, _1, _2, _3, _4, _5, _6, _7) {return __dlcall};}
|
2023-07-25 00:22:11 +08:00
|
|
|
else {return func(ptr, args...) {return __dlcallv};}
|
|
|
|
}
|