1
0
Fork 0
forked from len0rd/rockbox

lua update to 5.1.5

Modify Rocklua towards upstream 5.1.5

Clean up some of the Rocklua implementation

Change-Id: Iac722e827899cf84f5ca004ef7ae7ddce5f7fbbe
This commit is contained in:
William Wilgus 2018-11-08 11:32:45 -05:00
parent de6618a271
commit b69faf0bcc
15 changed files with 124 additions and 105 deletions

View file

@ -199,7 +199,7 @@ LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,
return luaL_opt(L, luaL_checkinteger, narg, def); return luaL_opt(L, luaL_checkinteger, narg, def);
} }
/* ROCKLUA ADDED */
LUALIB_API int luaL_checkboolean (lua_State *L, int narg) { LUALIB_API int luaL_checkboolean (lua_State *L, int narg) {
int b = lua_toboolean(L, narg); int b = lua_toboolean(L, narg);
if( b == 0 && !lua_isboolean(L, narg)) if( b == 0 && !lua_isboolean(L, narg))
@ -207,7 +207,7 @@ LUALIB_API int luaL_checkboolean (lua_State *L, int narg) {
return b; return b;
} }
/* ROCKLUA ADDED */
LUALIB_API int luaL_optboolean (lua_State *L, int narg, int def) { LUALIB_API int luaL_optboolean (lua_State *L, int narg, int def) {
return luaL_opt(L, luaL_checkboolean, narg, def); return luaL_opt(L, luaL_checkboolean, narg, def);
} }
@ -538,7 +538,7 @@ typedef struct LoadF {
char buff[LUAL_BUFFERSIZE]; char buff[LUAL_BUFFERSIZE];
} LoadF; } LoadF;
static const char *getF(lua_State *L, void *ud, size_t *size) { static const char *getF (lua_State *L, void *ud, size_t *size) {
LoadF *lf = (LoadF *)ud; LoadF *lf = (LoadF *)ud;
(void)L; (void)L;
if (lf->extraline) { if (lf->extraline) {
@ -547,7 +547,6 @@ static const char *getF(lua_State *L, void *ud, size_t *size) {
return "\n"; return "\n";
} }
*size = rb->read(lf->f, lf->buff, LUAL_BUFFERSIZE); *size = rb->read(lf->f, lf->buff, LUAL_BUFFERSIZE);
if (*size <= 0) return NULL;
return (*size > 0) ? lf->buff : NULL; return (*size > 0) ? lf->buff : NULL;
} }

View file

@ -1,5 +1,5 @@
/* /*
** $Id$ ** $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
*/ */
@ -58,7 +58,7 @@ LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);
LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
lua_Integer def); lua_Integer def);
LUALIB_API int (luaL_checkboolean) (lua_State *L, int numArg); LUALIB_API int (luaL_checkboolean) (lua_State *L, int nArg);
LUALIB_API int (luaL_optboolean) (lua_State *L, int nArg, LUALIB_API int (luaL_optboolean) (lua_State *L, int nArg,
int def); int def);

View file

@ -225,6 +225,24 @@ static int luaB_type (lua_State *L) {
} }
/** $Id: lbaselib.c,v 1.276.1.1 2013/04/12 18:48:47 roberto Exp $ */
static int pairsmeta (lua_State *L, const char *method, int iszero,
lua_CFunction iter) {
if (!luaL_getmetafield(L, 1, method)) { /* no metamethod? */
luaL_checktype(L, 1, LUA_TTABLE); /* argument must be a table */
lua_pushcfunction(L, iter); /* will return generator, */
lua_pushvalue(L, 1); /* state, */
if (iszero) lua_pushinteger(L, 0); /* and initial value */
else lua_pushnil(L);
}
else {
lua_pushvalue(L, 1); /* argument 'self' to metamethod */
lua_call(L, 1, 3); /* get 3 values from metamethod */
}
return 3;
}
static int luaB_next (lua_State *L) { static int luaB_next (lua_State *L) {
luaL_checktype(L, 1, LUA_TTABLE); luaL_checktype(L, 1, LUA_TTABLE);
lua_settop(L, 2); /* create a 2nd argument if there isn't one */ lua_settop(L, 2); /* create a 2nd argument if there isn't one */
@ -238,11 +256,8 @@ static int luaB_next (lua_State *L) {
static int luaB_pairs (lua_State *L) { static int luaB_pairs (lua_State *L) {
luaL_checktype(L, 1, LUA_TTABLE); /* pairs function from lua 5.2 */
lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ return pairsmeta(L, "__pairs", 0, luaB_next);
lua_pushvalue(L, 1); /* state, */
lua_pushnil(L); /* and initial value */
return 3;
} }
@ -252,16 +267,13 @@ static int ipairsaux (lua_State *L) {
i++; /* next value */ i++; /* next value */
lua_pushinteger(L, i); lua_pushinteger(L, i);
lua_rawgeti(L, 1, i); lua_rawgeti(L, 1, i);
return (lua_isnil(L, -1)) ? 0 : 2; return (lua_isnil(L, -1)) ? 1 : 2;
} }
static int luaB_ipairs (lua_State *L) { static int luaB_ipairs (lua_State *L) {
luaL_checktype(L, 1, LUA_TTABLE); return pairsmeta(L, "__ipairs", 1, ipairsaux);
lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ /* ipairs function from lua 5.2 */
lua_pushvalue(L, 1); /* state, */
lua_pushinteger(L, 0); /* and initial value */
return 3;
} }
@ -454,10 +466,12 @@ static const luaL_Reg base_funcs[] = {
{"gcinfo", luaB_gcinfo}, {"gcinfo", luaB_gcinfo},
{"getfenv", luaB_getfenv}, {"getfenv", luaB_getfenv},
{"getmetatable", luaB_getmetatable}, {"getmetatable", luaB_getmetatable},
{"ipairs", luaB_ipairs},
{"loadfile", luaB_loadfile}, {"loadfile", luaB_loadfile},
{"load", luaB_load}, {"load", luaB_load},
{"loadstring", luaB_loadstring}, {"loadstring", luaB_loadstring},
{"next", luaB_next}, {"next", luaB_next},
{"pairs", luaB_pairs},
{"pcall", luaB_pcall}, {"pcall", luaB_pcall},
#if 0 #if 0
{"print", luaB_print}, {"print", luaB_print},
@ -619,14 +633,6 @@ static const luaL_Reg co_funcs[] = {
/* }====================================================== */ /* }====================================================== */
static void auxopen (lua_State *L, const char *name,
lua_CFunction f, lua_CFunction u) {
lua_pushcfunction(L, u);
lua_pushcclosure(L, f, 1);
lua_setfield(L, -2, name);
}
static void base_open (lua_State *L) { static void base_open (lua_State *L) {
/* set global _G */ /* set global _G */
lua_pushvalue(L, LUA_GLOBALSINDEX); lua_pushvalue(L, LUA_GLOBALSINDEX);
@ -635,9 +641,6 @@ static void base_open (lua_State *L) {
luaL_register(L, "_G", base_funcs); luaL_register(L, "_G", base_funcs);
lua_pushliteral(L, LUA_VERSION); lua_pushliteral(L, LUA_VERSION);
lua_setglobal(L, "_VERSION"); /* set global _VERSION */ lua_setglobal(L, "_VERSION"); /* set global _VERSION */
/* `ipairs' and `pairs' need auxliliary functions as upvalues */
auxopen(L, "ipairs", luaB_ipairs, ipairsaux);
auxopen(L, "pairs", luaB_pairs, luaB_next);
/* `newproxy' needs a weaktable as upvalue */ /* `newproxy' needs a weaktable as upvalue */
lua_createtable(L, 0, 1); /* new table `w' */ lua_createtable(L, 0, 1); /* new table `w' */
lua_pushvalue(L, -1); /* `w' will be its own metatable */ lua_pushvalue(L, -1); /* `w' will be its own metatable */

View file

@ -1,5 +1,5 @@
/* /*
** $Id: lcode.c,v 2.25.1.3 2007/12/28 15:32:23 roberto Exp $ ** $Id: lcode.c,v 2.25.1.5 2011/01/31 14:53:16 roberto Exp $
** Code generator for Lua ** Code generator for Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -544,10 +544,6 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) {
pc = NO_JUMP; /* always true; do nothing */ pc = NO_JUMP; /* always true; do nothing */
break; break;
} }
case VFALSE: {
pc = luaK_jump(fs); /* always jump */
break;
}
case VJMP: { case VJMP: {
invertjump(fs, e); invertjump(fs, e);
pc = e->u.s.info; pc = e->u.s.info;
@ -572,10 +568,6 @@ static void luaK_goiffalse (FuncState *fs, expdesc *e) {
pc = NO_JUMP; /* always false; do nothing */ pc = NO_JUMP; /* always false; do nothing */
break; break;
} }
case VTRUE: {
pc = luaK_jump(fs); /* always jump */
break;
}
case VJMP: { case VJMP: {
pc = e->u.s.info; pc = e->u.s.info;
break; break;
@ -641,10 +633,10 @@ static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {
case OP_ADD: r = luai_numadd(v1, v2); break; case OP_ADD: r = luai_numadd(v1, v2); break;
case OP_SUB: r = luai_numsub(v1, v2); break; case OP_SUB: r = luai_numsub(v1, v2); break;
case OP_MUL: r = luai_nummul(v1, v2); break; case OP_MUL: r = luai_nummul(v1, v2); break;
case OP_DIV: case OP_DIV: /* ROCKLUA BUGFIX */
if (v2 == 0) return -1; /* do not attempt to divide by 0 */ if (v2 == 0) return -1; /* do not attempt to divide by 0 */
r = luai_numdiv(v1, v2); break; r = luai_numdiv(v1, v2); break;
case OP_MOD: case OP_MOD: /* ROCKLUA BUGFIX */
if (v2 == 0) return -1; /* do not attempt to divide by 0 */ if (v2 == 0) return -1; /* do not attempt to divide by 0 */
r = luai_nummod(v1, v2); break; r = luai_nummod(v1, v2); break;
case OP_POW: r = luai_numpow(v1, v2); break; case OP_POW: r = luai_numpow(v1, v2); break;
@ -659,7 +651,7 @@ static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {
static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {
int resf = constfolding(op, e1, e2); int resf = constfolding(op, e1, e2); /* ROCKLUA BUGFIX */
if (resf > 0) if (resf > 0)
return; return;
else if (resf == 0) { else if (resf == 0) {

View file

@ -1,5 +1,5 @@
/* /*
** $Id: ldo.c,v 2.38.1.3 2008/01/18 22:31:22 roberto Exp $ ** $Id: ldo.c,v 2.38.1.4 2012/01/18 02:27:10 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
*/ */
@ -217,6 +217,7 @@ static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
int nvar = actual - nfixargs; /* number of extra arguments */ int nvar = actual - nfixargs; /* number of extra arguments */
lua_assert(p->is_vararg & VARARG_HASARG); lua_assert(p->is_vararg & VARARG_HASARG);
luaC_checkGC(L); luaC_checkGC(L);
luaD_checkstack(L, p->maxstacksize);
htab = luaH_new(L, nvar, 1); /* create `arg' table */ htab = luaH_new(L, nvar, 1); /* create `arg' table */
for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */ for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */
setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i); setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i);

View file

@ -1,5 +1,5 @@
/* /*
** $Id: lgc.c,v 2.38.1.1 2007/12/27 13:02:25 roberto Exp $ ** $Id: lgc.c,v 2.38.1.2 2011/03/18 18:05:38 roberto Exp $
** Garbage Collector ** Garbage Collector
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -627,7 +627,6 @@ void luaC_step (lua_State *L) {
} }
} }
else { else {
lua_assert(g->totalbytes >= g->estimate);
setthreshold(g); setthreshold(g);
} }
} }

View file

@ -40,7 +40,7 @@ static int pushresult (lua_State *L, int i, const char *filename) {
lua_pushfstring(L, "%s: %s", filename, strerror(en)); lua_pushfstring(L, "%s: %s", filename, strerror(en));
else else
lua_pushfstring(L, "%s", strerror(en)); lua_pushfstring(L, "%s", strerror(en));
lua_pushinteger(L, 0); lua_pushinteger(L, en);
return 3; return 3;
} }
} }
@ -51,6 +51,7 @@ static void fileerror (lua_State *L, int arg, const char *filename) {
luaL_argerror(L, arg, lua_tostring(L, -1)); luaL_argerror(L, arg, lua_tostring(L, -1));
} }
#define tofilep(L) ((int*) luaL_checkudata(L, 1, LUA_FILEHANDLE))
static int io_type (lua_State *L) { static int io_type (lua_State *L) {
void *ud; void *ud;
@ -68,7 +69,7 @@ static int io_type (lua_State *L) {
static int* tofile (lua_State *L) { static int* tofile (lua_State *L) {
int *f = (int*) luaL_checkudata(L, 1, LUA_FILEHANDLE); int *f = tofilep(L);
if (*f < 0) if (*f < 0)
luaL_error(L, "attempt to use a closed file"); luaL_error(L, "attempt to use a closed file");
return f; return f;
@ -115,20 +116,20 @@ static int io_close (lua_State *L) {
static int io_gc (lua_State *L) { static int io_gc (lua_State *L) {
int f = *(int*) luaL_checkudata(L, 1, LUA_FILEHANDLE); int *f = tofilep(L);
/* ignore closed files */ /* ignore closed files */
if (f >= 0) if (*f >= 0)
aux_close(L); aux_close(L);
return 0; return 0;
} }
static int io_tostring (lua_State *L) { static int io_tostring (lua_State *L) {
int f = *(int*) luaL_checkudata(L, 1, LUA_FILEHANDLE); int *f = tofilep(L);
if (f < 0) if (*f < 0)
lua_pushliteral(L, "file (closed)"); lua_pushliteral(L, "file (closed)");
else else
lua_pushfstring(L, "file (%d)", f); lua_pushfstring(L, "file (%d)", *f);
return 1; return 1;
} }
@ -137,28 +138,33 @@ static int io_open (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");
int *pf = newfile(L); int *pf = newfile(L);
int flags = 0; int flags, wrmode;
if(*(mode+1) == '+') {
switch(*mode) {
case 'r':
flags = O_RDONLY;
wrmode = 0;
break;
case 'w':
flags = O_WRONLY;
wrmode = O_CREAT | O_TRUNC;
break;
case 'a':
flags = O_WRONLY;
wrmode = O_CREAT | O_APPEND;
break;
default:
flags = 0;
wrmode = 0;
return luaL_error(L, "invalid option " LUA_QL("%c") " to "
LUA_QL("open"), *mode);
}
if(*(mode+1) == '+')
flags = O_RDWR; flags = O_RDWR;
switch(*mode) {
case 'w': flags |= wrmode;
flags |= O_TRUNC; break;
case 'a':
flags |= O_APPEND; break;
}
}
else {
switch(*mode) {
case 'r':
flags = O_RDONLY; break;
case 'w':
flags = O_WRONLY | O_TRUNC; break;
case 'a':
flags = O_WRONLY | O_APPEND; break;
}
}
if((*mode == 'w' || *mode == 'a') && !rb->file_exists(filename))
flags |= O_CREAT;
*pf = rb->open(filename, flags, 0666); *pf = rb->open(filename, flags, 0666);
return (*pf < 0) ? pushresult(L, 0, filename) : 1; return (*pf < 0) ? pushresult(L, 0, filename) : 1;
} }
@ -252,7 +258,10 @@ static int read_number (lua_State *L, int *f) {
lua_pushnumber(L, d); lua_pushnumber(L, d);
return 1; return 1;
} }
else return 0; /* read fails */ else {
lua_pushnil(L); /* "result" to be removed */
return 0; /* read fails */
}
} }
@ -412,14 +421,14 @@ static int f_write (lua_State *L) {
static int f_seek (lua_State *L) { static int f_seek (lua_State *L) {
static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END};
static const char *const modenames[] = {"set", "cur", "end", NULL}; static const char *const modenames[] = {"set", "cur", "end", NULL};
int f = *tofile(L); int *f = tofile(L);
int op = luaL_checkoption(L, 2, "cur", modenames); int op = luaL_checkoption(L, 2, "cur", modenames);
long offset = luaL_optlong(L, 3, 0); long offset = luaL_optlong(L, 3, 0);
off_t size = rb->lseek(f, offset, mode[op]); off_t size = rb->lseek(*f, offset, mode[op]);
if (size < 0 || size > MAX_INT) /* signed limit */ if (size < 0 || size > MAX_INT) /* signed limit */
return pushresult(L, 0, NULL); /* error */ return pushresult(L, 0, NULL); /* error */
else { else {
lua_pushinteger(L, (LUA_INTEGER) size ); lua_pushinteger(L, (LUA_INTEGER) size );
return 1; return 1;
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
** $Id: llex.c,v 2.20.1.1 2007/12/27 13:02:25 roberto Exp $ ** $Id: llex.c,v 2.20.1.2 2009/11/23 14:58:22 roberto Exp $
** Lexical Analyzer ** Lexical Analyzer
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -118,8 +118,10 @@ TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
lua_State *L = ls->L; lua_State *L = ls->L;
TString *ts = luaS_newlstr(L, str, l); TString *ts = luaS_newlstr(L, str, l);
TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */ TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */
if (ttisnil(o)) if (ttisnil(o)) {
setbvalue(o, 1); /* make sure `str' will not be collected */ setbvalue(o, 1); /* make sure `str' will not be collected */
luaC_checkGC(L);
}
return ts; return ts;
} }

View file

@ -82,19 +82,17 @@ static int math_atan2 (lua_State *L) {
lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
return 1; return 1;
} }
#endif
static int math_ceil (lua_State *L) { static int math_ceil (lua_State *L) {
/* Doesn't change anything in fixed point arithmetic */ lua_pushnumber(L, ceil(luaL_checknumber(L, 1)));
lua_pushnumber(L, luaL_checknumber(L, 1));
return 1; return 1;
} }
static int math_floor (lua_State *L) { static int math_floor (lua_State *L) {
/* Doesn't change anything in fixed point arithmetic */ lua_pushnumber(L, floor(luaL_checknumber(L, 1)));
lua_pushnumber(L, luaL_checknumber(L, 1));
return 1; return 1;
} }
#endif
static int math_fmod (lua_State *L) { static int math_fmod (lua_State *L) {
/* Was: lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); */ /* Was: lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); */
@ -220,6 +218,11 @@ static int math_randomseed (lua_State *L) {
return 0; return 0;
} }
static int math_ident (lua_State *L) { /* ROCKLUA ADDED */
/* Ceil & floor Doesn't change anything in fixed point arithmetic */
lua_pushnumber(L, luaL_checknumber(L, 1));
return 1;
}
static const luaL_Reg mathlib[] = { static const luaL_Reg mathlib[] = {
{"abs", math_abs}, {"abs", math_abs},
@ -228,17 +231,15 @@ static const luaL_Reg mathlib[] = {
{"asin", math_asin}, {"asin", math_asin},
{"atan2", math_atan2}, {"atan2", math_atan2},
{"atan", math_atan}, {"atan", math_atan},
#endif
{"ceil", math_ceil}, {"ceil", math_ceil},
#if 0
{"cosh", math_cosh}, {"cosh", math_cosh},
{"cos", math_cos}, {"cos", math_cos},
#endif #endif
{"deg", math_deg}, {"deg", math_deg},
#if 0 #if 0
{"exp", math_exp}, {"exp", math_exp},
#endif
{"floor", math_floor}, {"floor", math_floor},
#endif
{"fmod", math_fmod}, {"fmod", math_fmod},
#if 0 #if 0
{"frexp", math_frexp}, {"frexp", math_frexp},
@ -262,6 +263,8 @@ static const luaL_Reg mathlib[] = {
{"tanh", math_tanh}, {"tanh", math_tanh},
{"tan", math_tan}, {"tan", math_tan},
#endif #endif
{"ceil", math_ident},
{"floor", math_ident},
{NULL, NULL} {NULL, NULL}
}; };

View file

@ -1,5 +1,5 @@
/* /*
** $Id: loadlib.c,v 1.52.1.3 2008/08/06 13:29:28 roberto Exp $ ** $Id: loadlib.c,v 1.52.1.4 2009/09/09 13:17:16 roberto Exp $
** Dynamic library loader for Lua ** Dynamic library loader for Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
** **
@ -21,9 +21,9 @@
#include "lauxlib.h" #include "lauxlib.h"
#include "lualib.h" #include "lualib.h"
#include "rocklib.h" #include "rocklib.h"
#include "rocklibc.h"
#define setprogdir(L) ((void)0) /* ROCKLUA ADDED */
#define setprogdir(L) ((void)0)
/* /*
@ -54,7 +54,7 @@ static const char *pushnexttemplate (lua_State *L, const char *path) {
static const char *findfile (lua_State *L, const char *name, static const char *findfile (lua_State *L, const char *name,
const char *pname) { const char *pname) {
get_current_path(L, 2); get_current_path(L, 2); /* ROCKLUA ADDED */
const char *current_path = lua_tostring(L, -1); const char *current_path = lua_tostring(L, -1);
const char *path; const char *path;
@ -196,7 +196,7 @@ static void modinit (lua_State *L, const char *modname) {
lua_setfield(L, -2, "_M"); /* module._M = module */ lua_setfield(L, -2, "_M"); /* module._M = module */
lua_pushstring(L, modname); lua_pushstring(L, modname);
lua_setfield(L, -2, "_NAME"); lua_setfield(L, -2, "_NAME");
dot = rb->strrchr(modname, '.'); /* look for last dot in module name */ dot = strrchr(modname, '.'); /* look for last dot in module name */
if (dot == NULL) dot = modname; if (dot == NULL) dot = modname;
else dot++; else dot++;
/* set _PACKAGE as package name (full module name minus last part) */ /* set _PACKAGE as package name (full module name minus last part) */
@ -292,7 +292,7 @@ LUALIB_API int luaopen_package (lua_State *L) {
lua_pushvalue(L, -1); lua_pushvalue(L, -1);
lua_replace(L, LUA_ENVIRONINDEX); lua_replace(L, LUA_ENVIRONINDEX);
/* create `loaders' table */ /* create `loaders' table */
lua_createtable(L, 0, sizeof(loaders)/sizeof(loaders[0]) - 1); lua_createtable(L, sizeof(loaders)/sizeof(loaders[0]) - 1, 0);
/* fill it with pre-defined loaders */ /* fill it with pre-defined loaders */
for (i=0; loaders[i] != NULL; i++) { for (i=0; loaders[i] != NULL; i++) {
lua_pushcfunction(L, loaders[i]); lua_pushcfunction(L, loaders[i]);

View file

@ -1,5 +1,5 @@
/* /*
** $Id: lparser.c,v 2.42.1.3 2007/12/28 15:32:23 roberto Exp $ ** $Id: lparser.c,v 2.42.1.4 2011/10/21 19:31:42 roberto Exp $
** Lua Parser ** Lua Parser
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -325,7 +325,7 @@ static void pushclosure (LexState *ls, FuncState *func, expdesc *v) {
} }
static void lparser_open_func (LexState *ls, FuncState *fs) { static void open_func (LexState *ls, FuncState *fs) {
lua_State *L = ls->L; lua_State *L = ls->L;
Proto *f = luaF_newproto(L); Proto *f = luaF_newproto(L);
fs->f = f; fs->f = f;
@ -374,9 +374,9 @@ static void close_func (LexState *ls) {
lua_assert(luaG_checkcode(f)); lua_assert(luaG_checkcode(f));
lua_assert(fs->bl == NULL); lua_assert(fs->bl == NULL);
ls->fs = fs->prev; ls->fs = fs->prev;
L->top -= 2; /* remove table and prototype from the stack */
/* last token read was anchored in defunct function; must reanchor it */ /* last token read was anchored in defunct function; must reanchor it */
if (fs) anchor_token(ls); if (fs) anchor_token(ls);
L->top -= 2; /* remove table and prototype from the stack */
} }
@ -385,7 +385,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {
struct FuncState funcstate; struct FuncState funcstate;
lexstate.buff = buff; lexstate.buff = buff;
luaX_setinput(L, &lexstate, z, luaS_new(L, name)); luaX_setinput(L, &lexstate, z, luaS_new(L, name));
lparser_open_func(&lexstate, &funcstate); open_func(&lexstate, &funcstate);
funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */ funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */
luaX_next(&lexstate); /* read first token */ luaX_next(&lexstate); /* read first token */
chunk(&lexstate); chunk(&lexstate);
@ -576,7 +576,7 @@ static void parlist (LexState *ls) {
static void body (LexState *ls, expdesc *e, int needself, int line) { static void body (LexState *ls, expdesc *e, int needself, int line) {
/* body -> `(' parlist `)' chunk END */ /* body -> `(' parlist `)' chunk END */
FuncState new_fs; FuncState new_fs;
lparser_open_func(ls, &new_fs); open_func(ls, &new_fs);
new_fs.f->linedefined = line; new_fs.f->linedefined = line;
checknext(ls, '('); checknext(ls, '(');
if (needself) { if (needself) {

View file

@ -1,5 +1,5 @@
/* /*
** $Id: lstrlib.c,v 1.132.1.4 2008/07/11 17:27:21 roberto Exp $ ** $Id: lstrlib.c,v 1.132.1.5 2010/05/14 15:34:19 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
*/ */
@ -754,6 +754,7 @@ static void addintlen (char *form) {
static int str_format (lua_State *L) { static int str_format (lua_State *L) {
int top = lua_gettop(L);
int arg = 1; int arg = 1;
size_t sfl; size_t sfl;
const char *strfrmt = luaL_checklstring(L, arg, &sfl); const char *strfrmt = luaL_checklstring(L, arg, &sfl);
@ -768,7 +769,8 @@ static int str_format (lua_State *L) {
else { /* format item */ else { /* format item */
char form[MAX_FORMAT]; /* to store the format (`%...') */ char form[MAX_FORMAT]; /* to store the format (`%...') */
char buff[MAX_ITEM]; /* to store the formatted item */ char buff[MAX_ITEM]; /* to store the formatted item */
arg++; if (++arg > top)
luaL_argerror(L, arg, "no value");
strfrmt = scanformat(L, strfrmt, form); strfrmt = scanformat(L, strfrmt, form);
switch (*strfrmt++) { switch (*strfrmt++) {
case 'c': { case 'c': {
@ -785,11 +787,13 @@ static int str_format (lua_State *L) {
snprintf(buff, MAX_ITEM, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg)); snprintf(buff, MAX_ITEM, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg));
break; break;
} }
#if 0 /* ROCKLUA NO FLOATING POINT */
case 'e': case 'E': case 'f': case 'e': case 'E': case 'f':
case 'g': case 'G': { case 'g': case 'G': {
snprintf(buff, MAX_ITEM, form, (double)luaL_checknumber(L, arg)); snprintf(buff, MAX_ITEM, form, (double)luaL_checknumber(L, arg));
break; break;
} }
#endif
case 'q': { case 'q': {
addquoted(L, &b, arg); addquoted(L, &b, arg);
continue; /* skip the 'addsize' at the end */ continue; /* skip the 'addsize' at the end */

View file

@ -1,5 +1,5 @@
/* /*
** $Id$ ** $Id: lua.h,v 1.218.1.7 2012/01/13 20:36:20 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.4" #define LUA_RELEASE "Lua 5.1.5"
#define LUA_VERSION_NUM 501 #define LUA_VERSION_NUM 501
#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio" #define LUA_COPYRIGHT "Copyright (C) 1994-2012 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"
@ -362,7 +362,7 @@ struct lua_Debug {
/****************************************************************************** /******************************************************************************
* Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. * Copyright (C) 1994-2012 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

View file

@ -1,5 +1,5 @@
/* /*
** $Id: lvm.c,v 2.63.1.3 2007/12/28 15:32:23 roberto Exp $ ** $Id: lvm.c,v 2.63.1.5 2011/08/17 20:43:11 roberto Exp $
** Lua virtual machine ** Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -133,6 +133,7 @@ void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) {
void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
int loop; int loop;
TValue temp;
for (loop = 0; loop < MAXTAGLOOP; loop++) { for (loop = 0; loop < MAXTAGLOOP; loop++) {
const TValue *tm; const TValue *tm;
if (ttistable(t)) { /* `t' is a table? */ if (ttistable(t)) { /* `t' is a table? */
@ -141,6 +142,7 @@ void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
if (!ttisnil(oldval) || /* result is no nil? */ if (!ttisnil(oldval) || /* result is no nil? */
(tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */
setobj2t(L, oldval, val); setobj2t(L, oldval, val);
h->flags = 0;
luaC_barriert(L, h, val); luaC_barriert(L, h, val);
return; return;
} }
@ -152,7 +154,9 @@ void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
callTM(L, tm, t, key, val); callTM(L, tm, t, key, val);
return; return;
} }
t = tm; /* else repeat with `tm' */ /* else repeat with `tm' */
setobj(L, &temp, tm); /* avoid pointing inside table (may rehash) */
t = &temp;
} }
luaG_runerror(L, "loop in settable"); luaG_runerror(L, "loop in settable");
} }
@ -480,6 +484,7 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_DIV: { case OP_DIV: {
/* ROCKLUA INTEGER BUGFIX */
TValue *rb = RKB(i); TValue *rb = RKB(i);
TValue *rc = RKC(i); TValue *rc = RKC(i);
if (ttisnumber(rb) && ttisnumber(rc)) { if (ttisnumber(rb) && ttisnumber(rc)) {
@ -495,6 +500,7 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_MOD: { case OP_MOD: {
/* ROCKLUA INTEGER BUGFIX */
TValue *rb = RKB(i); TValue *rb = RKB(i);
TValue *rc = RKC(i); TValue *rc = RKC(i);
if (ttisnumber(rb) && ttisnumber(rc)) { if (ttisnumber(rb) && ttisnumber(rc)) {
@ -508,7 +514,7 @@ void luaV_execute (lua_State *L, int nexeccalls) {
Protect(Arith(L, ra, rb, rc, TM_MOD)); Protect(Arith(L, ra, rb, rc, TM_MOD));
continue; continue;
} }
case OP_POW: { case OP_POW: {
arith_op(luai_numpow, TM_POW); arith_op(luai_numpow, TM_POW);
continue; continue;

View file

@ -42,6 +42,7 @@ extern int errno;
/* Simple substitutions */ /* Simple substitutions */
#define memcmp rb->memcmp #define memcmp rb->memcmp
#define strlen rb->strlen #define strlen rb->strlen
#define strrchr rb->strrchr
#endif /* _ROCKLIBC_H_ */ #endif /* _ROCKLIBC_H_ */