5 #include "vxlibrary.hpp"
7 VXInteger
oslib_loadlib_releasehook(VXUserPointer p
, VXInteger size
)
10 VXSharedLibrary
* self
= (VXSharedLibrary
*)p
;
15 VXInteger
oslib_loadlib_constructor(VXState
* v
)
19 VXSharedLibrary
* self
= NULL
;
20 v
->GetString(2, &path
, NULL
);
23 self
= new VXSharedLibrary(path
);
25 catch(VXSharedLibrary::LoadError
& err
)
27 ret
= v
->ThrowError(err
.what());
29 v
->SetInstanceUp(1, (VXUserPointer
*)&self
);
30 v
->SetReleaseHook(1, oslib_loadlib_releasehook
);
34 VXInteger
oslib_loadlib_resolve(VXState
* v
)
39 VXSharedLibrary
* self
;
40 v
->GetInstanceUp(1, (VXUserPointer
*)&self
, 0);
41 v
->GetString(2, &symname
, NULL
);
44 func
= self
->resolve
<VXFunction
>(symname
);
45 v
->Push(v
->NewClosure(func
, 0));
48 catch(VXSharedLibrary::SymbolError
& err
)
50 return v
->ThrowError("Could not resolve symbol '%s'", symname
);
55 VXInteger
oslib_loadlib_close(VXState
* v
)
57 VXSharedLibrary
*self
;
58 v
->GetInstanceUp(1, (VXUserPointer
*)&self
, 0);
61 return v
->ThrowError("attempt to close an invalid LoadLib object");
67 static VXInteger
oslib_loadlib_typeof(VXState
* v
)
69 v
->PushString("os.loadlib", -1);
73 static VXRegFunction oslib_libload_funcs
[]=
75 {"constructor", oslib_loadlib_constructor
, 2, ".s"},
76 {"resolve", oslib_loadlib_resolve
, 2, ".s"},
77 {"close", oslib_loadlib_close
, 1, NULL
},
78 {"_typeof", oslib_loadlib_typeof
, 1, "x"},
82 void oslib_register_libload(VXState
* v
, VXTableObj
* tb
)
84 //vox_regclass(v, "loadlib", oslib_libload_funcs);
86 tb
->NewSlot(v
->NewString("loadlib"), v
->RegClass(oslib_libload_funcs
));