summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/BLua.h72
-rw-r--r--src/BLua.cc93
2 files changed, 72 insertions, 93 deletions
diff --git a/includes/BLua.h b/includes/BLua.h
index ce49a01..bf7caae 100644
--- a/includes/BLua.h
+++ b/includes/BLua.h
@@ -139,12 +139,9 @@ class Lua {
void load(const String &, bool docall = true) throw (GeneralException);
void dumpvars(IO<Handle> out, const String & prefix, int idx = -1);
Lua thread(bool saveit = true);
- Lua thread(const String &, int nargs = 0, bool saveit = true);
- Lua thread(IO<Handle> in, int nargs = 0, bool saveit = true);
int yield(int nresults = 0) { return lua_yield(L, nresults); }
+ bool yielded() { return lua_status(L) == LUA_YIELD; }
bool resume(int nargs = 0) throw (GeneralException);
- bool resume(const String &, int nargs = 0);
- bool resume(IO<Handle> in, int nargs = 0);
void showstack(int level = M_INFO);
void showerror();
int getmetatable(int i = -1) { checkstack(); return lua_getmetatable(L, i); }
@@ -273,76 +270,25 @@ struct lua_functypes_t {
template <class T>
T * LuaObjectFactory::getMe(Lua & L, int idx) { return L.recast<T>(idx); }
+class LuaHelpersBase {
+ protected:
+ static void validate(const lua_functypes_t & entry, bool method, int n, Lua & L, const char * className);
+};
+
template <class T>
-class LuaHelpers {
+class LuaHelpers : public LuaHelpersBase {
public:
static int method_multiplex(int caller, lua_State * __L, int (*proceed)(Lua & L, int n, T * obj, int caller), int (*proceed_static)(Lua & L, int n, int caller), lua_functypes_t * tab, bool method) {
Lua L(__L);
int add = method ? 1 : 0;
int n = L.gettop() - add;
T * obj = 0;
- int i, j, mask;
- bool invalid = false, arg_valid;
+ static ClassName cn = ClassName((T *) 0);
if (method)
obj = LuaObjectFactory::getMe<T>(L);
- if ((n < tab[caller].minargs) || (n > tab[caller].maxargs)) {
- invalid = true;
- } else {
- for (i = 0; i < tab[caller].maxargs && !invalid; i++) {
- if (n >= (i + 1)) {
- arg_valid = false;
- for (j = 0; j < MAX_TYPE && !arg_valid; j++) {
- mask = 1 << j;
- if (tab[caller].argtypes[i] & mask) {
- switch(mask) {
- case BLUA_OBJECT:
- if (L.istable(i + 1 + add)) {
- L.push("__obj");
- L.gettable(i + 1 + add);
- arg_valid = L.isuserdata();
- L.pop();
- } else {
- arg_valid = L.isnil(i + 1 + add);
- }
- break;
- case BLUA_TABLE:
- arg_valid = L.istable(i + 1 + add);
- break;
- case BLUA_BOOLEAN:
- arg_valid = L.isboolean(i + 1 + add);
- break;
- case BLUA_NUMBER:
- arg_valid = L.isnumber(i + 1 + add);
- break;
- case BLUA_STRING:
- arg_valid = L.isstring(i + 1 + add);
- break;
- case BLUA_FUNCTION:
- arg_valid = L.isfunction(i + 1 + add);
- break;
- case BLUA_NIL:
- arg_valid = L.isnil(i + 1 + add);
- break;
- case BLUA_USERDATA:
- arg_valid = L.isuserdata(i + 1 + add) || L.islightuserdata(i + 1 + add);
- break;
- }
- }
- }
- invalid = !arg_valid;
- }
- }
- }
-
- if (invalid) {
- if (method) {
- L.error(String("Invalid arguments to method `") + typeid(T).name() + "::" + tab[caller].name + "'");
- } else {
- L.error(String("Invalid arguments to function `") + typeid(T).name() + " " + tab[caller].name + "'");
- }
- }
+ validate(tab[caller], method, n, L, cn.c_str());
if (method) {
return proceed(L, n, obj, caller);
diff --git a/src/BLua.cc b/src/BLua.cc
index 29b68c2..6005035 100644
--- a/src/BLua.cc
+++ b/src/BLua.cc
@@ -699,18 +699,6 @@ Balau::Lua Balau::Lua::thread(bool saveit) {
return Lua(L1);
}
-Balau::Lua Balau::Lua::thread(const String & code, int nargs, bool saveit) {
- Lua L1 = thread(saveit);
- L1.resume(code, nargs);
- return L1;
-}
-
-Balau::Lua Balau::Lua::thread(IO<Handle> h, int nargs, bool saveit) {
- Lua L1 = thread(saveit);
- L1.resume(h, nargs);
- return L1;
-}
-
bool Balau::Lua::resume(int nargs) throw (GeneralException) {
int r;
@@ -740,24 +728,6 @@ bool Balau::Lua::resume(int nargs) throw (GeneralException) {
}
}
-bool Balau::Lua::resume(IO<Handle> h, int nargs) {
- bool r;
-
- load(h, false);
- r = resume(nargs);
-
- return r;
-}
-
-bool Balau::Lua::resume(const String & s, int nargs) {
- bool r;
-
- load(s, false);
- r = resume(nargs);
-
- return r;
-}
-
void Balau::Lua::showstack(int level) {
int n = lua_gettop(L);
int i;
@@ -874,3 +844,66 @@ void Balau::LuaObjectFactory::pushDestruct(Lua & L) {
m_wantsDestruct = true;
push(L);
}
+
+void Balau::LuaHelpersBase::validate(const lua_functypes_t & entry, bool method, int n, Lua & L, const char * className) {
+ bool invalid = false, arg_valid;
+ int i, j, mask;
+ int add = method ? 1 : 0;
+
+ if ((n < entry.minargs) || (n > entry.maxargs)) {
+ invalid = true;
+ } else {
+ for (i = 0; i < entry.maxargs && !invalid; i++) {
+ if (n >= (i + 1)) {
+ arg_valid = false;
+ for (j = 0; j < MAX_TYPE && !arg_valid; j++) {
+ mask = 1 << j;
+ if (entry.argtypes[i] & mask) {
+ switch(mask) {
+ case BLUA_OBJECT:
+ if (L.istable(i + 1 + add)) {
+ L.push("__obj");
+ L.gettable(i + 1 + add);
+ arg_valid = L.isuserdata();
+ L.pop();
+ } else {
+ arg_valid = L.isnil(i + 1 + add);
+ }
+ break;
+ case BLUA_TABLE:
+ arg_valid = L.istable(i + 1 + add);
+ break;
+ case BLUA_BOOLEAN:
+ arg_valid = L.isboolean(i + 1 + add);
+ break;
+ case BLUA_NUMBER:
+ arg_valid = L.isnumber(i + 1 + add);
+ break;
+ case BLUA_STRING:
+ arg_valid = L.isstring(i + 1 + add);
+ break;
+ case BLUA_FUNCTION:
+ arg_valid = L.isfunction(i + 1 + add);
+ break;
+ case BLUA_NIL:
+ arg_valid = L.isnil(i + 1 + add);
+ break;
+ case BLUA_USERDATA:
+ arg_valid = L.isuserdata(i + 1 + add) || L.islightuserdata(i + 1 + add);
+ break;
+ }
+ }
+ }
+ invalid = !arg_valid;
+ }
+ }
+ }
+
+ if (invalid) {
+ if (method) {
+ L.error(String("Invalid arguments to method `") + className + "::" + entry.name + "'");
+ } else {
+ L.error(String("Invalid arguments to function `") + className + " " + entry.name + "'");
+ }
+ }
+}