diff options
-rw-r--r-- | lib/lua/include/lua.h | 8 | ||||
-rw-r--r-- | lib/lua/includes/lfunc.h | 9 | ||||
-rw-r--r-- | lib/lua/src/LuaLib/lbaselib.c | 4 | ||||
-rw-r--r-- | lib/lua/src/LuaLib/liolib.c | 66 | ||||
-rw-r--r-- | lib/lua/src/lapi.c | 6 | ||||
-rw-r--r-- | lib/lua/src/lcode.c | 52 | ||||
-rw-r--r-- | lib/lua/src/lfunc.c | 10 | ||||
-rw-r--r-- | lib/lua/src/lgc.c | 23 | ||||
-rw-r--r-- | lib/lua/src/lvm.c | 14 |
9 files changed, 108 insertions, 84 deletions
diff --git a/lib/lua/include/lua.h b/lib/lua/include/lua.h index 9a28d9e..8a9caf1 100644 --- a/lib/lua/include/lua.h +++ b/lib/lua/include/lua.h @@ -1,5 +1,5 @@ /* -** $Id: lua.h,v 1.9 2006-02-09 16:59:55 pixel Exp $ +** $Id: lua.h,v 1.10 2007-07-25 16:54:32 pixel Exp $ ** Lua - An Extensible Extension Language ** Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil ** http://www.lua.org mailto:info@lua.org @@ -17,8 +17,8 @@ extern "C" { #endif -#define LUA_VERSION "Lua 5.0.2" -#define LUA_COPYRIGHT "Copyright (C) 1994-2004 Tecgraf, PUC-Rio" +#define LUA_VERSION "Lua 5.0.3" +#define LUA_COPYRIGHT "Copyright (C) 1994-2006 Tecgraf, PUC-Rio" #define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" @@ -380,7 +380,7 @@ struct lua_Debug { /****************************************************************************** -* Copyright (C) 1994-2003 Tecgraf, PUC-Rio. All rights reserved. +* Copyright (C) 1994-2006 Tecgraf, PUC-Rio. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the diff --git a/lib/lua/includes/lfunc.h b/lib/lua/includes/lfunc.h index 6af41b7..df8f1c9 100644 --- a/lib/lua/includes/lfunc.h +++ b/lib/lua/includes/lfunc.h @@ -1,5 +1,5 @@ /* -** $Id: lfunc.h,v 1.4 2004-11-27 21:46:06 pixel Exp $ +** $Id: lfunc.h,v 1.5 2007-07-25 16:54:32 pixel Exp $ ** Auxiliary functions to manipulate prototypes and closures ** See Copyright Notice in lua.h */ @@ -11,6 +11,13 @@ #include "lobject.h" +#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \ + cast(int, sizeof(TObject)*((n)-1))) + +#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \ + cast(int, sizeof(TObject *)*((n)-1))) + + Proto *luaF_newproto (lua_State *L); Closure *luaF_newCclosure (lua_State *L, int nelems); Closure *luaF_newLclosure (lua_State *L, int nelems, TObject *e); diff --git a/lib/lua/src/LuaLib/lbaselib.c b/lib/lua/src/LuaLib/lbaselib.c index f9c76f1..9a173a4 100644 --- a/lib/lua/src/LuaLib/lbaselib.c +++ b/lib/lua/src/LuaLib/lbaselib.c @@ -1,5 +1,5 @@ /* -** $Id: lbaselib.c,v 1.6 2007-05-31 13:26:52 pixel Exp $ +** $Id: lbaselib.c,v 1.7 2007-07-25 16:54:33 pixel Exp $ ** Basic library ** See Copyright Notice in lua.h */ @@ -173,6 +173,7 @@ static int luaB_rawequal (lua_State *L) { static int luaB_rawget (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); luaL_checkany(L, 2); + lua_settop(L, 2); lua_rawget(L, 1); return 1; } @@ -181,6 +182,7 @@ static int luaB_rawset (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); luaL_checkany(L, 2); luaL_checkany(L, 3); + lua_settop(L, 3); lua_rawset(L, 1); return 1; } diff --git a/lib/lua/src/LuaLib/liolib.c b/lib/lua/src/LuaLib/liolib.c index 29c4821..bd3b2ed 100644 --- a/lib/lua/src/LuaLib/liolib.c +++ b/lib/lua/src/LuaLib/liolib.c @@ -1,5 +1,5 @@ /* -** $Id: liolib.c,v 1.5 2004-12-27 19:52:23 pixel Exp $ +** $Id: liolib.c,v 1.6 2007-07-25 16:54:33 pixel Exp $ ** Standard I/O (and system) library ** See Copyright Notice in lua.h */ @@ -20,6 +20,12 @@ #include "lualib.h" +typedef struct FileHandle { + FILE *f; + int ispipe; +} FileHandle; + + /* ** by default, gcc does not get `tmpname' @@ -86,17 +92,17 @@ static int pushresult (lua_State *L, int i, const char *filename) { } -static FILE **topfile (lua_State *L, int findex) { - FILE **f = (FILE **)luaL_checkudata(L, findex, FILEHANDLE); - if (f == NULL) luaL_argerror(L, findex, "bad file"); - return f; +static FileHandle *topfile (lua_State *L, int findex) { + FileHandle *fh = (FileHandle *)luaL_checkudata(L, findex, FILEHANDLE); + if (fh == NULL) luaL_argerror(L, findex, "bad file"); + return fh; } static int io_type (lua_State *L) { - FILE **f = (FILE **)luaL_checkudata(L, 1, FILEHANDLE); - if (f == NULL) lua_pushnil(L); - else if (*f == NULL) + FileHandle *fh = (FileHandle *)luaL_checkudata(L, 1, FILEHANDLE); + if (fh == NULL) lua_pushnil(L); + else if (fh->f == NULL) lua_pushliteral(L, "closed file"); else lua_pushliteral(L, "file"); @@ -104,26 +110,31 @@ static int io_type (lua_State *L) { } -static FILE *tofile (lua_State *L, int findex) { - FILE **f = topfile(L, findex); - if (*f == NULL) +#define tofile(L,i) (tofileh(L,i)->f) + +static FileHandle *tofileh (lua_State *L, int findex) { + FileHandle *fh = topfile(L, findex); + if (fh->f == NULL) luaL_error(L, "attempt to use a closed file"); - return *f; + return fh; } +#define newfile(L) (&(newfileh(L)->f)) + /* ** When creating file handles, always creates a `closed' file handle ** before opening the actual file; so, if there is a memory error, the ** file is not left opened. */ -static FILE **newfile (lua_State *L) { - FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *)); - *pf = NULL; /* file handle is currently `closed' */ +static FileHandle *newfileh (lua_State *L) { + FileHandle *fh = (FileHandle *)lua_newuserdata(L, sizeof(FileHandle)); + fh->f = NULL; /* file handle is currently `closed' */ + fh->ispipe = 0; luaL_getmetatable(L, FILEHANDLE); lua_setmetatable(L, -2); - return pf; + return fh; } @@ -145,13 +156,13 @@ static void registerfile (lua_State *L, FILE *f, const char *name, static int aux_close (lua_State *L) { - FILE *f = tofile(L, 1); + FileHandle *fh = tofileh(L, 1); + FILE *f = fh->f; if (f == stdin || f == stdout || f == stderr) return 0; /* file cannot be closed */ else { - int ok = (pclose(f) != -1) || (fclose(f) == 0); - if (ok) - *(FILE **)lua_touserdata(L, 1) = NULL; /* mark file as closed */ + int ok = fh->ispipe ? (pclose(f) != -1) : (fclose(f) == 0); + fh->f = NULL; /* mark file as closed */ return ok; } } @@ -167,8 +178,8 @@ static int io_close (lua_State *L) { static int io_gc (lua_State *L) { - FILE **f = topfile(L, 1); - if (*f != NULL) /* ignore closed files */ + FileHandle *fh = topfile(L, 1); + if (fh->f != NULL) /* ignore closed files */ aux_close(L); return 0; } @@ -176,8 +187,8 @@ static int io_gc (lua_State *L) { static int io_tostring (lua_State *L) { char buff[128]; - FILE **f = topfile(L, 1); - if (*f == NULL) + FileHandle *fh = topfile(L, 1); + if (fh->f == NULL) strcpy(buff, "closed"); else sprintf(buff, "%p", lua_touserdata(L, 1)); @@ -202,9 +213,10 @@ static int io_popen (lua_State *L) { #else const char *filename = luaL_checkstring(L, 1); const char *mode = luaL_optstring(L, 2, "r"); - FILE **pf = newfile(L); - *pf = popen(filename, mode); - return (*pf == NULL) ? pushresult(L, 0, filename) : 1; + FileHandle *fh = newfileh(L); + fh->f = popen(filename, mode); + fh->ispipe = 1; + return (fh->f == NULL) ? pushresult(L, 0, filename) : 1; #endif } diff --git a/lib/lua/src/lapi.c b/lib/lua/src/lapi.c index 038d5bf..7298b87 100644 --- a/lib/lua/src/lapi.c +++ b/lib/lua/src/lapi.c @@ -1,5 +1,5 @@ /* -** $Id: lapi.c,v 1.4 2004-11-27 21:46:07 pixel Exp $ +** $Id: lapi.c,v 1.5 2007-07-25 16:54:32 pixel Exp $ ** Lua API ** See Copyright Notice in lua.h */ @@ -879,13 +879,13 @@ static const char *aux_upvalue (lua_State *L, int funcindex, int n, if (!ttisfunction(fi)) return NULL; f = clvalue(fi); if (f->c.isC) { - if (n > f->c.nupvalues) return NULL; + if (!(1 <= n && n <= f->c.nupvalues)) return NULL; *val = &f->c.upvalue[n-1]; return ""; } else { Proto *p = f->l.p; - if (n > p->sizeupvalues) return NULL; + if (!(1 <= n && n <= p->sizeupvalues)) return NULL; *val = f->l.upvals[n-1]->v; return getstr(p->upvalues[n-1]); } diff --git a/lib/lua/src/lcode.c b/lib/lua/src/lcode.c index 0b2f6b1..f393e7c 100644 --- a/lib/lua/src/lcode.c +++ b/lib/lua/src/lcode.c @@ -1,5 +1,5 @@ /* -** $Id: lcode.c,v 1.4 2004-11-27 21:46:07 pixel Exp $ +** $Id: lcode.c,v 1.5 2007-07-25 16:54:32 pixel Exp $ ** Code generator for Lua ** See Copyright Notice in lua.h */ @@ -102,7 +102,10 @@ static Instruction *getjumpcontrol (FuncState *fs, int pc) { static int need_value (FuncState *fs, int list, int cond) { for (; list != NO_JUMP; list = luaK_getjump(fs, list)) { Instruction i = *getjumpcontrol(fs, list); - if (GET_OPCODE(i) != OP_TEST || GETARG_C(i) != cond) return 1; + if (GET_OPCODE(i) != OP_TEST || + GETARG_A(i) != NO_REG || + GETARG_C(i) != cond) + return 1; } return 0; /* not found */ } @@ -114,34 +117,33 @@ static void patchtestreg (Instruction *i, int reg) { } -static void luaK_patchlistaux (FuncState *fs, int list, - int ttarget, int treg, int ftarget, int freg, int dtarget) { +static void removevalues (FuncState *fs, int list) { + for (; list != NO_JUMP; list = luaK_getjump(fs, list)) { + Instruction *i = getjumpcontrol(fs, list); + if (GET_OPCODE(*i) == OP_TEST) + patchtestreg(i, NO_REG); + } +} + + +static void luaK_patchlistaux (FuncState *fs, int list, int vtarget, int reg, + int dtarget) { while (list != NO_JUMP) { int next = luaK_getjump(fs, list); Instruction *i = getjumpcontrol(fs, list); - if (GET_OPCODE(*i) != OP_TEST) { - lua_assert(dtarget != NO_JUMP); - luaK_fixjump(fs, list, dtarget); /* jump to default target */ - } - else { - if (GETARG_C(*i)) { - lua_assert(ttarget != NO_JUMP); - patchtestreg(i, treg); - luaK_fixjump(fs, list, ttarget); - } - else { - lua_assert(ftarget != NO_JUMP); - patchtestreg(i, freg); - luaK_fixjump(fs, list, ftarget); - } + if (GET_OPCODE(*i) == OP_TEST && GETARG_A(*i) == NO_REG) { + patchtestreg(i, reg); + luaK_fixjump(fs, list, vtarget); } + else + luaK_fixjump(fs, list, dtarget); /* jump to default target */ list = next; } } static void luaK_dischargejpc (FuncState *fs) { - luaK_patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc, NO_REG, fs->pc); + luaK_patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc); fs->jpc = NO_JUMP; } @@ -151,7 +153,7 @@ void luaK_patchlist (FuncState *fs, int list, int target) { luaK_patchtohere(fs, list); else { lua_assert(target < fs->pc); - luaK_patchlistaux(fs, list, target, NO_REG, target, NO_REG, target); + luaK_patchlistaux(fs, list, target, NO_REG, target); } } @@ -354,8 +356,8 @@ static void luaK_exp2reg (FuncState *fs, expdesc *e, int reg) { luaK_patchtohere(fs, fj); } final = luaK_getlabel(fs); - luaK_patchlistaux(fs, e->f, p_f, NO_REG, final, reg, p_f); - luaK_patchlistaux(fs, e->t, final, reg, p_t, NO_REG, p_t); + luaK_patchlistaux(fs, e->f, final, reg, p_f); + luaK_patchlistaux(fs, e->t, final, reg, p_t); } e->f = e->t = NO_JUMP; e->info = reg; @@ -473,7 +475,7 @@ static int jumponcond (FuncState *fs, expdesc *e, int cond) { Instruction ie = getcode(fs, e); if (GET_OPCODE(ie) == OP_NOT) { fs->pc--; /* remove previous OP_NOT */ - return luaK_condjump(fs, OP_TEST, NO_REG, GETARG_B(ie), !cond); + return luaK_condjump(fs, OP_TEST, GETARG_B(ie), GETARG_B(ie), !cond); } /* else go through */ } @@ -564,6 +566,8 @@ static void codenot (FuncState *fs, expdesc *e) { } /* interchange true and false lists */ { int temp = e->f; e->f = e->t; e->t = temp; } + removevalues(fs, e->f); + removevalues(fs, e->t); } diff --git a/lib/lua/src/lfunc.c b/lib/lua/src/lfunc.c index 7dc41e2..45a60cb 100644 --- a/lib/lua/src/lfunc.c +++ b/lib/lua/src/lfunc.c @@ -1,5 +1,5 @@ /* -** $Id: lfunc.c,v 1.4 2004-11-27 21:46:07 pixel Exp $ +** $Id: lfunc.c,v 1.5 2007-07-25 16:54:32 pixel Exp $ ** Auxiliary functions to manipulate prototypes and closures ** See Copyright Notice in lua.h */ @@ -18,14 +18,6 @@ #include "lstate.h" -#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \ - cast(int, sizeof(TObject)*((n)-1))) - -#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \ - cast(int, sizeof(TObject *)*((n)-1))) - - - Closure *luaF_newCclosure (lua_State *L, int nelems) { Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems))); luaC_link(L, valtogco(c), LUA_TFUNCTION); diff --git a/lib/lua/src/lgc.c b/lib/lua/src/lgc.c index dc939c8..dbc022d 100644 --- a/lib/lua/src/lgc.c +++ b/lib/lua/src/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 1.5 2004-12-27 19:52:23 pixel Exp $ +** $Id: lgc.c,v 1.6 2007-07-25 16:54:32 pixel Exp $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -218,10 +218,8 @@ static void traverseclosure (GCState *st, Closure *cl) { markvalue(st, cl->l.p); for (i=0; i<cl->l.nupvalues; i++) { /* mark its upvalues */ UpVal *u = cl->l.upvals[i]; - if (!u->marked) { - markobject(st, &u->value); - u->marked = 1; - } + markobject(st, u->v); + u->marked = 1; } } } @@ -258,36 +256,45 @@ static void traversestack (GCState *st, lua_State *L1) { } -static void propagatemarks (GCState *st) { +static lu_mem propagatemarks (GCState *st) { + lu_mem mf = 0; while (st->tmark) { /* traverse marked objects */ switch (st->tmark->gch.tt) { case LUA_TTABLE: { Table *h = gcotoh(st->tmark); st->tmark = h->gclist; traversetable(st, h); + mf += sizeof(Table) + sizeof(TObject) * h->sizearray + + sizeof(Node) * sizenode(h); break; } case LUA_TFUNCTION: { Closure *cl = gcotocl(st->tmark); st->tmark = cl->c.gclist; traverseclosure(st, cl); + mf += (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) : + sizeLclosure(cl->l.nupvalues); break; } case LUA_TTHREAD: { lua_State *th = gcototh(st->tmark); st->tmark = th->gclist; traversestack(st, th); + mf += sizeof(lua_State) + sizeof(TObject) * th->stacksize + + sizeof(CallInfo) * th->size_ci; break; } case LUA_TPROTO: { Proto *p = gcotop(st->tmark); st->tmark = p->gclist; traverseproto(st, p); + /* do not need 'mf' for this case (cannot happen inside a udata) */ break; } default: lua_assert(0); } } + return mf; } @@ -368,7 +375,7 @@ static int sweeplist (lua_State *L, GCObject **p, int limit) { GCObject *curr; int count = 0; /* number of collected items */ while ((curr = *p) != NULL) { - if (curr->gch.marked > limit) { + if ((curr->gch.marked & ~(KEYWEAK | VALUEWEAK)) > limit) { unmark(curr); p = &curr->gch.next; } @@ -470,7 +477,7 @@ static size_t mark (lua_State *L) { st.wv = NULL; deadmem = luaC_separateudata(L); /* separate userdata to be preserved */ marktmu(&st); /* mark `preserved' userdata */ - propagatemarks(&st); /* remark, to propagate `preserveness' */ + deadmem += propagatemarks(&st); /* remark, to propagate `preserveness' */ cleartablekeys(wkv); /* `propagatemarks' may resuscitate some weak tables; clear them too */ cleartablekeys(st.wk); diff --git a/lib/lua/src/lvm.c b/lib/lua/src/lvm.c index 5c6620a..5103140 100644 --- a/lib/lua/src/lvm.c +++ b/lib/lua/src/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 1.9 2006-02-09 16:57:30 pixel Exp $ +** $Id: lvm.c,v 1.10 2007-07-25 16:54:32 pixel Exp $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -341,15 +341,15 @@ void luaV_concat (lua_State *L, int total, int last) { luaG_concaterror(L, top-2, top-1); } else if (tsvalue(top-1)->tsv.len > 0) { /* if len=0, do nothing */ /* at least two string values; get as many as possible */ - lu_mem tl = cast(lu_mem, tsvalue(top-1)->tsv.len) + - cast(lu_mem, tsvalue(top-2)->tsv.len); + size_t tl = tsvalue(top-1)->tsv.len; char *buffer; int i; - while (n < total && tostring(L, top-n-1)) { /* collect total length */ - tl += tsvalue(top-n-1)->tsv.len; - n++; + /* collect total length */ + for (n = 1; n < total && tostring(L, top-n-1); n++) { + size_t l = tsvalue(top-n-1)->tsv.len; + if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow"); + tl += l; } - if (tl > MAX_SIZET) luaG_runerror(L, "string size overflow"); buffer = luaZ_openspace(L, &G(L)->buff, tl); tl = 0; for (i=n; i>0; i--) { /* concat all strings */ |