Example #1
0
LuaAccess::Result LuaAccess::executeScript(const char* scriptBegin, long scriptLength) const
{
    ASSERT(isCorrect());

    RawPtr<LuaInterpreter> luaInterpreter = getLuaInterpreter();


    internLoadBuffer(scriptBegin, scriptLength);

    String oldPrintBuffer = LuaInterpreter::PrintBufferAccess::getPrintBuffer(luaInterpreter);
    LuaInterpreter::PrintBufferAccess::setPrintBuffer(luaInterpreter, String());

    int oldTop = lua_gettop(L);

    int error = lua_pcall(L, 0, LUA_MULTRET, luaInterpreter->getErrorHandlerStackIndex());

    String printBuffer = LuaInterpreter::PrintBufferAccess::getPrintBuffer(luaInterpreter);
    LuaInterpreter::PrintBufferAccess::setPrintBuffer(luaInterpreter, oldPrintBuffer);

    if (error) {
        LuaVar errorObject(*this, lua_gettop(L));
        throw LuaException(errorObject);
    }
    Result rslt;
    rslt.output = printBuffer;
    for (int i = oldTop, n = lua_gettop(L); i <= n; ++i) {
        rslt.objects.appendObjectWithStackIndex(*this, i);
    }

    return rslt;
}
    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;
        }
    }