serious bugfix in Raise_IdxError (number got formatted as string, causing a segmentat...
[vox.git] / src / stdlib / loadlib.cpp
blobb26a4c5ef520c25456f3520de4e28d796f2d08e8
2 #include "helper.hpp"
4 #ifndef VX_NO_LOADLIB
5 #include "vxlibrary.hpp"
7 VXInteger oslib_loadlib_releasehook(VXUserPointer p, VXInteger size)
9 (void)size;
10 VXSharedLibrary* self = (VXSharedLibrary*)p;
11 delete self;
12 return 1;
15 VXInteger oslib_loadlib_constructor(VXState* v)
17 VXInteger ret = 0;
18 const char* path;
19 VXSharedLibrary* self = NULL;
20 v->GetString(2, &path, NULL);
21 try
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);
31 return ret;
34 VXInteger oslib_loadlib_resolve(VXState* v)
36 const char* symname;
37 char* errbuf;
38 VXFunction func;
39 VXSharedLibrary* self;
40 v->GetInstanceUp(1, (VXUserPointer*)&self, 0);
41 v->GetString(2, &symname, NULL);
42 try
44 func = self->resolve<VXFunction>(symname);
45 v->Push(v->NewClosure(func, 0));
46 return 1;
48 catch(VXSharedLibrary::SymbolError& err)
50 return v->ThrowError("Could not resolve symbol '%s'", symname);
52 return 0;
55 VXInteger oslib_loadlib_close(VXState* v)
57 VXSharedLibrary *self;
58 v->GetInstanceUp(1, (VXUserPointer*)&self, 0);
59 if(self == NULL)
61 return v->ThrowError("attempt to close an invalid LoadLib object");
63 self->close();
64 return 0;
67 static VXInteger oslib_loadlib_typeof(VXState* v)
69 v->PushString("os.loadlib", -1);
70 return 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"},
79 {0, 0, 0, 0}
82 void oslib_register_libload(VXState* v, VXTableObj* tb)
84 //vox_regclass(v, "loadlib", oslib_libload_funcs);
85 //vox_rawset(v, top);
86 tb->NewSlot(v->NewString("loadlib"), v->RegClass(oslib_libload_funcs));
89 #endif