static int invokeFunction(lua_State* L) { LuaAccess luaAccess(L); RawPtr<LuaInterpreter> luaInterpreter = luaAccess.getLuaInterpreter(); LuaAccess oldLuaAccess = luaInterpreter->getCurrentLuaAccess(); int oldErrorHandlerStackIndex = luaInterpreter->getErrorHandlerStackIndex(); LuaInterpreter::LuaCFunctionAccess::setCurrentLuaAccess(luaInterpreter, luaAccess); #ifdef DEBUG OwningPtr<LuaStackChecker> oldChecker = LuaStateAccess::replaceLuaStackChecker(L, LuaStackChecker::create()); #endif int numberOfResults = 0; bool wasError = false; { LuaCFunctionArguments args(luaAccess); LuaVar errorHandler(luaAccess, LuaCClosure::create<&LuaInterpreter::errorHandlerFunction>()); LuaInterpreter::LuaCFunctionAccess::setErrorHandlerStackIndex(luaInterpreter, errorHandler.getStackIndex()); try { numberOfResults = (C::getInstance()->*M)(args).numberOfResults; } catch (...) { LuaCMethodBase::handleException(luaAccess, LuaClassRegistry::ClassAttributes<C>::getLuaClassName(), LuaClassRegistry::getMethodName<C,M>()); wasError = true; } } #ifdef DEBUG LuaStateAccess::replaceLuaStackChecker(L, oldChecker); #endif LuaInterpreter::LuaCFunctionAccess::setErrorHandlerStackIndex(luaInterpreter, oldErrorHandlerStackIndex); LuaInterpreter::LuaCFunctionAccess::setCurrentLuaAccess (luaInterpreter, oldLuaAccess); if (wasError) { lua_error(L); ASSERT(false); return 0; } else { return numberOfResults; } }