[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: lua_close crashing application
- From: Milind Gupta <milind.gupta@...>
- Date: Sun, 6 Apr 2014 09:12:21 -0700
Here is a sample code that causes a crash. I am using Lua 5.2.3.
The crash goes away if I do any one of the 2:
1. Comment out lines 106,107,108 the ones with the string concatenation
2. I change the lua script that I load from the one currently run to the one just above it (where it just has a print)
Any help would be really appreciated
#if defined __WIN32__ || defined WIN32
# include <windows.h>
# define _EXPORT __declspec(dllexport)
#else
# define _EXPORT
#endif
#include <stdio.h>
#include <string.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
struct scripts
{
lua_State *L;
lua_State *T;
};
struct scripts list[4];
static int loadScript(lua_State *L)
{
short i=0, flag, numSteps;
const char *code,*iniCode, *err, *msg;
char fullerr[80];
list[i].L = luaL_newstate();
if (NULL == list[i].L)
{
lua_pushnil(L);
lua_pushstring(L,"Cannot initialize Lua State");
return 2; // 2 results pushed on the stack
}
luaL_openlibs(list[i].L);
static const struct luaL_Reg TFuncs[] = {
{NULL,NULL}
};
luaL_newlib(list[i].L, TFuncs);
lua_setglobal(list[i].L,"__ls_");
lua_getglobal(list[i].L,"__ls_");
lua_setfield(list[i].L,LUA_REGISTRYINDEX,"__ls_");
list[i].T = lua_newthread(list[i].L);
msg = "do"
" x=23"
"end"
"print(x)";
msg = "do"
" local coresume = coroutine.resume"
" local coyield = coroutine.yield"
" local lstep = __ls_"
" local function modresume(...)"
" coresume(cor)"
" end"
" local function modyield(...)"
" coyield()"
" end"
" coroutine.resume = modresume"
" coroutine.yield = modyield"
" __ls_ = nil"
"end";
switch(luaL_loadstring(list[i].T,msg))
{
case LUA_OK:
// No error so run the string
switch(lua_pcall(list[i].T,0,0,0))
{
case LUA_OK:
// Successfully executed
break;
case LUA_ERRRUN:
// Run time error
case LUA_ERRMEM:
// Memory Allocation error
case LUA_ERRGCMM:
// Error Running Garbage collector
// Pop the error message
msg = lua_tostring(list[i].T,-1);
printf("Error: %s",msg);
lua_close( list[i].L );
list[i].L = NULL;
list[i].T = NULL;
break;
} // switch(lua_pcall(L,0,0,0)) ends here
break;
case LUA_ERRSYNTAX:
// Syntax error, remove the task and clear the slot
case LUA_ERRMEM:
// Memory allocation error
case LUA_ERRGCMM:
// Error Running Garbage collector
// Pop the error message
err = lua_tostring(list[i].T,-1);
printf("Error message: %s",err);
msg = "Error loading code:";
strcpy(fullerr,msg);
strcat(fullerr,err);
printf("fullerr: %s",fullerr);
lua_close( list[i].L );
printf("L closed");
list[i].L = NULL;
list[i].T = NULL;
break;
} // switch(luaL_loadstring(list[i].T,msg)) ends here
return 0;
}
int _EXPORT luaopen_test(lua_State *L)
{
static const struct luaL_Reg funcs[] = {
{"loadScript",loadScript},
{NULL,NULL}
};
luaL_newlib(L, funcs); // Just returns the module as a table
return 1;
} // function luaopen_luaStepper ends here