diff options
Diffstat (limited to '')
-rw-r--r-- | source/LuaState.cpp | 33 | ||||
-rw-r--r-- | source/LuaState.h | 5 | ||||
-rw-r--r-- | source/ManualBindings.cpp | 7 |
3 files changed, 41 insertions, 4 deletions
diff --git a/source/LuaState.cpp b/source/LuaState.cpp index 8d2fa8eca..ba60ed67d 100644 --- a/source/LuaState.cpp +++ b/source/LuaState.cpp @@ -739,6 +739,39 @@ bool cLuaState::CallFunction(int a_NumResults) +bool cLuaState::CheckParamUserTable(int a_StartParam, const char * a_UserTable, int a_EndParam) +{ + ASSERT(IsValid()); + + if (a_EndParam < 0) + { + a_EndParam = a_StartParam; + } + + tolua_Error tolua_err; + for (int i = a_StartParam; i <= a_EndParam; i++) + { + if (tolua_isusertable(m_LuaState, i, a_UserTable, 0, &tolua_err)) + { + continue; + } + // Not the correct parameter + lua_Debug entry; + VERIFY(lua_getstack(m_LuaState, 0, &entry)); + VERIFY(lua_getinfo (m_LuaState, "n", &entry)); + AString ErrMsg = Printf("#ferror in function '%s'.", (entry.name != NULL) ? entry.name : "?"); + tolua_error(m_LuaState, ErrMsg.c_str(), &tolua_err); + return false; + } // for i - Param + + // All params checked ok + return true; +} + + + + + bool cLuaState::CheckParamUserType(int a_StartParam, const char * a_UserType, int a_EndParam) { ASSERT(IsValid()); diff --git a/source/LuaState.h b/source/LuaState.h index caba2484d..8586a251b 100644 --- a/source/LuaState.h +++ b/source/LuaState.h @@ -764,7 +764,10 @@ public: */ bool CallFunction(int a_NumReturnValues); - /// Returns true if the specified parameters on the stack are of the specified usertype; also logs warning if not + /// Returns true if the specified parameters on the stack are of the specified usertable type; also logs warning if not. Used for static functions + bool CheckParamUserTable(int a_StartParam, const char * a_UserTable, int a_EndParam = -1); + + /// Returns true if the specified parameters on the stack are of the specified usertype; also logs warning if not. Used for regular functions bool CheckParamUserType(int a_StartParam, const char * a_UserType, int a_EndParam = -1); /// Returns true if the specified parameters on the stack are a table; also logs warning if not diff --git a/source/ManualBindings.cpp b/source/ManualBindings.cpp index 418819910..f3325f25c 100644 --- a/source/ManualBindings.cpp +++ b/source/ManualBindings.cpp @@ -2067,15 +2067,16 @@ static int tolua_cRoot_GetFurnaceRecipe(lua_State * tolua_S) { cLuaState L(tolua_S); if ( - !L.CheckParamUserType(1, "const cItem") || - !L.CheckParamEnd (2) + !L.CheckParamUserTable(1, "cRoot") || + !L.CheckParamUserType (2, "const cItem") || + !L.CheckParamEnd (3) ) { return 0; } // Check the input param: - cItem * Input = (cItem *)tolua_tousertype(L, 1, NULL); + cItem * Input = (cItem *)tolua_tousertype(L, 2, NULL); if (Input == NULL) { LOGWARNING("cRoot:GetFurnaceRecipe: the Input parameter is nil or missing."); |