1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#include "LuaExecutionContext.h"
#include "scripting/ade_args.h"
#include "scripting/api/objs/enums.h"
namespace scripting {
namespace api {
LuaExecutionContext::LuaExecutionContext(luacpp::LuaFunction contextFunction)
: m_contextFunction(std::move(contextFunction))
{
}
LuaExecutionContext::~LuaExecutionContext() = default;
executor::IExecutionContext::State LuaExecutionContext::determineContextState() const
{
auto L = m_contextFunction.getLuaState();
const auto returnVal = m_contextFunction.call(L);
if (returnVal.size() != 1) {
LuaError(L, "Need exactly one return value for Lua execution context function!");
return executor::IExecutionContext::State::Invalid;
}
const auto currentTop = lua_gettop(L);
returnVal[0].pushValue(L);
enum_h enumValue;
internal::Ade_get_args_lfunction = true;
internal::Ade_get_args_skip = currentTop;
if (!ade_get_args(L, "o", l_Enum.Get(&enumValue))) {
lua_settop(L, currentTop);
return executor::IExecutionContext::State::Invalid;
}
lua_settop(L, currentTop);
switch (enumValue.index) {
case LE_CONTEXT_INVALID:
return executor::IExecutionContext::State::Invalid;
case LE_CONTEXT_SUSPENDED:
return executor::IExecutionContext::State::Suspended;
case LE_CONTEXT_VALID:
return executor::IExecutionContext::State::Valid;
default:
LuaError(L, "Got invalid enum value %s from Lua context function.", enumValue.getName().c_str());
return executor::IExecutionContext::State::Invalid;
}
}
} // namespace api
} // namespace scripting
|