diff -urN /Users/bpalmer/Programming/lua-5.1.2/src/lparser.c ./src/lparser.c --- /Users/bpalmer/Programming/lua-5.1.2/src/lparser.c 2007-03-23 11:06:30.000000000 -0600 +++ ./src/lparser.c 2007-06-10 10:51:01.000000000 -0600 @@ -592,6 +592,27 @@ pushclosure(ls, &new_fs, e); } +static void body_lambda (LexState *ls, expdesc *e, int line) { + /* body_lambda -> (`(' parlist `)' |) chunk ] */ + /* omitting the `(` parlist `)` implies a vararg function */ + FuncState new_fs; + open_func(ls, &new_fs); + new_fs.f->linedefined = line; + if (testnext(ls, '(')) { + parlist(ls); + checknext(ls, ')'); + } else { + /* implied vararg */ + new_fs.f->is_vararg |= VARARG_ISVARARG; + new_fs.f->numparams = cast_byte(new_fs.nactvar - (new_fs.f->is_vararg & VARARG_HASARG)); + luaK_reserveregs(&new_fs, new_fs.nactvar); /* reserve register for parameters */ + } + chunk(ls); + new_fs.f->lastlinedefined = ls->linenumber; + check_match(ls, ']', '[', line); + close_func(ls); + pushclosure(ls, &new_fs, e); +} static int explist1 (LexState *ls, expdesc *v) { /* explist1 -> expr { `,' expr } */ @@ -761,6 +782,11 @@ constructor(ls, v); return; } + case '[': { + luaX_next(ls); + body_lambda(ls, v, ls->linenumber); + return; + } case TK_FUNCTION: { luaX_next(ls); body(ls, v, 0, ls->linenumber); @@ -871,7 +897,7 @@ static int block_follow (int token) { switch (token) { case TK_ELSE: case TK_ELSEIF: case TK_END: - case TK_UNTIL: case TK_EOS: + case TK_UNTIL: case TK_EOS: case ']': return 1; default: return 0; } @@ -1130,7 +1156,7 @@ int condexit; luaX_next(ls); /* skip IF or ELSEIF */ condexit = cond(ls); - checknext(ls, TK_THEN); + testnext(ls, TK_THEN); /* THEN is optional */ block(ls); /* `then' part */ return condexit; } @@ -1303,7 +1329,7 @@ localstat(ls); return 0; } - case TK_RETURN: { /* stat -> retstat */ + case TK_RETURN: case '|': { /* stat -> retstat */ retstat(ls); return 1; /* must be last statement */ }