131 lines
3.4 KiB
C++
131 lines
3.4 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// This source file is part of the LuaPlus source distribution and is Copyright
|
|
// 2001-2011 by Joshua C. Jensen (jjensen@workspacewhiz.com).
|
|
//
|
|
// The latest version may be obtained from http://luaplus.org/.
|
|
//
|
|
// The code presented in this file may be used in any environment it is
|
|
// acceptable to use Lua.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
#ifndef LUAPLUS__LUACALL_INL
|
|
#define LUAPLUS__LUACALL_INL
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// namespace LuaPlus
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
namespace LuaPlus
|
|
{
|
|
|
|
LUAPLUS_INLINE LuaCall::LuaCall(LuaObject& functionObj)
|
|
: L(functionObj.GetCState())
|
|
, numArgs(0) {
|
|
luaplus_assert(functionObj.IsFunction());
|
|
startResults = lua_gettop(L) + 1;
|
|
functionObj.Push(L);
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, const LuaArgNil& /*value*/) {
|
|
lua_pushnil(call.L);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, float value) {
|
|
lua_pushnumber(call.L, value);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, double value) {
|
|
lua_pushnumber(call.L, (lua_Number)value);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, int value) {
|
|
lua_pushinteger(call.L, value);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, unsigned int value) {
|
|
lua_pushinteger(call.L, value);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, const char* value) {
|
|
lua_pushstring(call.L, value);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, lua_CFunction value) {
|
|
lua_pushcclosure(call.L, value, 0);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, int (*value)(LuaState*)) {
|
|
LuaState* state = lua_State_to_LuaState(call.L);
|
|
state->PushCClosure(value, 0);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, bool value) {
|
|
lua_pushboolean(call.L, value);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, void* value) {
|
|
lua_pushlightuserdata(call.L, value);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, LuaStackObject& value) {
|
|
luaplus_assert(call.L == value.GetCState());
|
|
value.Push();
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& operator<<(LuaCall& call, LuaObject& value) {
|
|
luaplus_assert(call.L == value.GetCState());
|
|
value.Push(call.L);
|
|
++call.numArgs;
|
|
return call;
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaStackObject LuaCall::operator<<(const LuaRun& run) {
|
|
LuaState* state = lua_State_to_LuaState(L);
|
|
int resultsStackPos = lua_gettop(L) - numArgs;
|
|
int err = lua_pcall(L, numArgs, run.numResults, run.alertStackPos);
|
|
if (err != 0) {
|
|
if (lua_isstring(L, -1)) {
|
|
const char *errStr = lua_tostring(L, -1);
|
|
// Does this string persist long enough?
|
|
luaplus_throw(errStr);
|
|
} else {
|
|
char buf[200];
|
|
sprintf(buf, "unknown lua error, code: %d", err);
|
|
luaplus_throw(buf);
|
|
}
|
|
}
|
|
return LuaStackObject(L, resultsStackPos);
|
|
}
|
|
|
|
LUAPLUS_INLINE LuaCall& LuaCall::operator=(const LuaCall& src) {
|
|
L = src.L;
|
|
numArgs = src.numArgs;
|
|
startResults = src.startResults;
|
|
|
|
return *this;
|
|
}
|
|
|
|
} // namespace LuaPlus
|
|
|
|
#endif // LUAPLUS__LUACALL_INL
|