diff -ru lua-4.0/src/lparser.c lua-4.0-local-funcs/src/lparser.c --- lua-4.0/src/lparser.c Fri Oct 27 13:39:52 2000 +++ lua-4.0-local-funcs/src/lparser.c Sun Dec 16 17:38:50 2001 @@ -238,6 +238,8 @@ else if (level != 1) luaX_syntaxerror(ls, "upvalue must be global or local to immediately outer scope", n->str); + else if (v.k == VLOCAL && v.u.index>= fs->prev->stacklevel) + luaX_syntaxerror(ls, "undefined upvalue", n->str); luaK_code1(fs, OP_PUSHUPVALUE, indexupvalue(ls, &v)); } @@ -934,14 +936,20 @@ } -static void localstat (LexState *ls) { +static void localstat (LexState *ls, int line) { /* stat -> LOCAL NAME {',' NAME} ['=' explist1] */ + /* stat -> LOCAL NAME body */ int nvars = 0; int nexps; do { next(ls); /* skip LOCAL or ',' */ new_localvar(ls, str_checkname(ls), nvars++); } while (ls->t.token == ','); + if (nvars == 1 && ls->t.token == '(') { + adjustlocalvars(ls, nvars); + body(ls, 0, line); + return; + } if (optional(ls, '=')) nexps = explist1(ls); else @@ -1049,7 +1057,7 @@ return 0; } case TK_LOCAL: { /* stat -> localstat */ - localstat(ls); + localstat(ls, line); return 0; } case TK_NAME: case '%': { /* stat -> namestat */