[Change] Updated Lua API.
This commit is contained in:
parent
8ef7082c84
commit
2823f4df89
7
lib/lua/LICENSE
Normal file
7
lib/lua/LICENSE
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
Copyright © 1994-2007 Lua.org, PUC-Rio.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lapi.c,v 2.55 2006/06/07 12:37:17 roberto Exp $
|
** $Id: lapi.c,v 2.55.1.5 2008/07/04 18:41:18 roberto Exp $
|
||||||
** Lua API
|
** Lua API
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -93,15 +93,14 @@ void luaA_pushobject (lua_State *L, const TValue *o) {
|
|||||||
|
|
||||||
|
|
||||||
LUA_API int lua_checkstack (lua_State *L, int size) {
|
LUA_API int lua_checkstack (lua_State *L, int size) {
|
||||||
int res;
|
int res = 1;
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
if ((L->top - L->base + size) > LUAI_MAXCSTACK)
|
if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK)
|
||||||
res = 0; /* stack overflow */
|
res = 0; /* stack overflow */
|
||||||
else {
|
else if (size > 0) {
|
||||||
luaD_checkstack(L, size);
|
luaD_checkstack(L, size);
|
||||||
if (L->ci->top < L->top + size)
|
if (L->ci->top < L->top + size)
|
||||||
L->ci->top = L->top + size;
|
L->ci->top = L->top + size;
|
||||||
res = 1;
|
|
||||||
}
|
}
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
return res;
|
return res;
|
||||||
@ -123,6 +122,11 @@ LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LUA_API void lua_setlevel (lua_State *from, lua_State *to) {
|
||||||
|
to->nCcalls = from->nCcalls;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
|
LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
|
||||||
lua_CFunction old;
|
lua_CFunction old;
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
@ -749,7 +753,7 @@ LUA_API int lua_setfenv (lua_State *L, int idx) {
|
|||||||
res = 0;
|
res = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));
|
if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));
|
||||||
L->top--;
|
L->top--;
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
return res;
|
return res;
|
||||||
@ -925,10 +929,13 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
|
|||||||
g->GCthreshold = g->totalbytes - a;
|
g->GCthreshold = g->totalbytes - a;
|
||||||
else
|
else
|
||||||
g->GCthreshold = 0;
|
g->GCthreshold = 0;
|
||||||
while (g->GCthreshold <= g->totalbytes)
|
while (g->GCthreshold <= g->totalbytes) {
|
||||||
luaC_step(L);
|
luaC_step(L);
|
||||||
if (g->gcstate == GCSpause) /* end of cycle? */
|
if (g->gcstate == GCSpause) { /* end of cycle? */
|
||||||
res = 1; /* signal it */
|
res = 1; /* signal it */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LUA_GCSETPAUSE: {
|
case LUA_GCSETPAUSE: {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lapi.h,v 2.2 2005/04/25 19:24:10 roberto Exp $
|
** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Auxiliary functions from Lua API
|
** Auxiliary functions from Lua API
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lauxlib.c,v 1.159 2006/03/21 19:31:09 roberto Exp $
|
** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $
|
||||||
** Auxiliary functions for building Lua libraries
|
** Auxiliary functions for building Lua libraries
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -244,7 +244,7 @@ LUALIB_API void luaI_openlib (lua_State *L, const char *libname,
|
|||||||
if (libname) {
|
if (libname) {
|
||||||
int size = libsize(l);
|
int size = libsize(l);
|
||||||
/* check whether lib already exists */
|
/* check whether lib already exists */
|
||||||
luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", size);
|
luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1);
|
||||||
lua_getfield(L, -1, libname); /* get _LOADED[libname] */
|
lua_getfield(L, -1, libname); /* get _LOADED[libname] */
|
||||||
if (!lua_istable(L, -1)) { /* not found? */
|
if (!lua_istable(L, -1)) { /* not found? */
|
||||||
lua_pop(L, 1); /* remove previous result */
|
lua_pop(L, 1); /* remove previous result */
|
||||||
@ -535,7 +535,7 @@ static const char *getF (lua_State *L, void *ud, size_t *size) {
|
|||||||
return "\n";
|
return "\n";
|
||||||
}
|
}
|
||||||
if (feof(lf->f)) return NULL;
|
if (feof(lf->f)) return NULL;
|
||||||
*size = fread(lf->buff, 1, LUAL_BUFFERSIZE, lf->f);
|
*size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);
|
||||||
return (*size > 0) ? lf->buff : NULL;
|
return (*size > 0) ? lf->buff : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -570,9 +570,8 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
|
|||||||
while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */
|
while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */
|
||||||
if (c == '\n') c = getc(lf.f);
|
if (c == '\n') c = getc(lf.f);
|
||||||
}
|
}
|
||||||
if (c == LUA_SIGNATURE[0] && lf.f != stdin) { /* binary file? */
|
if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */
|
||||||
fclose(lf.f);
|
lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */
|
||||||
lf.f = fopen(filename, "rb"); /* reopen in binary mode */
|
|
||||||
if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
|
if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
|
||||||
/* skip eventual `#!...' */
|
/* skip eventual `#!...' */
|
||||||
while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;
|
while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;
|
||||||
@ -581,7 +580,7 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
|
|||||||
ungetc(c, lf.f);
|
ungetc(c, lf.f);
|
||||||
status = lua_load(L, getF, &lf, lua_tostring(L, -1));
|
status = lua_load(L, getF, &lf, lua_tostring(L, -1));
|
||||||
readstatus = ferror(lf.f);
|
readstatus = ferror(lf.f);
|
||||||
if (lf.f != stdin) fclose(lf.f); /* close file (even in case of errors) */
|
if (filename) fclose(lf.f); /* close file (even in case of errors) */
|
||||||
if (readstatus) {
|
if (readstatus) {
|
||||||
lua_settop(L, fnameindex); /* ignore results from `lua_load' */
|
lua_settop(L, fnameindex); /* ignore results from `lua_load' */
|
||||||
return errfile(L, "read", fnameindex);
|
return errfile(L, "read", fnameindex);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lauxlib.h,v 1.88 2006/04/12 20:31:15 roberto Exp $
|
** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Auxiliary functions for building Lua libraries
|
** Auxiliary functions for building Lua libraries
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lbaselib.c,v 1.191a 2006/06/02 15:34:00 roberto Exp $
|
** $Id: lbaselib.c,v 1.191.1.6 2008/02/14 16:46:22 roberto Exp $
|
||||||
** Basic library
|
** Basic library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -344,10 +344,12 @@ static int luaB_unpack (lua_State *L) {
|
|||||||
luaL_checktype(L, 1, LUA_TTABLE);
|
luaL_checktype(L, 1, LUA_TTABLE);
|
||||||
i = luaL_optint(L, 2, 1);
|
i = luaL_optint(L, 2, 1);
|
||||||
e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1));
|
e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1));
|
||||||
|
if (i > e) return 0; /* empty range */
|
||||||
n = e - i + 1; /* number of elements */
|
n = e - i + 1; /* number of elements */
|
||||||
if (n <= 0) return 0; /* empty range */
|
if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */
|
||||||
luaL_checkstack(L, n, "table too big to unpack");
|
return luaL_error(L, "too many results to unpack");
|
||||||
for (; i<=e; i++) /* push arg[i...e] */
|
lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */
|
||||||
|
while (i++ < e) /* push arg[i + 1...e] */
|
||||||
lua_rawgeti(L, 1, i);
|
lua_rawgeti(L, 1, i);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
@ -477,19 +479,56 @@ static const luaL_Reg base_funcs[] = {
|
|||||||
** =======================================================
|
** =======================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define CO_RUN 0 /* running */
|
||||||
|
#define CO_SUS 1 /* suspended */
|
||||||
|
#define CO_NOR 2 /* 'normal' (it resumed another coroutine) */
|
||||||
|
#define CO_DEAD 3
|
||||||
|
|
||||||
|
static const char *const statnames[] =
|
||||||
|
{"running", "suspended", "normal", "dead"};
|
||||||
|
|
||||||
|
static int costatus (lua_State *L, lua_State *co) {
|
||||||
|
if (L == co) return CO_RUN;
|
||||||
|
switch (lua_status(co)) {
|
||||||
|
case LUA_YIELD:
|
||||||
|
return CO_SUS;
|
||||||
|
case 0: {
|
||||||
|
lua_Debug ar;
|
||||||
|
if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */
|
||||||
|
return CO_NOR; /* it is running */
|
||||||
|
else if (lua_gettop(co) == 0)
|
||||||
|
return CO_DEAD;
|
||||||
|
else
|
||||||
|
return CO_SUS; /* initial state */
|
||||||
|
}
|
||||||
|
default: /* some error occured */
|
||||||
|
return CO_DEAD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int luaB_costatus (lua_State *L) {
|
||||||
|
lua_State *co = lua_tothread(L, 1);
|
||||||
|
luaL_argcheck(L, co, 1, "coroutine expected");
|
||||||
|
lua_pushstring(L, statnames[costatus(L, co)]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int auxresume (lua_State *L, lua_State *co, int narg) {
|
static int auxresume (lua_State *L, lua_State *co, int narg) {
|
||||||
int status;
|
int status = costatus(L, co);
|
||||||
if (!lua_checkstack(co, narg))
|
if (!lua_checkstack(co, narg))
|
||||||
luaL_error(L, "too many arguments to resume");
|
luaL_error(L, "too many arguments to resume");
|
||||||
if (lua_status(co) == 0 && lua_gettop(co) == 0) {
|
if (status != CO_SUS) {
|
||||||
lua_pushliteral(L, "cannot resume dead coroutine");
|
lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]);
|
||||||
return -1; /* error flag */
|
return -1; /* error flag */
|
||||||
}
|
}
|
||||||
lua_xmove(L, co, narg);
|
lua_xmove(L, co, narg);
|
||||||
|
lua_setlevel(L, co);
|
||||||
status = lua_resume(co, narg);
|
status = lua_resume(co, narg);
|
||||||
if (status == 0 || status == LUA_YIELD) {
|
if (status == 0 || status == LUA_YIELD) {
|
||||||
int nres = lua_gettop(co);
|
int nres = lua_gettop(co);
|
||||||
if (!lua_checkstack(L, nres))
|
if (!lua_checkstack(L, nres + 1))
|
||||||
luaL_error(L, "too many results to resume");
|
luaL_error(L, "too many results to resume");
|
||||||
lua_xmove(co, L, nres); /* move yielded values */
|
lua_xmove(co, L, nres); /* move yielded values */
|
||||||
return nres;
|
return nres;
|
||||||
@ -556,39 +595,10 @@ static int luaB_yield (lua_State *L) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int luaB_costatus (lua_State *L) {
|
|
||||||
lua_State *co = lua_tothread(L, 1);
|
|
||||||
luaL_argcheck(L, co, 1, "coroutine expected");
|
|
||||||
if (L == co) lua_pushliteral(L, "running");
|
|
||||||
else {
|
|
||||||
switch (lua_status(co)) {
|
|
||||||
case LUA_YIELD:
|
|
||||||
lua_pushliteral(L, "suspended");
|
|
||||||
break;
|
|
||||||
case 0: {
|
|
||||||
lua_Debug ar;
|
|
||||||
if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */
|
|
||||||
lua_pushliteral(L, "normal"); /* it is running */
|
|
||||||
else if (lua_gettop(co) == 0)
|
|
||||||
lua_pushliteral(L, "dead");
|
|
||||||
else
|
|
||||||
lua_pushliteral(L, "suspended"); /* initial state */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: /* some error occured */
|
|
||||||
lua_pushliteral(L, "dead");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int luaB_corunning (lua_State *L) {
|
static int luaB_corunning (lua_State *L) {
|
||||||
if (lua_pushthread(L))
|
if (lua_pushthread(L))
|
||||||
return 0; /* main thread is not a coroutine */
|
lua_pushnil(L); /* main thread is not a coroutine */
|
||||||
else
|
return 1;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lcode.c,v 2.25a 2006/03/21 19:28:49 roberto Exp $
|
** $Id: lcode.c,v 2.25.1.3 2007/12/28 15:32:23 roberto Exp $
|
||||||
** Code generator for Lua
|
** Code generator for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -699,7 +699,7 @@ void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {
|
|||||||
e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0;
|
e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0;
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case OPR_MINUS: {
|
case OPR_MINUS: {
|
||||||
if (e->k == VK)
|
if (!isnumeral(e))
|
||||||
luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */
|
luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */
|
||||||
codearith(fs, OP_UNM, e, &e2);
|
codearith(fs, OP_UNM, e, &e2);
|
||||||
break;
|
break;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lcode.h,v 1.48 2006/03/21 19:28:03 roberto Exp $
|
** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Code generator for Lua
|
** Code generator for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldblib.c,v 1.104 2005/12/29 15:32:11 roberto Exp $
|
** $Id: ldblib.c,v 1.104.1.3 2008/01/21 13:11:21 roberto Exp $
|
||||||
** Interface from Lua to its debug API
|
** Interface from Lua to its debug API
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -255,24 +255,25 @@ static void gethooktable (lua_State *L) {
|
|||||||
|
|
||||||
|
|
||||||
static int db_sethook (lua_State *L) {
|
static int db_sethook (lua_State *L) {
|
||||||
int arg;
|
int arg, mask, count;
|
||||||
|
lua_Hook func;
|
||||||
lua_State *L1 = getthread(L, &arg);
|
lua_State *L1 = getthread(L, &arg);
|
||||||
if (lua_isnoneornil(L, arg+1)) {
|
if (lua_isnoneornil(L, arg+1)) {
|
||||||
lua_settop(L, arg+1);
|
lua_settop(L, arg+1);
|
||||||
lua_sethook(L1, NULL, 0, 0); /* turn off hooks */
|
func = NULL; mask = 0; count = 0; /* turn off hooks */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const char *smask = luaL_checkstring(L, arg+2);
|
const char *smask = luaL_checkstring(L, arg+2);
|
||||||
int count = luaL_optint(L, arg+3, 0);
|
|
||||||
luaL_checktype(L, arg+1, LUA_TFUNCTION);
|
luaL_checktype(L, arg+1, LUA_TFUNCTION);
|
||||||
lua_sethook(L1, hookf, makemask(smask, count), count);
|
count = luaL_optint(L, arg+3, 0);
|
||||||
|
func = hookf; mask = makemask(smask, count);
|
||||||
}
|
}
|
||||||
gethooktable(L1);
|
gethooktable(L);
|
||||||
lua_pushlightuserdata(L1, L1);
|
lua_pushlightuserdata(L, L1);
|
||||||
lua_pushvalue(L, arg+1);
|
lua_pushvalue(L, arg+1);
|
||||||
lua_xmove(L, L1, 1);
|
lua_rawset(L, -3); /* set new hook */
|
||||||
lua_rawset(L1, -3); /* set new hook */
|
lua_pop(L, 1); /* remove hook table */
|
||||||
lua_pop(L1, 1); /* remove hook table */
|
lua_sethook(L1, func, mask, count); /* set hooks */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,11 +287,10 @@ static int db_gethook (lua_State *L) {
|
|||||||
if (hook != NULL && hook != hookf) /* external hook? */
|
if (hook != NULL && hook != hookf) /* external hook? */
|
||||||
lua_pushliteral(L, "external hook");
|
lua_pushliteral(L, "external hook");
|
||||||
else {
|
else {
|
||||||
gethooktable(L1);
|
gethooktable(L);
|
||||||
lua_pushlightuserdata(L1, L1);
|
lua_pushlightuserdata(L, L1);
|
||||||
lua_rawget(L1, -2); /* get hook */
|
lua_rawget(L, -2); /* get hook */
|
||||||
lua_remove(L1, -2); /* remove hook table */
|
lua_remove(L, -2); /* remove hook table */
|
||||||
lua_xmove(L1, L, 1);
|
|
||||||
}
|
}
|
||||||
lua_pushstring(L, unmakemask(mask, buff));
|
lua_pushstring(L, unmakemask(mask, buff));
|
||||||
lua_pushinteger(L, lua_gethookcount(L1));
|
lua_pushinteger(L, lua_gethookcount(L1));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldebug.c,v 2.29a 2005/12/22 16:19:56 roberto Exp $
|
** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $
|
||||||
** Debug Interface
|
** Debug Interface
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -275,12 +275,12 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
|
|||||||
|
|
||||||
static int precheck (const Proto *pt) {
|
static int precheck (const Proto *pt) {
|
||||||
check(pt->maxstacksize <= MAXSTACK);
|
check(pt->maxstacksize <= MAXSTACK);
|
||||||
lua_assert(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize);
|
check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize);
|
||||||
lua_assert(!(pt->is_vararg & VARARG_NEEDSARG) ||
|
check(!(pt->is_vararg & VARARG_NEEDSARG) ||
|
||||||
(pt->is_vararg & VARARG_HASARG));
|
(pt->is_vararg & VARARG_HASARG));
|
||||||
check(pt->sizeupvalues <= pt->nups);
|
check(pt->sizeupvalues <= pt->nups);
|
||||||
check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0);
|
check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0);
|
||||||
check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN);
|
check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,9 +346,18 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
|
|||||||
int dest = pc+1+b;
|
int dest = pc+1+b;
|
||||||
check(0 <= dest && dest < pt->sizecode);
|
check(0 <= dest && dest < pt->sizecode);
|
||||||
if (dest > 0) {
|
if (dest > 0) {
|
||||||
/* cannot jump to a setlist count */
|
int j;
|
||||||
Instruction d = pt->code[dest-1];
|
/* check that it does not jump to a setlist count; this
|
||||||
check(!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0));
|
is tricky, because the count from a previous setlist may
|
||||||
|
have the same value of an invalid setlist; so, we must
|
||||||
|
go all the way back to the first of them (if any) */
|
||||||
|
for (j = 0; j < dest; j++) {
|
||||||
|
Instruction d = pt->code[dest-1-j];
|
||||||
|
if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break;
|
||||||
|
}
|
||||||
|
/* if 'j' is even, previous value is not a setlist (even if
|
||||||
|
it looks like one) */
|
||||||
|
check((j&1) == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -363,7 +372,11 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
|
|||||||
}
|
}
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case OP_LOADBOOL: {
|
case OP_LOADBOOL: {
|
||||||
check(c == 0 || pc+2 < pt->sizecode); /* check its jump */
|
if (c == 1) { /* does it jump? */
|
||||||
|
check(pc+2 < pt->sizecode); /* check its jump */
|
||||||
|
check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST ||
|
||||||
|
GETARG_C(pt->code[pc+1]) != 0);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_LOADNIL: {
|
case OP_LOADNIL: {
|
||||||
@ -428,7 +441,10 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
|
|||||||
}
|
}
|
||||||
case OP_SETLIST: {
|
case OP_SETLIST: {
|
||||||
if (b > 0) checkreg(pt, a + b);
|
if (b > 0) checkreg(pt, a + b);
|
||||||
if (c == 0) pc++;
|
if (c == 0) {
|
||||||
|
pc++;
|
||||||
|
check(pc < pt->sizecode - 1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_CLOSURE: {
|
case OP_CLOSURE: {
|
||||||
@ -563,8 +579,8 @@ void luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
|
|||||||
|
|
||||||
|
|
||||||
void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {
|
void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {
|
||||||
if (ttisstring(p1)) p1 = p2;
|
if (ttisstring(p1) || ttisnumber(p1)) p1 = p2;
|
||||||
lua_assert(!ttisstring(p1));
|
lua_assert(!ttisstring(p1) && !ttisnumber(p1));
|
||||||
luaG_typeerror(L, p1, "concatenate");
|
luaG_typeerror(L, p1, "concatenate");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldebug.h,v 2.3 2005/04/25 19:24:10 roberto Exp $
|
** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Auxiliary functions from Debug Interface module
|
** Auxiliary functions from Debug Interface module
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldo.c,v 2.38 2006/06/05 19:36:14 roberto Exp $
|
** $Id: ldo.c,v 2.38.1.3 2008/01/18 22:31:22 roberto Exp $
|
||||||
** Stack and Call structure of Lua
|
** Stack and Call structure of Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -83,7 +83,7 @@ static void resetstack (lua_State *L, int status) {
|
|||||||
L->base = L->ci->base;
|
L->base = L->ci->base;
|
||||||
luaF_close(L, L->base); /* close eventual pending closures */
|
luaF_close(L, L->base); /* close eventual pending closures */
|
||||||
luaD_seterrorobj(L, status, L->base);
|
luaD_seterrorobj(L, status, L->base);
|
||||||
L->nCcalls = 0;
|
L->nCcalls = L->baseCcalls;
|
||||||
L->allowhook = 1;
|
L->allowhook = 1;
|
||||||
restore_stack_limit(L);
|
restore_stack_limit(L);
|
||||||
L->errfunc = 0;
|
L->errfunc = 0;
|
||||||
@ -332,7 +332,7 @@ static StkId callrethooks (lua_State *L, StkId firstResult) {
|
|||||||
ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */
|
ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */
|
||||||
luaD_callhook(L, LUA_HOOKRET, -1);
|
luaD_callhook(L, LUA_HOOKRET, -1);
|
||||||
if (f_isLua(L->ci)) { /* Lua function? */
|
if (f_isLua(L->ci)) { /* Lua function? */
|
||||||
while (L->ci->tailcalls--) /* call hook for eventual tail calls */
|
while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */
|
||||||
luaD_callhook(L, LUA_HOOKTAILRET, -1);
|
luaD_callhook(L, LUA_HOOKTAILRET, -1);
|
||||||
}
|
}
|
||||||
return restorestack(L, fr);
|
return restorestack(L, fr);
|
||||||
@ -417,22 +417,24 @@ static int resume_error (lua_State *L, const char *msg) {
|
|||||||
LUA_API int lua_resume (lua_State *L, int nargs) {
|
LUA_API int lua_resume (lua_State *L, int nargs) {
|
||||||
int status;
|
int status;
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
if (L->status != LUA_YIELD) {
|
if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci))
|
||||||
if (L->status != 0)
|
|
||||||
return resume_error(L, "cannot resume dead coroutine");
|
|
||||||
else if (L->ci != L->base_ci)
|
|
||||||
return resume_error(L, "cannot resume non-suspended coroutine");
|
return resume_error(L, "cannot resume non-suspended coroutine");
|
||||||
}
|
if (L->nCcalls >= LUAI_MAXCCALLS)
|
||||||
|
return resume_error(L, "C stack overflow");
|
||||||
luai_userstateresume(L, nargs);
|
luai_userstateresume(L, nargs);
|
||||||
lua_assert(L->errfunc == 0 && L->nCcalls == 0);
|
lua_assert(L->errfunc == 0);
|
||||||
|
L->baseCcalls = ++L->nCcalls;
|
||||||
status = luaD_rawrunprotected(L, resume, L->top - nargs);
|
status = luaD_rawrunprotected(L, resume, L->top - nargs);
|
||||||
if (status != 0) { /* error? */
|
if (status != 0) { /* error? */
|
||||||
L->status = cast_byte(status); /* mark thread as `dead' */
|
L->status = cast_byte(status); /* mark thread as `dead' */
|
||||||
luaD_seterrorobj(L, status, L->top);
|
luaD_seterrorobj(L, status, L->top);
|
||||||
L->ci->top = L->top;
|
L->ci->top = L->top;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
|
lua_assert(L->nCcalls == L->baseCcalls);
|
||||||
status = L->status;
|
status = L->status;
|
||||||
|
}
|
||||||
|
--L->nCcalls;
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -441,7 +443,7 @@ LUA_API int lua_resume (lua_State *L, int nargs) {
|
|||||||
LUA_API int lua_yield (lua_State *L, int nresults) {
|
LUA_API int lua_yield (lua_State *L, int nresults) {
|
||||||
luai_userstateyield(L, nresults);
|
luai_userstateyield(L, nresults);
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
if (L->nCcalls > 0)
|
if (L->nCcalls > L->baseCcalls)
|
||||||
luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
|
luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
|
||||||
L->base = L->top - nresults; /* protect stack slots below */
|
L->base = L->top - nresults; /* protect stack slots below */
|
||||||
L->status = LUA_YIELD;
|
L->status = LUA_YIELD;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldo.h,v 2.7 2005/08/24 16:15:49 roberto Exp $
|
** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Stack and Call structure of Lua
|
** Stack and Call structure of Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldump.c,v 1.15 2006/02/16 15:53:49 lhf Exp $
|
** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** save precompiled Lua chunks
|
** save precompiled Lua chunks
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lfunc.c,v 2.12a 2005/12/22 16:19:56 roberto Exp $
|
** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $
|
||||||
** Auxiliary functions to manipulate prototypes and closures
|
** Auxiliary functions to manipulate prototypes and closures
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lfunc.h,v 2.4 2005/04/25 19:24:10 roberto Exp $
|
** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Auxiliary functions to manipulate prototypes and closures
|
** Auxiliary functions to manipulate prototypes and closures
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lgc.c,v 2.38 2006/05/24 14:34:06 roberto Exp $
|
** $Id: lgc.c,v 2.38.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Garbage Collector
|
** Garbage Collector
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lgc.h,v 2.15 2005/08/24 16:15:49 roberto Exp $
|
** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Garbage Collector
|
** Garbage Collector
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: linit.c,v 1.14 2005/12/29 15:32:11 roberto Exp $
|
** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Initialization of libraries for lua.c
|
** Initialization of libraries for lua.c
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: liolib.c,v 2.73 2006/05/08 20:14:16 roberto Exp $
|
** $Id: liolib.c,v 2.73.1.3 2008/01/18 17:47:43 roberto Exp $
|
||||||
** Standard I/O (and system) library
|
** Standard I/O (and system) library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -51,7 +51,7 @@ static void fileerror (lua_State *L, int arg, const char *filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define topfile(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE))
|
#define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE))
|
||||||
|
|
||||||
|
|
||||||
static int io_type (lua_State *L) {
|
static int io_type (lua_State *L) {
|
||||||
@ -70,7 +70,7 @@ static int io_type (lua_State *L) {
|
|||||||
|
|
||||||
|
|
||||||
static FILE *tofile (lua_State *L) {
|
static FILE *tofile (lua_State *L) {
|
||||||
FILE **f = topfile(L);
|
FILE **f = tofilep(L);
|
||||||
if (*f == NULL)
|
if (*f == NULL)
|
||||||
luaL_error(L, "attempt to use a closed file");
|
luaL_error(L, "attempt to use a closed file");
|
||||||
return *f;
|
return *f;
|
||||||
@ -93,19 +93,31 @@ static FILE **newfile (lua_State *L) {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** this function has a separated environment, which defines the
|
** function to (not) close the standard files stdin, stdout, and stderr
|
||||||
** correct __close for 'popen' files
|
*/
|
||||||
|
static int io_noclose (lua_State *L) {
|
||||||
|
lua_pushnil(L);
|
||||||
|
lua_pushliteral(L, "cannot close standard file");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** function to close 'popen' files
|
||||||
*/
|
*/
|
||||||
static int io_pclose (lua_State *L) {
|
static int io_pclose (lua_State *L) {
|
||||||
FILE **p = topfile(L);
|
FILE **p = tofilep(L);
|
||||||
int ok = lua_pclose(L, *p);
|
int ok = lua_pclose(L, *p);
|
||||||
*p = NULL;
|
*p = NULL;
|
||||||
return pushresult(L, ok, NULL);
|
return pushresult(L, ok, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** function to close regular files
|
||||||
|
*/
|
||||||
static int io_fclose (lua_State *L) {
|
static int io_fclose (lua_State *L) {
|
||||||
FILE **p = topfile(L);
|
FILE **p = tofilep(L);
|
||||||
int ok = (fclose(*p) == 0);
|
int ok = (fclose(*p) == 0);
|
||||||
*p = NULL;
|
*p = NULL;
|
||||||
return pushresult(L, ok, NULL);
|
return pushresult(L, ok, NULL);
|
||||||
@ -128,18 +140,18 @@ static int io_close (lua_State *L) {
|
|||||||
|
|
||||||
|
|
||||||
static int io_gc (lua_State *L) {
|
static int io_gc (lua_State *L) {
|
||||||
FILE *f = *topfile(L);
|
FILE *f = *tofilep(L);
|
||||||
/* ignore closed files and standard files */
|
/* ignore closed files */
|
||||||
if (f != NULL && f != stdin && f != stdout && f != stderr)
|
if (f != NULL)
|
||||||
aux_close(L);
|
aux_close(L);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int io_tostring (lua_State *L) {
|
static int io_tostring (lua_State *L) {
|
||||||
FILE *f = *topfile(L);
|
FILE *f = *tofilep(L);
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
lua_pushstring(L, "file (closed)");
|
lua_pushliteral(L, "file (closed)");
|
||||||
else
|
else
|
||||||
lua_pushfstring(L, "file (%p)", f);
|
lua_pushfstring(L, "file (%p)", f);
|
||||||
return 1;
|
return 1;
|
||||||
@ -155,6 +167,10 @@ static int io_open (lua_State *L) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** this function has a separated environment, which defines the
|
||||||
|
** correct __close for 'popen' files
|
||||||
|
*/
|
||||||
static int io_popen (lua_State *L) {
|
static int io_popen (lua_State *L) {
|
||||||
const char *filename = luaL_checkstring(L, 1);
|
const char *filename = luaL_checkstring(L, 1);
|
||||||
const char *mode = luaL_optstring(L, 2, "r");
|
const char *mode = luaL_optstring(L, 2, "r");
|
||||||
@ -280,7 +296,7 @@ static int read_line (lua_State *L, FILE *f) {
|
|||||||
char *p = luaL_prepbuffer(&b);
|
char *p = luaL_prepbuffer(&b);
|
||||||
if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */
|
if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */
|
||||||
luaL_pushresult(&b); /* close buffer */
|
luaL_pushresult(&b); /* close buffer */
|
||||||
return (lua_strlen(L, -1) > 0); /* check whether read something */
|
return (lua_objlen(L, -1) > 0); /* check whether read something */
|
||||||
}
|
}
|
||||||
l = strlen(p);
|
l = strlen(p);
|
||||||
if (l == 0 || p[l-1] != '\n')
|
if (l == 0 || p[l-1] != '\n')
|
||||||
@ -308,7 +324,7 @@ static int read_chars (lua_State *L, FILE *f, size_t n) {
|
|||||||
n -= nr; /* still have to read `n' chars */
|
n -= nr; /* still have to read `n' chars */
|
||||||
} while (n > 0 && nr == rlen); /* until end of count or eof */
|
} while (n > 0 && nr == rlen); /* until end of count or eof */
|
||||||
luaL_pushresult(&b); /* close buffer */
|
luaL_pushresult(&b); /* close buffer */
|
||||||
return (n == 0 || lua_strlen(L, -1) > 0);
|
return (n == 0 || lua_objlen(L, -1) > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -502,31 +518,36 @@ static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) {
|
|||||||
lua_pushvalue(L, -1);
|
lua_pushvalue(L, -1);
|
||||||
lua_rawseti(L, LUA_ENVIRONINDEX, k);
|
lua_rawseti(L, LUA_ENVIRONINDEX, k);
|
||||||
}
|
}
|
||||||
lua_setfield(L, -2, fname);
|
lua_pushvalue(L, -2); /* copy environment */
|
||||||
|
lua_setfenv(L, -2); /* set it */
|
||||||
|
lua_setfield(L, -3, fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void newfenv (lua_State *L, lua_CFunction cls) {
|
||||||
|
lua_createtable(L, 0, 1);
|
||||||
|
lua_pushcfunction(L, cls);
|
||||||
|
lua_setfield(L, -2, "__close");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LUALIB_API int luaopen_io (lua_State *L) {
|
LUALIB_API int luaopen_io (lua_State *L) {
|
||||||
createmeta(L);
|
createmeta(L);
|
||||||
/* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */
|
/* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */
|
||||||
lua_createtable(L, 2, 1);
|
newfenv(L, io_fclose);
|
||||||
lua_replace(L, LUA_ENVIRONINDEX);
|
lua_replace(L, LUA_ENVIRONINDEX);
|
||||||
/* open library */
|
/* open library */
|
||||||
luaL_register(L, LUA_IOLIBNAME, iolib);
|
luaL_register(L, LUA_IOLIBNAME, iolib);
|
||||||
/* create (and set) default files */
|
/* create (and set) default files */
|
||||||
|
newfenv(L, io_noclose); /* close function for default files */
|
||||||
createstdfile(L, stdin, IO_INPUT, "stdin");
|
createstdfile(L, stdin, IO_INPUT, "stdin");
|
||||||
createstdfile(L, stdout, IO_OUTPUT, "stdout");
|
createstdfile(L, stdout, IO_OUTPUT, "stdout");
|
||||||
createstdfile(L, stderr, 0, "stderr");
|
createstdfile(L, stderr, 0, "stderr");
|
||||||
/* create environment for 'popen' */
|
lua_pop(L, 1); /* pop environment for default files */
|
||||||
lua_getfield(L, -1, "popen");
|
lua_getfield(L, -1, "popen");
|
||||||
lua_createtable(L, 0, 1);
|
newfenv(L, io_pclose); /* create environment for 'popen' */
|
||||||
lua_pushcfunction(L, io_pclose);
|
lua_setfenv(L, -2); /* set fenv for 'popen' */
|
||||||
lua_setfield(L, -2, "__close");
|
|
||||||
lua_setfenv(L, -2);
|
|
||||||
lua_pop(L, 1); /* pop 'popen' */
|
lua_pop(L, 1); /* pop 'popen' */
|
||||||
/* set default close function */
|
|
||||||
lua_pushcfunction(L, io_fclose);
|
|
||||||
lua_setfield(L, LUA_ENVIRONINDEX, "__close");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: llex.c,v 2.20 2006/03/09 18:14:31 roberto Exp $
|
** $Id: llex.c,v 2.20.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Lexical Analyzer
|
** Lexical Analyzer
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: llex.h,v 1.58 2006/03/23 18:23:32 roberto Exp $
|
** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Lexical Analyzer
|
** Lexical Analyzer
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: llimits.h,v 1.69 2005/12/27 17:12:00 roberto Exp $
|
** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Limits, basic types, and some other `installation-dependent' definitions
|
** Limits, basic types, and some other `installation-dependent' definitions
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lmathlib.c,v 1.67 2005/08/26 17:36:32 roberto Exp $
|
** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Standard mathematical library
|
** Standard mathematical library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lmem.c,v 1.70 2005/12/26 13:35:47 roberto Exp $
|
** $Id: lmem.c,v 1.70.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Interface to Memory Manager
|
** Interface to Memory Manager
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lmem.h,v 1.31 2005/04/25 19:24:10 roberto Exp $
|
** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Interface to Memory Manager
|
** Interface to Memory Manager
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: loadlib.c,v 1.54a 2006/07/03 20:16:49 roberto Exp $
|
** $Id: loadlib.c,v 1.52.1.3 2008/08/06 13:29:28 roberto Exp $
|
||||||
** Dynamic library loader for Lua
|
** Dynamic library loader for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
**
|
**
|
||||||
@ -506,8 +506,10 @@ static int ll_require (lua_State *L) {
|
|||||||
|
|
||||||
static void setfenv (lua_State *L) {
|
static void setfenv (lua_State *L) {
|
||||||
lua_Debug ar;
|
lua_Debug ar;
|
||||||
lua_getstack(L, 1, &ar);
|
if (lua_getstack(L, 1, &ar) == 0 ||
|
||||||
lua_getinfo(L, "f", &ar);
|
lua_getinfo(L, "f", &ar) == 0 || /* get calling function */
|
||||||
|
lua_iscfunction(L, -1))
|
||||||
|
luaL_error(L, LUA_QL("module") " not called from a Lua function");
|
||||||
lua_pushvalue(L, -2);
|
lua_pushvalue(L, -2);
|
||||||
lua_setfenv(L, -2);
|
lua_setfenv(L, -2);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lobject.c,v 2.22 2006/02/10 17:43:52 roberto Exp $
|
** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Some generic functions over Lua objects
|
** Some generic functions over Lua objects
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lobject.h,v 2.20 2006/01/18 11:37:34 roberto Exp $
|
** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $
|
||||||
** Type definitions for Lua objects
|
** Type definitions for Lua objects
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -208,7 +208,7 @@ typedef union TString {
|
|||||||
|
|
||||||
|
|
||||||
#define getstr(ts) cast(const char *, (ts) + 1)
|
#define getstr(ts) cast(const char *, (ts) + 1)
|
||||||
#define svalue(o) getstr(tsvalue(o))
|
#define svalue(o) getstr(rawtsvalue(o))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lopcodes.c,v 1.37 2005/11/08 19:45:36 roberto Exp $
|
** $Id: lopcodes.c,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lopcodes.h,v 1.125 2006/03/14 19:04:44 roberto Exp $
|
** $Id: lopcodes.h,v 1.125.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Opcodes for Lua virtual machine
|
** Opcodes for Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: loslib.c,v 1.20 2006/09/19 13:57:08 roberto Exp $
|
** $Id: loslib.c,v 1.19.1.3 2008/01/18 16:38:18 roberto Exp $
|
||||||
** Standard Operating System library
|
** Standard Operating System library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -215,7 +215,6 @@ static int os_setlocale (lua_State *L) {
|
|||||||
|
|
||||||
static int os_exit (lua_State *L) {
|
static int os_exit (lua_State *L) {
|
||||||
exit(luaL_optint(L, 1, EXIT_SUCCESS));
|
exit(luaL_optint(L, 1, EXIT_SUCCESS));
|
||||||
return 0; /* to avoid warnings */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const luaL_Reg syslib[] = {
|
static const luaL_Reg syslib[] = {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lparser.c,v 2.42a 2006/06/05 15:57:59 roberto Exp $
|
** $Id: lparser.c,v 2.42.1.3 2007/12/28 15:32:23 roberto Exp $
|
||||||
** Lua Parser
|
** Lua Parser
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -938,6 +938,8 @@ static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {
|
|||||||
primaryexp(ls, &nv.v);
|
primaryexp(ls, &nv.v);
|
||||||
if (nv.v.k == VLOCAL)
|
if (nv.v.k == VLOCAL)
|
||||||
check_conflict(ls, lh, &nv.v);
|
check_conflict(ls, lh, &nv.v);
|
||||||
|
luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls,
|
||||||
|
"variables in assignment");
|
||||||
assignment(ls, &nv, nvars+1);
|
assignment(ls, &nv, nvars+1);
|
||||||
}
|
}
|
||||||
else { /* assignment -> `=' explist1 */
|
else { /* assignment -> `=' explist1 */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lparser.h,v 1.57 2006/03/09 18:14:31 roberto Exp $
|
** $Id: lparser.h,v 1.57.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Lua Parser
|
** Lua Parser
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstate.c,v 2.36 2006/05/24 14:15:50 roberto Exp $
|
** $Id: lstate.c,v 2.36.1.2 2008/01/03 15:20:39 roberto Exp $
|
||||||
** Global State
|
** Global State
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -93,7 +93,7 @@ static void preinit_state (lua_State *L, global_State *g) {
|
|||||||
resethookcount(L);
|
resethookcount(L);
|
||||||
L->openupval = NULL;
|
L->openupval = NULL;
|
||||||
L->size_ci = 0;
|
L->size_ci = 0;
|
||||||
L->nCcalls = 0;
|
L->nCcalls = L->baseCcalls = 0;
|
||||||
L->status = 0;
|
L->status = 0;
|
||||||
L->base_ci = L->ci = NULL;
|
L->base_ci = L->ci = NULL;
|
||||||
L->savedpc = NULL;
|
L->savedpc = NULL;
|
||||||
@ -205,7 +205,7 @@ LUA_API void lua_close (lua_State *L) {
|
|||||||
do { /* repeat until no more errors */
|
do { /* repeat until no more errors */
|
||||||
L->ci = L->base_ci;
|
L->ci = L->base_ci;
|
||||||
L->base = L->top = L->ci->base;
|
L->base = L->top = L->ci->base;
|
||||||
L->nCcalls = 0;
|
L->nCcalls = L->baseCcalls = 0;
|
||||||
} while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0);
|
} while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0);
|
||||||
lua_assert(G(L)->tmudata == NULL);
|
lua_assert(G(L)->tmudata == NULL);
|
||||||
luai_userstateclose(L);
|
luai_userstateclose(L);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstate.h,v 2.24 2006/02/06 18:27:59 roberto Exp $
|
** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $
|
||||||
** Global State
|
** Global State
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -112,6 +112,7 @@ struct lua_State {
|
|||||||
int stacksize;
|
int stacksize;
|
||||||
int size_ci; /* size of array `base_ci' */
|
int size_ci; /* size of array `base_ci' */
|
||||||
unsigned short nCcalls; /* number of nested C calls */
|
unsigned short nCcalls; /* number of nested C calls */
|
||||||
|
unsigned short baseCcalls; /* nested C calls when resuming coroutine */
|
||||||
lu_byte hookmask;
|
lu_byte hookmask;
|
||||||
lu_byte allowhook;
|
lu_byte allowhook;
|
||||||
int basehookcount;
|
int basehookcount;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstring.c,v 2.8 2005/12/22 16:19:56 roberto Exp $
|
** $Id: lstring.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** String table (keeps all strings handled by Lua)
|
** String table (keeps all strings handled by Lua)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstring.h,v 1.43 2005/04/25 19:24:10 roberto Exp $
|
** $Id: lstring.h,v 1.43.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** String table (keep all strings handled by Lua)
|
** String table (keep all strings handled by Lua)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstrlib.c,v 1.132a 2006/04/26 20:41:19 roberto Exp $
|
** $Id: lstrlib.c,v 1.132.1.4 2008/07/11 17:27:21 roberto Exp $
|
||||||
** Standard library for string operations and pattern-matching
|
** Standard library for string operations and pattern-matching
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -35,7 +35,8 @@ static int str_len (lua_State *L) {
|
|||||||
|
|
||||||
static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {
|
static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {
|
||||||
/* relative string position: negative means back from end */
|
/* relative string position: negative means back from end */
|
||||||
return (pos>=0) ? pos : (ptrdiff_t)len+pos+1;
|
if (pos < 0) pos += (ptrdiff_t)len + 1;
|
||||||
|
return (pos >= 0) ? pos : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -629,10 +630,6 @@ static void add_value (MatchState *ms, luaL_Buffer *b, const char *s,
|
|||||||
lua_gettable(L, 3);
|
lua_gettable(L, 3);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
|
||||||
luaL_argerror(L, 3, "string/function/table expected");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!lua_toboolean(L, -1)) { /* nil or false? */
|
if (!lua_toboolean(L, -1)) { /* nil or false? */
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
@ -648,11 +645,15 @@ static int str_gsub (lua_State *L) {
|
|||||||
size_t srcl;
|
size_t srcl;
|
||||||
const char *src = luaL_checklstring(L, 1, &srcl);
|
const char *src = luaL_checklstring(L, 1, &srcl);
|
||||||
const char *p = luaL_checkstring(L, 2);
|
const char *p = luaL_checkstring(L, 2);
|
||||||
|
int tr = lua_type(L, 3);
|
||||||
int max_s = luaL_optint(L, 4, srcl+1);
|
int max_s = luaL_optint(L, 4, srcl+1);
|
||||||
int anchor = (*p == '^') ? (p++, 1) : 0;
|
int anchor = (*p == '^') ? (p++, 1) : 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
MatchState ms;
|
MatchState ms;
|
||||||
luaL_Buffer b;
|
luaL_Buffer b;
|
||||||
|
luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING ||
|
||||||
|
tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3,
|
||||||
|
"string/function/table expected");
|
||||||
luaL_buffinit(L, &b);
|
luaL_buffinit(L, &b);
|
||||||
ms.L = L;
|
ms.L = L;
|
||||||
ms.src_init = src;
|
ms.src_init = src;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltable.c,v 2.32 2006/01/18 11:49:02 roberto Exp $
|
** $Id: ltable.c,v 2.32.1.2 2007/12/28 15:32:23 roberto Exp $
|
||||||
** Lua tables (hash)
|
** Lua tables (hash)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -84,8 +84,8 @@ static const Node dummynode_ = {
|
|||||||
static Node *hashnum (const Table *t, lua_Number n) {
|
static Node *hashnum (const Table *t, lua_Number n) {
|
||||||
unsigned int a[numints];
|
unsigned int a[numints];
|
||||||
int i;
|
int i;
|
||||||
n += 1; /* normalize number (avoid -0) */
|
if (luai_numeq(n, 0)) /* avoid problems with -0 */
|
||||||
lua_assert(sizeof(a) <= sizeof(n));
|
return gnode(t, 0);
|
||||||
memcpy(a, &n, sizeof(a));
|
memcpy(a, &n, sizeof(a));
|
||||||
for (i = 1; i < numints; i++) a[0] += a[i];
|
for (i = 1; i < numints; i++) a[0] += a[i];
|
||||||
return hashmod(t, a[0]);
|
return hashmod(t, a[0]);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltable.h,v 2.10 2006/01/10 13:13:06 roberto Exp $
|
** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Lua tables (hash)
|
** Lua tables (hash)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltablib.c,v 1.38 2005/10/23 17:38:15 roberto Exp $
|
** $Id: ltablib.c,v 1.38.1.3 2008/02/14 16:46:58 roberto Exp $
|
||||||
** Library for Table Manipulation
|
** Library for Table Manipulation
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -118,7 +118,8 @@ static int tinsert (lua_State *L) {
|
|||||||
static int tremove (lua_State *L) {
|
static int tremove (lua_State *L) {
|
||||||
int e = aux_getn(L, 1);
|
int e = aux_getn(L, 1);
|
||||||
int pos = luaL_optint(L, 2, e);
|
int pos = luaL_optint(L, 2, e);
|
||||||
if (e == 0) return 0; /* table is `empty' */
|
if (!(1 <= pos && pos <= e)) /* position is outside bounds? */
|
||||||
|
return 0; /* nothing to remove */
|
||||||
luaL_setn(L, 1, e - 1); /* t.n = n-1 */
|
luaL_setn(L, 1, e - 1); /* t.n = n-1 */
|
||||||
lua_rawgeti(L, 1, pos); /* result = t[pos] */
|
lua_rawgeti(L, 1, pos); /* result = t[pos] */
|
||||||
for ( ;pos<e; pos++) {
|
for ( ;pos<e; pos++) {
|
||||||
@ -131,6 +132,15 @@ static int tremove (lua_State *L) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void addfield (lua_State *L, luaL_Buffer *b, int i) {
|
||||||
|
lua_rawgeti(L, 1, i);
|
||||||
|
if (!lua_isstring(L, -1))
|
||||||
|
luaL_error(L, "invalid value (%s) at index %d in table for "
|
||||||
|
LUA_QL("concat"), luaL_typename(L, -1), i);
|
||||||
|
luaL_addvalue(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int tconcat (lua_State *L) {
|
static int tconcat (lua_State *L) {
|
||||||
luaL_Buffer b;
|
luaL_Buffer b;
|
||||||
size_t lsep;
|
size_t lsep;
|
||||||
@ -140,13 +150,12 @@ static int tconcat (lua_State *L) {
|
|||||||
i = luaL_optint(L, 3, 1);
|
i = luaL_optint(L, 3, 1);
|
||||||
last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1));
|
last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1));
|
||||||
luaL_buffinit(L, &b);
|
luaL_buffinit(L, &b);
|
||||||
for (; i <= last; i++) {
|
for (; i < last; i++) {
|
||||||
lua_rawgeti(L, 1, i);
|
addfield(L, &b, i);
|
||||||
luaL_argcheck(L, lua_isstring(L, -1), 1, "table contains non-strings");
|
luaL_addlstring(&b, sep, lsep);
|
||||||
luaL_addvalue(&b);
|
|
||||||
if (i != last)
|
|
||||||
luaL_addlstring(&b, sep, lsep);
|
|
||||||
}
|
}
|
||||||
|
if (i == last) /* add last value (if interval was not empty) */
|
||||||
|
addfield(L, &b, i);
|
||||||
luaL_pushresult(&b);
|
luaL_pushresult(&b);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltm.c,v 2.8 2006/01/10 12:50:00 roberto Exp $
|
** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Tag methods
|
** Tag methods
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ltm.h,v 2.6 2005/06/06 13:30:25 roberto Exp $
|
** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Tag methods
|
** Tag methods
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lua.c,v 1.160 2006/06/02 15:34:00 roberto Exp $
|
** $Id: lua.c,v 1.160.1.2 2007/12/28 15:32:23 roberto Exp $
|
||||||
** Lua stand-alone interpreter
|
** Lua stand-alone interpreter
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -74,6 +74,8 @@ static int report (lua_State *L, int status) {
|
|||||||
|
|
||||||
|
|
||||||
static int traceback (lua_State *L) {
|
static int traceback (lua_State *L) {
|
||||||
|
if (!lua_isstring(L, 1)) /* 'message' not a string? */
|
||||||
|
return 1; /* keep it intact */
|
||||||
lua_getfield(L, LUA_GLOBALSINDEX, "debug");
|
lua_getfield(L, LUA_GLOBALSINDEX, "debug");
|
||||||
if (!lua_istable(L, -1)) {
|
if (!lua_istable(L, -1)) {
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
@ -144,7 +146,7 @@ static int dostring (lua_State *L, const char *s, const char *name) {
|
|||||||
static int dolibrary (lua_State *L, const char *name) {
|
static int dolibrary (lua_State *L, const char *name) {
|
||||||
lua_getglobal(L, "require");
|
lua_getglobal(L, "require");
|
||||||
lua_pushstring(L, name);
|
lua_pushstring(L, name);
|
||||||
return report(L, lua_pcall(L, 1, 0, 0));
|
return report(L, docall(L, 1, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lua.h,v 1.218a 2006/06/02 15:34:00 roberto Exp $
|
** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $
|
||||||
** Lua - An Extensible Extension Language
|
** Lua - An Extensible Extension Language
|
||||||
** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
|
** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
|
||||||
** See Copyright Notice at the end of this file
|
** See Copyright Notice at the end of this file
|
||||||
@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
|
|
||||||
#define LUA_VERSION "Lua 5.1"
|
#define LUA_VERSION "Lua 5.1"
|
||||||
#define LUA_RELEASE "Lua 5.1.2"
|
#define LUA_RELEASE "Lua 5.1.4"
|
||||||
#define LUA_VERSION_NUM 501
|
#define LUA_VERSION_NUM 501
|
||||||
#define LUA_COPYRIGHT "Copyright (C) 1994-2007 Lua.org, PUC-Rio"
|
#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio"
|
||||||
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes"
|
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes"
|
||||||
|
|
||||||
|
|
||||||
@ -294,6 +294,9 @@ LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
|
|||||||
#define lua_Chunkwriter lua_Writer
|
#define lua_Chunkwriter lua_Writer
|
||||||
|
|
||||||
|
|
||||||
|
/* hack */
|
||||||
|
LUA_API void lua_setlevel (lua_State *from, lua_State *to);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** {======================================================================
|
** {======================================================================
|
||||||
@ -359,7 +362,7 @@ struct lua_Debug {
|
|||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Copyright (C) 1994-2007 Lua.org, PUC-Rio. All rights reserved.
|
* Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
* a copy of this software and associated documentation files (the
|
* a copy of this software and associated documentation files (the
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: luaconf.h,v 1.82a 2006/04/10 18:27:23 roberto Exp $
|
** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $
|
||||||
** Configuration file for Lua
|
** Configuration file for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -440,9 +440,10 @@
|
|||||||
@* can use.
|
@* can use.
|
||||||
** CHANGE it if you need lots of (Lua) stack space for your C
|
** CHANGE it if you need lots of (Lua) stack space for your C
|
||||||
** functions. This limit is arbitrary; its only purpose is to stop C
|
** functions. This limit is arbitrary; its only purpose is to stop C
|
||||||
** functions to consume unlimited stack space.
|
** functions to consume unlimited stack space. (must be smaller than
|
||||||
|
** -LUA_REGISTRYINDEX)
|
||||||
*/
|
*/
|
||||||
#define LUAI_MAXCSTACK 2048
|
#define LUAI_MAXCSTACK 8000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -666,7 +667,7 @@ union luai_Cast { double l_d; long l_l; };
|
|||||||
*/
|
*/
|
||||||
#if defined(LUA_USE_POPEN)
|
#if defined(LUA_USE_POPEN)
|
||||||
|
|
||||||
#define lua_popen(L,c,m) ((void)L, popen(c,m))
|
#define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m))
|
||||||
#define lua_pclose(L,file) ((void)L, (pclose(file) != -1))
|
#define lua_pclose(L,file) ((void)L, (pclose(file) != -1))
|
||||||
|
|
||||||
#elif defined(LUA_WIN)
|
#elif defined(LUA_WIN)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lualib.h,v 1.36 2005/12/27 17:12:00 roberto Exp $
|
** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Lua standard libraries
|
** Lua standard libraries
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lundump.c,v 1.60 2006/02/16 15:53:49 lhf Exp $
|
** $Id: lundump.c,v 2.7.1.4 2008/04/04 19:51:41 roberto Exp $
|
||||||
** load precompiled Lua chunks
|
** load precompiled Lua chunks
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -29,6 +29,7 @@ typedef struct {
|
|||||||
|
|
||||||
#ifdef LUAC_TRUST_BINARIES
|
#ifdef LUAC_TRUST_BINARIES
|
||||||
#define IF(c,s)
|
#define IF(c,s)
|
||||||
|
#define error(S,s)
|
||||||
#else
|
#else
|
||||||
#define IF(c,s) if (c) error(S,s)
|
#define IF(c,s) if (c) error(S,s)
|
||||||
|
|
||||||
@ -113,7 +114,7 @@ static void LoadConstants(LoadState* S, Proto* f)
|
|||||||
setnilvalue(o);
|
setnilvalue(o);
|
||||||
break;
|
break;
|
||||||
case LUA_TBOOLEAN:
|
case LUA_TBOOLEAN:
|
||||||
setbvalue(o,LoadChar(S));
|
setbvalue(o,LoadChar(S)!=0);
|
||||||
break;
|
break;
|
||||||
case LUA_TNUMBER:
|
case LUA_TNUMBER:
|
||||||
setnvalue(o,LoadNumber(S));
|
setnvalue(o,LoadNumber(S));
|
||||||
@ -122,7 +123,7 @@ static void LoadConstants(LoadState* S, Proto* f)
|
|||||||
setsvalue2n(S->L,o,LoadString(S));
|
setsvalue2n(S->L,o,LoadString(S));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
IF (1, "bad constant");
|
error(S,"bad constant");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -159,7 +160,9 @@ static void LoadDebug(LoadState* S, Proto* f)
|
|||||||
|
|
||||||
static Proto* LoadFunction(LoadState* S, TString* p)
|
static Proto* LoadFunction(LoadState* S, TString* p)
|
||||||
{
|
{
|
||||||
Proto* f=luaF_newproto(S->L);
|
Proto* f;
|
||||||
|
if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep");
|
||||||
|
f=luaF_newproto(S->L);
|
||||||
setptvalue2s(S->L,S->L->top,f); incr_top(S->L);
|
setptvalue2s(S->L,S->L->top,f); incr_top(S->L);
|
||||||
f->source=LoadString(S); if (f->source==NULL) f->source=p;
|
f->source=LoadString(S); if (f->source==NULL) f->source=p;
|
||||||
f->linedefined=LoadInt(S);
|
f->linedefined=LoadInt(S);
|
||||||
@ -173,6 +176,7 @@ static Proto* LoadFunction(LoadState* S, TString* p)
|
|||||||
LoadDebug(S,f);
|
LoadDebug(S,f);
|
||||||
IF (!luaG_checkcode(f), "bad code");
|
IF (!luaG_checkcode(f), "bad code");
|
||||||
S->L->top--;
|
S->L->top--;
|
||||||
|
S->L->nCcalls--;
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lundump.h,v 1.40 2005/11/11 14:03:13 lhf Exp $
|
** $Id: lundump.h,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** load precompiled Lua chunks
|
** load precompiled Lua chunks
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lvm.c,v 2.63a 2006/06/05 15:58:59 roberto Exp $
|
** $Id: lvm.c,v 2.63.1.3 2007/12/28 15:32:23 roberto Exp $
|
||||||
** Lua virtual machine
|
** Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -61,11 +61,9 @@ static void traceexec (lua_State *L, const Instruction *pc) {
|
|||||||
lu_byte mask = L->hookmask;
|
lu_byte mask = L->hookmask;
|
||||||
const Instruction *oldpc = L->savedpc;
|
const Instruction *oldpc = L->savedpc;
|
||||||
L->savedpc = pc;
|
L->savedpc = pc;
|
||||||
if (mask > LUA_MASKLINE) { /* instruction-hook set? */
|
if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) {
|
||||||
if (L->hookcount == 0) {
|
resethookcount(L);
|
||||||
resethookcount(L);
|
luaD_callhook(L, LUA_HOOKCOUNT, -1);
|
||||||
luaD_callhook(L, LUA_HOOKCOUNT, -1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (mask & LUA_MASKLINE) {
|
if (mask & LUA_MASKLINE) {
|
||||||
Proto *p = ci_func(L->ci)->l.p;
|
Proto *p = ci_func(L->ci)->l.p;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lvm.h,v 2.5 2005/08/22 18:54:49 roberto Exp $
|
** $Id: lvm.h,v 2.5.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Lua virtual machine
|
** Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lzio.c,v 1.31 2005/06/03 20:15:29 roberto Exp $
|
** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** a generic input stream interface
|
** a generic input stream interface
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lzio.h,v 1.21 2005/05/17 19:49:15 roberto Exp $
|
** $Id: lzio.h,v 1.21.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||||
** Buffered streams
|
** Buffered streams
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
227
lib/lua/print.c
Normal file
227
lib/lua/print.c
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
/*
|
||||||
|
** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $
|
||||||
|
** print bytecodes
|
||||||
|
** See Copyright Notice in lua.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define luac_c
|
||||||
|
#define LUA_CORE
|
||||||
|
|
||||||
|
#include "ldebug.h"
|
||||||
|
#include "lobject.h"
|
||||||
|
#include "lopcodes.h"
|
||||||
|
#include "lundump.h"
|
||||||
|
|
||||||
|
#define PrintFunction luaU_print
|
||||||
|
|
||||||
|
#define Sizeof(x) ((int)sizeof(x))
|
||||||
|
#define VOID(p) ((const void*)(p))
|
||||||
|
|
||||||
|
static void PrintString(const TString* ts)
|
||||||
|
{
|
||||||
|
const char* s=getstr(ts);
|
||||||
|
size_t i,n=ts->tsv.len;
|
||||||
|
putchar('"');
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
int c=s[i];
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '"': printf("\\\""); break;
|
||||||
|
case '\\': printf("\\\\"); break;
|
||||||
|
case '\a': printf("\\a"); break;
|
||||||
|
case '\b': printf("\\b"); break;
|
||||||
|
case '\f': printf("\\f"); break;
|
||||||
|
case '\n': printf("\\n"); break;
|
||||||
|
case '\r': printf("\\r"); break;
|
||||||
|
case '\t': printf("\\t"); break;
|
||||||
|
case '\v': printf("\\v"); break;
|
||||||
|
default: if (isprint((unsigned char)c))
|
||||||
|
putchar(c);
|
||||||
|
else
|
||||||
|
printf("\\%03u",(unsigned char)c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
putchar('"');
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PrintConstant(const Proto* f, int i)
|
||||||
|
{
|
||||||
|
const TValue* o=&f->k[i];
|
||||||
|
switch (ttype(o))
|
||||||
|
{
|
||||||
|
case LUA_TNIL:
|
||||||
|
printf("nil");
|
||||||
|
break;
|
||||||
|
case LUA_TBOOLEAN:
|
||||||
|
printf(bvalue(o) ? "true" : "false");
|
||||||
|
break;
|
||||||
|
case LUA_TNUMBER:
|
||||||
|
printf(LUA_NUMBER_FMT,nvalue(o));
|
||||||
|
break;
|
||||||
|
case LUA_TSTRING:
|
||||||
|
PrintString(rawtsvalue(o));
|
||||||
|
break;
|
||||||
|
default: /* cannot happen */
|
||||||
|
printf("? type=%d",ttype(o));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PrintCode(const Proto* f)
|
||||||
|
{
|
||||||
|
const Instruction* code=f->code;
|
||||||
|
int pc,n=f->sizecode;
|
||||||
|
for (pc=0; pc<n; pc++)
|
||||||
|
{
|
||||||
|
Instruction i=code[pc];
|
||||||
|
OpCode o=GET_OPCODE(i);
|
||||||
|
int a=GETARG_A(i);
|
||||||
|
int b=GETARG_B(i);
|
||||||
|
int c=GETARG_C(i);
|
||||||
|
int bx=GETARG_Bx(i);
|
||||||
|
int sbx=GETARG_sBx(i);
|
||||||
|
int line=getline(f,pc);
|
||||||
|
printf("\t%d\t",pc+1);
|
||||||
|
if (line>0) printf("[%d]\t",line); else printf("[-]\t");
|
||||||
|
printf("%-9s\t",luaP_opnames[o]);
|
||||||
|
switch (getOpMode(o))
|
||||||
|
{
|
||||||
|
case iABC:
|
||||||
|
printf("%d",a);
|
||||||
|
if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b);
|
||||||
|
if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c);
|
||||||
|
break;
|
||||||
|
case iABx:
|
||||||
|
if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx);
|
||||||
|
break;
|
||||||
|
case iAsBx:
|
||||||
|
if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (o)
|
||||||
|
{
|
||||||
|
case OP_LOADK:
|
||||||
|
printf("\t; "); PrintConstant(f,bx);
|
||||||
|
break;
|
||||||
|
case OP_GETUPVAL:
|
||||||
|
case OP_SETUPVAL:
|
||||||
|
printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-");
|
||||||
|
break;
|
||||||
|
case OP_GETGLOBAL:
|
||||||
|
case OP_SETGLOBAL:
|
||||||
|
printf("\t; %s",svalue(&f->k[bx]));
|
||||||
|
break;
|
||||||
|
case OP_GETTABLE:
|
||||||
|
case OP_SELF:
|
||||||
|
if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); }
|
||||||
|
break;
|
||||||
|
case OP_SETTABLE:
|
||||||
|
case OP_ADD:
|
||||||
|
case OP_SUB:
|
||||||
|
case OP_MUL:
|
||||||
|
case OP_DIV:
|
||||||
|
case OP_POW:
|
||||||
|
case OP_EQ:
|
||||||
|
case OP_LT:
|
||||||
|
case OP_LE:
|
||||||
|
if (ISK(b) || ISK(c))
|
||||||
|
{
|
||||||
|
printf("\t; ");
|
||||||
|
if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-");
|
||||||
|
printf(" ");
|
||||||
|
if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OP_JMP:
|
||||||
|
case OP_FORLOOP:
|
||||||
|
case OP_FORPREP:
|
||||||
|
printf("\t; to %d",sbx+pc+2);
|
||||||
|
break;
|
||||||
|
case OP_CLOSURE:
|
||||||
|
printf("\t; %p",VOID(f->p[bx]));
|
||||||
|
break;
|
||||||
|
case OP_SETLIST:
|
||||||
|
if (c==0) printf("\t; %d",(int)code[++pc]);
|
||||||
|
else printf("\t; %d",c);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SS(x) (x==1)?"":"s"
|
||||||
|
#define S(x) x,SS(x)
|
||||||
|
|
||||||
|
static void PrintHeader(const Proto* f)
|
||||||
|
{
|
||||||
|
const char* s=getstr(f->source);
|
||||||
|
if (*s=='@' || *s=='=')
|
||||||
|
s++;
|
||||||
|
else if (*s==LUA_SIGNATURE[0])
|
||||||
|
s="(bstring)";
|
||||||
|
else
|
||||||
|
s="(string)";
|
||||||
|
printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n",
|
||||||
|
(f->linedefined==0)?"main":"function",s,
|
||||||
|
f->linedefined,f->lastlinedefined,
|
||||||
|
S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f));
|
||||||
|
printf("%d%s param%s, %d slot%s, %d upvalue%s, ",
|
||||||
|
f->numparams,f->is_vararg?"+":"",SS(f->numparams),
|
||||||
|
S(f->maxstacksize),S(f->nups));
|
||||||
|
printf("%d local%s, %d constant%s, %d function%s\n",
|
||||||
|
S(f->sizelocvars),S(f->sizek),S(f->sizep));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PrintConstants(const Proto* f)
|
||||||
|
{
|
||||||
|
int i,n=f->sizek;
|
||||||
|
printf("constants (%d) for %p:\n",n,VOID(f));
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
printf("\t%d\t",i+1);
|
||||||
|
PrintConstant(f,i);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PrintLocals(const Proto* f)
|
||||||
|
{
|
||||||
|
int i,n=f->sizelocvars;
|
||||||
|
printf("locals (%d) for %p:\n",n,VOID(f));
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
printf("\t%d\t%s\t%d\t%d\n",
|
||||||
|
i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PrintUpvalues(const Proto* f)
|
||||||
|
{
|
||||||
|
int i,n=f->sizeupvalues;
|
||||||
|
printf("upvalues (%d) for %p:\n",n,VOID(f));
|
||||||
|
if (f->upvalues==NULL) return;
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
printf("\t%d\t%s\n",i,getstr(f->upvalues[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintFunction(const Proto* f, int full)
|
||||||
|
{
|
||||||
|
int i,n=f->sizep;
|
||||||
|
PrintHeader(f);
|
||||||
|
PrintCode(f);
|
||||||
|
if (full)
|
||||||
|
{
|
||||||
|
PrintConstants(f);
|
||||||
|
PrintLocals(f);
|
||||||
|
PrintUpvalues(f);
|
||||||
|
}
|
||||||
|
for (i=0; i<n; i++) PrintFunction(f->p[i],full);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user