Merge pull request #132 from mniip/lua2

Some lua fixes
This commit is contained in:
jacob1 2013-05-03 12:09:35 -07:00
commit e95e8e26bf
3 changed files with 76 additions and 30 deletions

View File

@ -664,12 +664,32 @@ void luacon_hook(lua_State * l, lua_Debug * ar)
}
}
char *luacon_geterror(){
char *error = (char*)lua_tostring(luacon_ci->l, -1);
if(error==NULL || !error[0]){
error = "failed to execute";
int luaL_tostring (lua_State *L, int n) {
luaL_checkany(L, n);
switch (lua_type(L, n)) {
case LUA_TNUMBER:
lua_pushstring(L, lua_tostring(L, n));
break;
case LUA_TSTRING:
lua_pushvalue(L, n);
break;
case LUA_TBOOLEAN:
lua_pushstring(L, (lua_toboolean(L, n) ? "true" : "false"));
break;
case LUA_TNIL:
lua_pushliteral(L, "nil");
break;
default:
lua_pushfstring(L, "%s: %p", luaL_typename(L, n), lua_topointer(L, n));
break;
}
return error;
return 1;
}
char *luacon_geterror(){
luaL_tostring(luacon_ci->l, -1);
char* err = (char*)luaL_optstring(luacon_ci->l, -1, "failed to execute");
lua_pop(luacon_ci->l, 1);
return err;
}
/*void luacon_close(){
lua_close(l);
@ -923,27 +943,6 @@ int luatpt_setconsole(lua_State* l)
luacon_controller->HideConsole();
return 0;
}
static int luaL_tostring (lua_State *L, int n) {
luaL_checkany(L, n);
switch (lua_type(L, n)) {
case LUA_TNUMBER:
lua_pushstring(L, lua_tostring(L, n));
break;
case LUA_TSTRING:
lua_pushvalue(L, n);
break;
case LUA_TBOOLEAN:
lua_pushstring(L, (lua_toboolean(L, n) ? "true" : "false"));
break;
case LUA_TNIL:
lua_pushliteral(L, "nil");
break;
default:
lua_pushfstring(L, "%s: %p", luaL_typename(L, n), lua_topointer(L, n));
break;
}
return 1;
}
int luatpt_log(lua_State* l)
{
int args = lua_gettop(l);
@ -958,7 +957,11 @@ int luatpt_log(lua_State* l)
lua_pop(l, 2);
}
if((*luacon_currentCommand))
(*luacon_lastError) = text;
{
if(luacon_lastError->length())
*luacon_lastError += "; ";
*luacon_lastError += text;
}
else
luacon_ci->Log(CommandInterface::LogNotice, text.c_str());
return 0;

View File

@ -9,6 +9,7 @@ extern Graphics * luacon_g;
extern Renderer * luacon_ren;
extern bool *luacon_currentCommand;
extern int luaL_tostring(lua_State* l, int n);
extern std::string *luacon_lastError;
extern int *lua_el_func, *lua_el_mode, *lua_gr_func;

View File

@ -57,6 +57,7 @@ Renderer * luacon_ren;
bool *luacon_currentCommand;
std::string *luacon_lastError;
std::string lastCode;
int *lua_el_func, *lua_el_mode, *lua_gr_func;
@ -178,6 +179,8 @@ LuaScriptInterface::LuaScriptInterface(GameController * c, GameModel * m):
luacon_currentCommand = &currentCommand;
luacon_lastError = &lastError;
lastCode = "";
//Replace print function with our screen logging thingy
lua_pushcfunction(l, luatpt_log);
lua_setglobal(l, "print");
@ -2119,14 +2122,53 @@ int LuaScriptInterface::Command(std::string command)
}
else
{
int ret;
int level = lua_gettop(l), ret;
std::string text = "";
lastError = "";
currentCommand = true;
if(lastCode.length())
lastCode += "\n";
lastCode += command;
std::string tmp = "return " + lastCode;
ui::Engine::Ref().LastTick(clock());
if((ret = luaL_dostring(l, command.c_str())))
luaL_loadbuffer(l, tmp.c_str(), tmp.length(), "@console");
if(lua_type(l, -1) != LUA_TFUNCTION)
{
lua_pop(l, 1);
luaL_loadbuffer(l, lastCode.c_str(), lastCode.length(), "@console");
}
if(lua_type(l, -1) != LUA_TFUNCTION)
{
lastError = luacon_geterror();
//Log(LogError, lastError);
if(std::string(lastError).find("near '<eof>'")!=-1) //the idea stolen from lua-5.1.5/lua.c
lastError = ">";
else
lastCode = "";
}
else
{
lastCode = "";
ret = lua_pcall(l, 0, LUA_MULTRET, 0);
if(ret)
lastError = luacon_geterror();
else
{
for(level++;level<=lua_gettop(l);level++)
{
luaL_tostring(l, level);
if(text.length())
text += ", " + std::string(luaL_optstring(l, -1, ""));
else
text = std::string(luaL_optstring(l, -1, ""));
lua_pop(l, 1);
}
if(text.length())
if(lastError.length())
lastError += "; " + text;
else
lastError = text;
}
}
currentCommand = false;
return ret;