diff -r lua-5.0.2/COPYRIGHT lua-5.0.3/COPYRIGHT
12c12
< Copyright (C) 2003-2004 Tecgraf, PUC-Rio.
---
> Copyright (C) 2003-2006 Tecgraf, PUC-Rio.
diff -r lua-5.0.2/include/lua.h lua-5.0.3/include/lua.h
2c2
< ** $Id: lua.h,v 1.175b 2003/03/18 12:31:39 roberto Exp $
---
> ** $Id: lua.h,v 1.175c 2003/03/18 12:31:39 roberto Exp $
17,18c17,18
< #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"
368c368
< * Copyright (C) 1994-2004 Tecgraf, PUC-Rio.  All rights reserved.
---
> * Copyright (C) 1994-2006 Tecgraf, PUC-Rio.  All rights reserved.
diff -r lua-5.0.2/src/lapi.c lua-5.0.3/src/lapi.c
2c2
< ** $Id: lapi.c,v 1.235 2003/04/07 14:36:08 roberto Exp $
---
> ** $Id: lapi.c,v 1.235a 2003/04/07 14:36:08 roberto Exp $
882c882
<     if (n > f->c.nupvalues) return NULL;
---
>     if (!(1 <= n && n <= f->c.nupvalues)) return NULL;
888c888
<     if (n > p->sizeupvalues) return NULL;
---
>     if (!(1 <= n && n <= p->sizeupvalues)) return NULL;
diff -r lua-5.0.2/src/lcode.c lua-5.0.3/src/lcode.c
2c2
< ** $Id: lcode.c,v 1.117 2003/04/03 13:35:34 roberto Exp $
---
> ** $Id: lcode.c,v 1.117a 2003/04/03 13:35:34 roberto Exp $
105c105,108
<     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;
117,118c120,130
< 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) {
122,136c134,136
<     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);
137a138,139
>     else
>       luaK_fixjump(fs, list, dtarget);  /* jump to default target */
144c146
<   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);
154c156
<     luaK_patchlistaux(fs, list, target, NO_REG, target, NO_REG, target);
---
>     luaK_patchlistaux(fs, list, target, NO_REG, target);
357,358c359,360
<     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);
476c478
<       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);
566a569,570
>   removevalues(fs, e->f);
>   removevalues(fs, e->t);
diff -r lua-5.0.2/src/lfunc.c lua-5.0.3/src/lfunc.c
2c2
< ** $Id: lfunc.c,v 1.67 2003/03/18 12:50:04 roberto Exp $
---
> ** $Id: lfunc.c,v 1.67a 2003/03/18 12:50:04 roberto Exp $
19,26d18
< 
< 
< #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)))
< 
diff -r lua-5.0.2/src/lfunc.h lua-5.0.3/src/lfunc.h
2c2
< ** $Id: lfunc.h,v 1.21 2003/03/18 12:50:04 roberto Exp $
---
> ** $Id: lfunc.h,v 1.21a 2003/03/18 12:50:04 roberto Exp $
11a12,18
> 
> 
> #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)))
diff -r lua-5.0.2/src/lgc.c lua-5.0.3/src/lgc.c
2c2
< ** $Id: lgc.c,v 1.171a 2003/04/03 13:35:34 roberto Exp $
---
> ** $Id: lgc.c,v 1.171b 2003/04/03 13:35:34 roberto Exp $
221,224c221,222
<       if (!u->marked) {
<         markobject(st, &u->value);
<         u->marked = 1;
<       }
---
>       markobject(st, u->v);
>       u->marked = 1;
261c259,260
< static void propagatemarks (GCState *st) {
---
> static lu_mem propagatemarks (GCState *st) {
>   lu_mem mf = 0;
267a267,268
>         mf += sizeof(Table) + sizeof(TObject) * h->sizearray +
>                               sizeof(Node) * sizenode(h);
273a275,276
>         mf += (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) :
>                             sizeLclosure(cl->l.nupvalues);
279a283,284
>         mf += sizeof(lua_State) + sizeof(TObject) * th->stacksize +
>                                   sizeof(CallInfo) * th->size_ci;
285a291
>         /* do not need 'mf' for this case (cannot happen inside a udata) */
290a297
>   return mf;
371c378
<     if (curr->gch.marked > limit) {
---
>     if ((curr->gch.marked & ~(KEYWEAK | VALUEWEAK)) > limit) {
473c480
<   propagatemarks(&st);  /* remark, to propagate `preserveness' */
---
>   deadmem += propagatemarks(&st);  /* remark, to propagate `preserveness' */
diff -r lua-5.0.2/src/lib/lbaselib.c lua-5.0.3/src/lib/lbaselib.c
2c2
< ** $Id: lbaselib.c,v 1.130b 2003/04/03 13:35:34 roberto Exp $
---
> ** $Id: lbaselib.c,v 1.130c 2003/04/03 13:35:34 roberto Exp $
175a176
>   lua_settop(L, 2);
183a185
>   lua_settop(L, 3);
diff -r lua-5.0.2/src/lib/liolib.c lua-5.0.3/src/lib/liolib.c
2c2
< ** $Id: liolib.c,v 2.39a 2003/03/19 21:16:12 roberto Exp $
---
> ** $Id: liolib.c,v 2.39b 2003/03/19 21:16:12 roberto Exp $
22a23,28
> typedef struct FileHandle {
>   FILE *f;
>   int ispipe;
> } FileHandle;
> 
> 
89,92c95,98
< 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;
97,99c103,105
<   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)
107,109c113,117
< 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)
111c119
<   return *f;
---
>   return fh;
115a124,125
> #define newfile(L)	(&(newfileh(L)->f))
> 
121,123c131,134
< 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;
126c137
<   return pf;
---
>   return fh;
148c159,160
<   FILE *f = tofile(L, 1);
---
>   FileHandle *fh = tofileh(L, 1);
>   FILE *f = fh->f;
152,154c164,165
<     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 */
170,171c181,182
<   FILE **f = topfile(L, 1);
<   if (*f != NULL)  /* ignore closed files */
---
>   FileHandle *fh = topfile(L, 1);
>   if (fh->f != NULL)  /* ignore closed files */
179,180c190,191
<   FILE **f = topfile(L, 1);
<   if (*f == NULL)
---
>   FileHandle *fh = topfile(L, 1);
>   if (fh->f == NULL)
205,207c216,219
<   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;
diff -r lua-5.0.2/src/lvm.c lua-5.0.3/src/lvm.c
2c2
< ** $Id: lvm.c,v 1.284b 2003/04/03 13:35:34 roberto Exp $
---
> ** $Id: lvm.c,v 1.284c 2003/04/03 13:35:34 roberto Exp $
324,325c324
<       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;
328,330c327,331
<       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;
332d332
<       if (tl > MAX_SIZET) luaG_runerror(L, "string size overflow");
