--- lparser.c.old 2004-07-11 18:46:50.000000000 +0100 +++ lparser.c 2004-07-11 20:17:53.000000000 +0100 @@ -44,6 +44,11 @@ int isbreakable; /* true if `block' is a loop */ } BlockCnt; +/* +** prototype for the body() function +*/ +static void body (LexState *ls, expdesc *e, int needself, int line); + /* @@ -425,6 +430,7 @@ static void recfield (LexState *ls, struct ConsControl *cc) { /* recfield -> (NAME | `['exp1`]') = exp1 */ + /* recfield -> function funcname body */ FuncState *fs = ls->fs; int reg = ls->fs->freereg; expdesc key, val; @@ -433,6 +439,22 @@ cc->nh++; checkname(ls, &key); } + else if (ls->t.token == TK_FUNCTION) { + int line = ls->linenumber; + int needsself = 0; + next(ls); + if( ls->t.token == ':' ) { + needsself = 1; + next(ls); + } + checkname(ls, &key); + luaK_exp2RK(fs, &key); + body(ls, &val, needsself, line); + luaK_codeABC(fs, OP_SETTABLE, cc->t->info, luaK_exp2RK(fs, &key), + luaK_exp2RK(fs, &val)); + fs->freereg = reg; /* free registers */ + return; + } else /* ls->t.token == '[' */ luaY_index(ls, &key); check(ls, '='); @@ -493,13 +515,17 @@ check(ls, '{'); do { lua_assert(cc.v.k == VVOID || cc.tostore > 0); + while( ls->t.token == ',' || ls->t.token == ';' ) { + next(ls); + } testnext(ls, ';'); /* compatibility only */ if (ls->t.token == '}') break; closelistfield(fs, &cc); switch(ls->t.token) { + case TK_FUNCTION: case TK_NAME: { /* may be listfields or recfields */ lookahead(ls); - if (ls->lookahead.token != '=') /* expression? */ + if (ls->lookahead.token != '=' && ls->t.token == TK_NAME) /* expression? */ listfield(ls, &cc); else recfield(ls, &cc); @@ -514,7 +540,7 @@ break; } } - } while (testnext(ls, ',') || testnext(ls, ';')); + } while (ls->t.token != '}'); check_match(ls, '}', '{', line); lastlistfield(fs, &cc); SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ @@ -736,8 +762,13 @@ break; } case TK_FUNCTION: { + int needself = 0; next(ls); - body(ls, v, 0, ls->linenumber); + if( ls->t.token == ':' ) { + next(ls); + needself = 1; + } + body(ls, v, needself, ls->linenumber); break; } default: {