1 /* $NetBSD: lparser.c,v 1.5 2016/03/25 08:15:20 mbalmer Exp $ */ 2 3 /* 4 ** Id: lparser.c,v 2.149 2015/11/02 16:09:30 roberto Exp 5 ** Lua Parser 6 ** See Copyright Notice in lua.h 7 */ 8 9 #define lparser_c 10 #define LUA_CORE 11 12 #include "lprefix.h" 13 14 15 #ifndef _KERNEL 16 #include <string.h> 17 #endif /* _KERNEL */ 18 19 #include "lua.h" 20 21 #include "lcode.h" 22 #include "ldebug.h" 23 #include "ldo.h" 24 #include "lfunc.h" 25 #include "llex.h" 26 #include "lmem.h" 27 #include "lobject.h" 28 #include "lopcodes.h" 29 #include "lparser.h" 30 #include "lstate.h" 31 #include "lstring.h" 32 #include "ltable.h" 33 34 35 36 /* maximum number of local variables per function (must be smaller 37 than 250, due to the bytecode format) */ 38 #define MAXVARS 200 39 40 41 #define hasmultret(k) ((k) == VCALL || (k) == VVARARG) 42 43 44 /* because all strings are unified by the scanner, the parser 45 can use pointer equality for string equality */ 46 #define eqstr(a,b) ((a) == (b)) 47 48 49 /* 50 ** nodes for block list (list of active blocks) 51 */ 52 typedef struct BlockCnt { 53 struct BlockCnt *previous; /* chain */ 54 int firstlabel; /* index of first label in this block */ 55 int firstgoto; /* index of first pending goto in this block */ 56 lu_byte nactvar; /* # active locals outside the block */ 57 lu_byte upval; /* true if some variable in the block is an upvalue */ 58 lu_byte isloop; /* true if 'block' is a loop */ 59 } BlockCnt; 60 61 62 63 /* 64 ** prototypes for recursive non-terminal functions 65 */ 66 static void statement (LexState *ls); 67 static void expr (LexState *ls, expdesc *v); 68 69 70 /* semantic error */ 71 static l_noret semerror (LexState *ls, const char *msg) { 72 ls->t.token = 0; /* remove "near <token>" from final message */ 73 luaX_syntaxerror(ls, msg); 74 } 75 76 77 static l_noret error_expected (LexState *ls, int token) { 78 luaX_syntaxerror(ls, 79 luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); 80 } 81 82 83 static l_noret errorlimit (FuncState *fs, int limit, const char *what) { 84 lua_State *L = fs->ls->L; 85 const char *msg; 86 int line = fs->f->linedefined; 87 const char *where = (line == 0) 88 ? "main function" 89 : luaO_pushfstring(L, "function at line %d", line); 90 msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s", 91 what, limit, where); 92 luaX_syntaxerror(fs->ls, msg); 93 } 94 95 96 static void checklimit (FuncState *fs, int v, int l, const char *what) { 97 if (v > l) errorlimit(fs, l, what); 98 } 99 100 101 static int testnext (LexState *ls, int c) { 102 if (ls->t.token == c) { 103 luaX_next(ls); 104 return 1; 105 } 106 else return 0; 107 } 108 109 110 static void check (LexState *ls, int c) { 111 if (ls->t.token != c) 112 error_expected(ls, c); 113 } 114 115 116 static void checknext (LexState *ls, int c) { 117 check(ls, c); 118 luaX_next(ls); 119 } 120 121 122 #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } 123 124 125 126 static void check_match (LexState *ls, int what, int who, int where) { 127 if (!testnext(ls, what)) { 128 if (where == ls->linenumber) 129 error_expected(ls, what); 130 else { 131 luaX_syntaxerror(ls, luaO_pushfstring(ls->L, 132 "%s expected (to close %s at line %d)", 133 luaX_token2str(ls, what), luaX_token2str(ls, who), where)); 134 } 135 } 136 } 137 138 139 static TString *str_checkname (LexState *ls) { 140 TString *ts; 141 check(ls, TK_NAME); 142 ts = ls->t.seminfo.ts; 143 luaX_next(ls); 144 return ts; 145 } 146 147 148 static void init_exp (expdesc *e, expkind k, int i) { 149 e->f = e->t = NO_JUMP; 150 e->k = k; 151 e->u.info = i; 152 } 153 154 155 static void codestring (LexState *ls, expdesc *e, TString *s) { 156 init_exp(e, VK, luaK_stringK(ls->fs, s)); 157 } 158 159 160 static void checkname (LexState *ls, expdesc *e) { 161 codestring(ls, e, str_checkname(ls)); 162 } 163 164 165 static int registerlocalvar (LexState *ls, TString *varname) { 166 FuncState *fs = ls->fs; 167 Proto *f = fs->f; 168 int oldsize = f->sizelocvars; 169 luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, 170 LocVar, SHRT_MAX, "local variables"); 171 while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL; 172 f->locvars[fs->nlocvars].varname = varname; 173 luaC_objbarrier(ls->L, f, varname); 174 return fs->nlocvars++; 175 } 176 177 178 static void new_localvar (LexState *ls, TString *name) { 179 FuncState *fs = ls->fs; 180 Dyndata *dyd = ls->dyd; 181 int reg = registerlocalvar(ls, name); 182 checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal, 183 MAXVARS, "local variables"); 184 luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1, 185 dyd->actvar.size, Vardesc, MAX_INT, "local variables"); 186 dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg); 187 } 188 189 190 static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) { 191 new_localvar(ls, luaX_newstring(ls, name, sz)); 192 } 193 194 #define new_localvarliteral(ls,v) \ 195 new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1) 196 197 198 static LocVar *getlocvar (FuncState *fs, int i) { 199 int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx; 200 lua_assert(idx < fs->nlocvars); 201 return &fs->f->locvars[idx]; 202 } 203 204 205 static void adjustlocalvars (LexState *ls, int nvars) { 206 FuncState *fs = ls->fs; 207 fs->nactvar = cast_byte(fs->nactvar + nvars); 208 for (; nvars; nvars--) { 209 getlocvar(fs, fs->nactvar - nvars)->startpc = fs->pc; 210 } 211 } 212 213 214 static void removevars (FuncState *fs, int tolevel) { 215 fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); 216 while (fs->nactvar > tolevel) 217 getlocvar(fs, --fs->nactvar)->endpc = fs->pc; 218 } 219 220 221 static int searchupvalue (FuncState *fs, TString *name) { 222 int i; 223 Upvaldesc *up = fs->f->upvalues; 224 for (i = 0; i < fs->nups; i++) { 225 if (eqstr(up[i].name, name)) return i; 226 } 227 return -1; /* not found */ 228 } 229 230 231 static int newupvalue (FuncState *fs, TString *name, expdesc *v) { 232 Proto *f = fs->f; 233 int oldsize = f->sizeupvalues; 234 checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues"); 235 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, 236 Upvaldesc, MAXUPVAL, "upvalues"); 237 while (oldsize < f->sizeupvalues) f->upvalues[oldsize++].name = NULL; 238 f->upvalues[fs->nups].instack = (v->k == VLOCAL); 239 f->upvalues[fs->nups].idx = cast_byte(v->u.info); 240 f->upvalues[fs->nups].name = name; 241 luaC_objbarrier(fs->ls->L, f, name); 242 return fs->nups++; 243 } 244 245 246 static int searchvar (FuncState *fs, TString *n) { 247 int i; 248 for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) { 249 if (eqstr(n, getlocvar(fs, i)->varname)) 250 return i; 251 } 252 return -1; /* not found */ 253 } 254 255 256 /* 257 Mark block where variable at given level was defined 258 (to emit close instructions later). 259 */ 260 static void markupval (FuncState *fs, int level) { 261 BlockCnt *bl = fs->bl; 262 while (bl->nactvar > level) bl = bl->previous; 263 bl->upval = 1; 264 } 265 266 267 /* 268 Find variable with given name 'n'. If it is an upvalue, add this 269 upvalue into all intermediate functions. 270 */ 271 static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { 272 if (fs == NULL) /* no more levels? */ 273 return VVOID; /* default is global */ 274 else { 275 int v = searchvar(fs, n); /* look up locals at current level */ 276 if (v >= 0) { /* found? */ 277 init_exp(var, VLOCAL, v); /* variable is local */ 278 if (!base) 279 markupval(fs, v); /* local will be used as an upval */ 280 return VLOCAL; 281 } 282 else { /* not found as local at current level; try upvalues */ 283 int idx = searchupvalue(fs, n); /* try existing upvalues */ 284 if (idx < 0) { /* not found? */ 285 if (singlevaraux(fs->prev, n, var, 0) == VVOID) /* try upper levels */ 286 return VVOID; /* not found; is a global */ 287 /* else was LOCAL or UPVAL */ 288 idx = newupvalue(fs, n, var); /* will be a new upvalue */ 289 } 290 init_exp(var, VUPVAL, idx); 291 return VUPVAL; 292 } 293 } 294 } 295 296 297 static void singlevar (LexState *ls, expdesc *var) { 298 TString *varname = str_checkname(ls); 299 FuncState *fs = ls->fs; 300 if (singlevaraux(fs, varname, var, 1) == VVOID) { /* global name? */ 301 expdesc key; 302 singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ 303 lua_assert(var->k == VLOCAL || var->k == VUPVAL); 304 codestring(ls, &key, varname); /* key is variable name */ 305 luaK_indexed(fs, var, &key); /* env[varname] */ 306 } 307 } 308 309 310 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { 311 FuncState *fs = ls->fs; 312 int extra = nvars - nexps; 313 if (hasmultret(e->k)) { 314 extra++; /* includes call itself */ 315 if (extra < 0) extra = 0; 316 luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ 317 if (extra > 1) luaK_reserveregs(fs, extra-1); 318 } 319 else { 320 if (e->k != VVOID) luaK_exp2nextreg(fs, e); /* close last expression */ 321 if (extra > 0) { 322 int reg = fs->freereg; 323 luaK_reserveregs(fs, extra); 324 luaK_nil(fs, reg, extra); 325 } 326 } 327 } 328 329 330 static void enterlevel (LexState *ls) { 331 lua_State *L = ls->L; 332 ++L->nCcalls; 333 checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels"); 334 } 335 336 337 #define leavelevel(ls) ((ls)->L->nCcalls--) 338 339 340 static void closegoto (LexState *ls, int g, Labeldesc *label) { 341 int i; 342 FuncState *fs = ls->fs; 343 Labellist *gl = &ls->dyd->gt; 344 Labeldesc *gt = &gl->arr[g]; 345 lua_assert(eqstr(gt->name, label->name)); 346 if (gt->nactvar < label->nactvar) { 347 TString *vname = getlocvar(fs, gt->nactvar)->varname; 348 const char *msg = luaO_pushfstring(ls->L, 349 "<goto %s> at line %d jumps into the scope of local '%s'", 350 getstr(gt->name), gt->line, getstr(vname)); 351 semerror(ls, msg); 352 } 353 luaK_patchlist(fs, gt->pc, label->pc); 354 /* remove goto from pending list */ 355 for (i = g; i < gl->n - 1; i++) 356 gl->arr[i] = gl->arr[i + 1]; 357 gl->n--; 358 } 359 360 361 /* 362 ** try to close a goto with existing labels; this solves backward jumps 363 */ 364 static int findlabel (LexState *ls, int g) { 365 int i; 366 BlockCnt *bl = ls->fs->bl; 367 Dyndata *dyd = ls->dyd; 368 Labeldesc *gt = &dyd->gt.arr[g]; 369 /* check labels in current block for a match */ 370 for (i = bl->firstlabel; i < dyd->label.n; i++) { 371 Labeldesc *lb = &dyd->label.arr[i]; 372 if (eqstr(lb->name, gt->name)) { /* correct label? */ 373 if (gt->nactvar > lb->nactvar && 374 (bl->upval || dyd->label.n > bl->firstlabel)) 375 luaK_patchclose(ls->fs, gt->pc, lb->nactvar); 376 closegoto(ls, g, lb); /* close it */ 377 return 1; 378 } 379 } 380 return 0; /* label not found; cannot close goto */ 381 } 382 383 384 static int newlabelentry (LexState *ls, Labellist *l, TString *name, 385 int line, int pc) { 386 int n = l->n; 387 luaM_growvector(ls->L, l->arr, n, l->size, 388 Labeldesc, SHRT_MAX, "labels/gotos"); 389 l->arr[n].name = name; 390 l->arr[n].line = line; 391 l->arr[n].nactvar = ls->fs->nactvar; 392 l->arr[n].pc = pc; 393 l->n = n + 1; 394 return n; 395 } 396 397 398 /* 399 ** check whether new label 'lb' matches any pending gotos in current 400 ** block; solves forward jumps 401 */ 402 static void findgotos (LexState *ls, Labeldesc *lb) { 403 Labellist *gl = &ls->dyd->gt; 404 int i = ls->fs->bl->firstgoto; 405 while (i < gl->n) { 406 if (eqstr(gl->arr[i].name, lb->name)) 407 closegoto(ls, i, lb); 408 else 409 i++; 410 } 411 } 412 413 414 /* 415 ** export pending gotos to outer level, to check them against 416 ** outer labels; if the block being exited has upvalues, and 417 ** the goto exits the scope of any variable (which can be the 418 ** upvalue), close those variables being exited. 419 */ 420 static void movegotosout (FuncState *fs, BlockCnt *bl) { 421 int i = bl->firstgoto; 422 Labellist *gl = &fs->ls->dyd->gt; 423 /* correct pending gotos to current block and try to close it 424 with visible labels */ 425 while (i < gl->n) { 426 Labeldesc *gt = &gl->arr[i]; 427 if (gt->nactvar > bl->nactvar) { 428 if (bl->upval) 429 luaK_patchclose(fs, gt->pc, bl->nactvar); 430 gt->nactvar = bl->nactvar; 431 } 432 if (!findlabel(fs->ls, i)) 433 i++; /* move to next one */ 434 } 435 } 436 437 438 static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) { 439 bl->isloop = isloop; 440 bl->nactvar = fs->nactvar; 441 bl->firstlabel = fs->ls->dyd->label.n; 442 bl->firstgoto = fs->ls->dyd->gt.n; 443 bl->upval = 0; 444 bl->previous = fs->bl; 445 fs->bl = bl; 446 lua_assert(fs->freereg == fs->nactvar); 447 } 448 449 450 /* 451 ** create a label named 'break' to resolve break statements 452 */ 453 static void breaklabel (LexState *ls) { 454 TString *n = luaS_new(ls->L, "break"); 455 int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc); 456 findgotos(ls, &ls->dyd->label.arr[l]); 457 } 458 459 /* 460 ** generates an error for an undefined 'goto'; choose appropriate 461 ** message when label name is a reserved word (which can only be 'break') 462 */ 463 static l_noret undefgoto (LexState *ls, Labeldesc *gt) { 464 const char *msg = isreserved(gt->name) 465 ? "<%s> at line %d not inside a loop" 466 : "no visible label '%s' for <goto> at line %d"; 467 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); 468 semerror(ls, msg); 469 } 470 471 472 static void leaveblock (FuncState *fs) { 473 BlockCnt *bl = fs->bl; 474 LexState *ls = fs->ls; 475 if (bl->previous && bl->upval) { 476 /* create a 'jump to here' to close upvalues */ 477 int j = luaK_jump(fs); 478 luaK_patchclose(fs, j, bl->nactvar); 479 luaK_patchtohere(fs, j); 480 } 481 if (bl->isloop) 482 breaklabel(ls); /* close pending breaks */ 483 fs->bl = bl->previous; 484 removevars(fs, bl->nactvar); 485 lua_assert(bl->nactvar == fs->nactvar); 486 fs->freereg = fs->nactvar; /* free registers */ 487 ls->dyd->label.n = bl->firstlabel; /* remove local labels */ 488 if (bl->previous) /* inner block? */ 489 movegotosout(fs, bl); /* update pending gotos to outer block */ 490 else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ 491 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ 492 } 493 494 495 /* 496 ** adds a new prototype into list of prototypes 497 */ 498 static Proto *addprototype (LexState *ls) { 499 Proto *clp; 500 lua_State *L = ls->L; 501 FuncState *fs = ls->fs; 502 Proto *f = fs->f; /* prototype of current function */ 503 if (fs->np >= f->sizep) { 504 int oldsize = f->sizep; 505 luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions"); 506 while (oldsize < f->sizep) f->p[oldsize++] = NULL; 507 } 508 f->p[fs->np++] = clp = luaF_newproto(L); 509 luaC_objbarrier(L, f, clp); 510 return clp; 511 } 512 513 514 /* 515 ** codes instruction to create new closure in parent function. 516 ** The OP_CLOSURE instruction must use the last available register, 517 ** so that, if it invokes the GC, the GC knows which registers 518 ** are in use at that time. 519 */ 520 static void codeclosure (LexState *ls, expdesc *v) { 521 FuncState *fs = ls->fs->prev; 522 init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1)); 523 luaK_exp2nextreg(fs, v); /* fix it at the last register */ 524 } 525 526 527 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { 528 Proto *f; 529 fs->prev = ls->fs; /* linked list of funcstates */ 530 fs->ls = ls; 531 ls->fs = fs; 532 fs->pc = 0; 533 fs->lasttarget = 0; 534 fs->jpc = NO_JUMP; 535 fs->freereg = 0; 536 fs->nk = 0; 537 fs->np = 0; 538 fs->nups = 0; 539 fs->nlocvars = 0; 540 fs->nactvar = 0; 541 fs->firstlocal = ls->dyd->actvar.n; 542 fs->bl = NULL; 543 f = fs->f; 544 f->source = ls->source; 545 f->maxstacksize = 2; /* registers 0/1 are always valid */ 546 enterblock(fs, bl, 0); 547 } 548 549 550 static void close_func (LexState *ls) { 551 lua_State *L = ls->L; 552 FuncState *fs = ls->fs; 553 Proto *f = fs->f; 554 luaK_ret(fs, 0, 0); /* final return */ 555 leaveblock(fs); 556 luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); 557 f->sizecode = fs->pc; 558 luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); 559 f->sizelineinfo = fs->pc; 560 luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); 561 f->sizek = fs->nk; 562 luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); 563 f->sizep = fs->np; 564 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); 565 f->sizelocvars = fs->nlocvars; 566 luaM_reallocvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc); 567 f->sizeupvalues = fs->nups; 568 lua_assert(fs->bl == NULL); 569 ls->fs = fs->prev; 570 luaC_checkGC(L); 571 } 572 573 574 575 /*============================================================*/ 576 /* GRAMMAR RULES */ 577 /*============================================================*/ 578 579 580 /* 581 ** check whether current token is in the follow set of a block. 582 ** 'until' closes syntactical blocks, but do not close scope, 583 ** so it is handled in separate. 584 */ 585 static int block_follow (LexState *ls, int withuntil) { 586 switch (ls->t.token) { 587 case TK_ELSE: case TK_ELSEIF: 588 case TK_END: case TK_EOS: 589 return 1; 590 case TK_UNTIL: return withuntil; 591 default: return 0; 592 } 593 } 594 595 596 static void statlist (LexState *ls) { 597 /* statlist -> { stat [';'] } */ 598 while (!block_follow(ls, 1)) { 599 if (ls->t.token == TK_RETURN) { 600 statement(ls); 601 return; /* 'return' must be last statement */ 602 } 603 statement(ls); 604 } 605 } 606 607 608 static void fieldsel (LexState *ls, expdesc *v) { 609 /* fieldsel -> ['.' | ':'] NAME */ 610 FuncState *fs = ls->fs; 611 expdesc key; 612 luaK_exp2anyregup(fs, v); 613 luaX_next(ls); /* skip the dot or colon */ 614 checkname(ls, &key); 615 luaK_indexed(fs, v, &key); 616 } 617 618 619 static void yindex (LexState *ls, expdesc *v) { 620 /* index -> '[' expr ']' */ 621 luaX_next(ls); /* skip the '[' */ 622 expr(ls, v); 623 luaK_exp2val(ls->fs, v); 624 checknext(ls, ']'); 625 } 626 627 628 /* 629 ** {====================================================================== 630 ** Rules for Constructors 631 ** ======================================================================= 632 */ 633 634 635 struct ConsControl { 636 expdesc v; /* last list item read */ 637 expdesc *t; /* table descriptor */ 638 int nh; /* total number of 'record' elements */ 639 int na; /* total number of array elements */ 640 int tostore; /* number of array elements pending to be stored */ 641 }; 642 643 644 static void recfield (LexState *ls, struct ConsControl *cc) { 645 /* recfield -> (NAME | '['exp1']') = exp1 */ 646 FuncState *fs = ls->fs; 647 int reg = ls->fs->freereg; 648 expdesc key, val; 649 int rkkey; 650 if (ls->t.token == TK_NAME) { 651 checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); 652 checkname(ls, &key); 653 } 654 else /* ls->t.token == '[' */ 655 yindex(ls, &key); 656 cc->nh++; 657 checknext(ls, '='); 658 rkkey = luaK_exp2RK(fs, &key); 659 expr(ls, &val); 660 luaK_codeABC(fs, OP_SETTABLE, cc->t->u.info, rkkey, luaK_exp2RK(fs, &val)); 661 fs->freereg = reg; /* free registers */ 662 } 663 664 665 static void closelistfield (FuncState *fs, struct ConsControl *cc) { 666 if (cc->v.k == VVOID) return; /* there is no list item */ 667 luaK_exp2nextreg(fs, &cc->v); 668 cc->v.k = VVOID; 669 if (cc->tostore == LFIELDS_PER_FLUSH) { 670 luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); /* flush */ 671 cc->tostore = 0; /* no more items pending */ 672 } 673 } 674 675 676 static void lastlistfield (FuncState *fs, struct ConsControl *cc) { 677 if (cc->tostore == 0) return; 678 if (hasmultret(cc->v.k)) { 679 luaK_setmultret(fs, &cc->v); 680 luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET); 681 cc->na--; /* do not count last expression (unknown number of elements) */ 682 } 683 else { 684 if (cc->v.k != VVOID) 685 luaK_exp2nextreg(fs, &cc->v); 686 luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); 687 } 688 } 689 690 691 static void listfield (LexState *ls, struct ConsControl *cc) { 692 /* listfield -> exp */ 693 expr(ls, &cc->v); 694 checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); 695 cc->na++; 696 cc->tostore++; 697 } 698 699 700 static void field (LexState *ls, struct ConsControl *cc) { 701 /* field -> listfield | recfield */ 702 switch(ls->t.token) { 703 case TK_NAME: { /* may be 'listfield' or 'recfield' */ 704 if (luaX_lookahead(ls) != '=') /* expression? */ 705 listfield(ls, cc); 706 else 707 recfield(ls, cc); 708 break; 709 } 710 case '[': { 711 recfield(ls, cc); 712 break; 713 } 714 default: { 715 listfield(ls, cc); 716 break; 717 } 718 } 719 } 720 721 722 static void constructor (LexState *ls, expdesc *t) { 723 /* constructor -> '{' [ field { sep field } [sep] ] '}' 724 sep -> ',' | ';' */ 725 FuncState *fs = ls->fs; 726 int line = ls->linenumber; 727 int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); 728 struct ConsControl cc; 729 cc.na = cc.nh = cc.tostore = 0; 730 cc.t = t; 731 init_exp(t, VRELOCABLE, pc); 732 init_exp(&cc.v, VVOID, 0); /* no value (yet) */ 733 luaK_exp2nextreg(ls->fs, t); /* fix it at stack top */ 734 checknext(ls, '{'); 735 do { 736 lua_assert(cc.v.k == VVOID || cc.tostore > 0); 737 if (ls->t.token == '}') break; 738 closelistfield(fs, &cc); 739 field(ls, &cc); 740 } while (testnext(ls, ',') || testnext(ls, ';')); 741 check_match(ls, '}', '{', line); 742 lastlistfield(fs, &cc); 743 SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ 744 SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */ 745 } 746 747 /* }====================================================================== */ 748 749 750 751 static void parlist (LexState *ls) { 752 /* parlist -> [ param { ',' param } ] */ 753 FuncState *fs = ls->fs; 754 Proto *f = fs->f; 755 int nparams = 0; 756 f->is_vararg = 0; 757 if (ls->t.token != ')') { /* is 'parlist' not empty? */ 758 do { 759 switch (ls->t.token) { 760 case TK_NAME: { /* param -> NAME */ 761 new_localvar(ls, str_checkname(ls)); 762 nparams++; 763 break; 764 } 765 case TK_DOTS: { /* param -> '...' */ 766 luaX_next(ls); 767 f->is_vararg = 2; /* declared vararg */ 768 break; 769 } 770 default: luaX_syntaxerror(ls, "<name> or '...' expected"); 771 } 772 } while (!f->is_vararg && testnext(ls, ',')); 773 } 774 adjustlocalvars(ls, nparams); 775 f->numparams = cast_byte(fs->nactvar); 776 luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ 777 } 778 779 780 static void body (LexState *ls, expdesc *e, int ismethod, int line) { 781 /* body -> '(' parlist ')' block END */ 782 FuncState new_fs; 783 BlockCnt bl; 784 new_fs.f = addprototype(ls); 785 new_fs.f->linedefined = line; 786 open_func(ls, &new_fs, &bl); 787 checknext(ls, '('); 788 if (ismethod) { 789 new_localvarliteral(ls, "self"); /* create 'self' parameter */ 790 adjustlocalvars(ls, 1); 791 } 792 parlist(ls); 793 checknext(ls, ')'); 794 statlist(ls); 795 new_fs.f->lastlinedefined = ls->linenumber; 796 check_match(ls, TK_END, TK_FUNCTION, line); 797 codeclosure(ls, e); 798 close_func(ls); 799 } 800 801 802 static int explist (LexState *ls, expdesc *v) { 803 /* explist -> expr { ',' expr } */ 804 int n = 1; /* at least one expression */ 805 expr(ls, v); 806 while (testnext(ls, ',')) { 807 luaK_exp2nextreg(ls->fs, v); 808 expr(ls, v); 809 n++; 810 } 811 return n; 812 } 813 814 815 static void funcargs (LexState *ls, expdesc *f, int line) { 816 FuncState *fs = ls->fs; 817 expdesc args; 818 int base, nparams; 819 switch (ls->t.token) { 820 case '(': { /* funcargs -> '(' [ explist ] ')' */ 821 luaX_next(ls); 822 if (ls->t.token == ')') /* arg list is empty? */ 823 args.k = VVOID; 824 else { 825 explist(ls, &args); 826 luaK_setmultret(fs, &args); 827 } 828 check_match(ls, ')', '(', line); 829 break; 830 } 831 case '{': { /* funcargs -> constructor */ 832 constructor(ls, &args); 833 break; 834 } 835 case TK_STRING: { /* funcargs -> STRING */ 836 codestring(ls, &args, ls->t.seminfo.ts); 837 luaX_next(ls); /* must use 'seminfo' before 'next' */ 838 break; 839 } 840 default: { 841 luaX_syntaxerror(ls, "function arguments expected"); 842 } 843 } 844 lua_assert(f->k == VNONRELOC); 845 base = f->u.info; /* base register for call */ 846 if (hasmultret(args.k)) 847 nparams = LUA_MULTRET; /* open call */ 848 else { 849 if (args.k != VVOID) 850 luaK_exp2nextreg(fs, &args); /* close last argument */ 851 nparams = fs->freereg - (base+1); 852 } 853 init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); 854 luaK_fixline(fs, line); 855 fs->freereg = base+1; /* call remove function and arguments and leaves 856 (unless changed) one result */ 857 } 858 859 860 861 862 /* 863 ** {====================================================================== 864 ** Expression parsing 865 ** ======================================================================= 866 */ 867 868 869 static void primaryexp (LexState *ls, expdesc *v) { 870 /* primaryexp -> NAME | '(' expr ')' */ 871 switch (ls->t.token) { 872 case '(': { 873 int line = ls->linenumber; 874 luaX_next(ls); 875 expr(ls, v); 876 check_match(ls, ')', '(', line); 877 luaK_dischargevars(ls->fs, v); 878 return; 879 } 880 case TK_NAME: { 881 singlevar(ls, v); 882 return; 883 } 884 default: { 885 luaX_syntaxerror(ls, "unexpected symbol"); 886 } 887 } 888 } 889 890 891 static void suffixedexp (LexState *ls, expdesc *v) { 892 /* suffixedexp -> 893 primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */ 894 FuncState *fs = ls->fs; 895 int line = ls->linenumber; 896 primaryexp(ls, v); 897 for (;;) { 898 switch (ls->t.token) { 899 case '.': { /* fieldsel */ 900 fieldsel(ls, v); 901 break; 902 } 903 case '[': { /* '[' exp1 ']' */ 904 expdesc key; 905 luaK_exp2anyregup(fs, v); 906 yindex(ls, &key); 907 luaK_indexed(fs, v, &key); 908 break; 909 } 910 case ':': { /* ':' NAME funcargs */ 911 expdesc key; 912 luaX_next(ls); 913 checkname(ls, &key); 914 luaK_self(fs, v, &key); 915 funcargs(ls, v, line); 916 break; 917 } 918 case '(': case TK_STRING: case '{': { /* funcargs */ 919 luaK_exp2nextreg(fs, v); 920 funcargs(ls, v, line); 921 break; 922 } 923 default: return; 924 } 925 } 926 } 927 928 929 static void simpleexp (LexState *ls, expdesc *v) { 930 /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... | 931 constructor | FUNCTION body | suffixedexp */ 932 switch (ls->t.token) { 933 #ifndef _KERNEL 934 case TK_FLT: { 935 init_exp(v, VKFLT, 0); 936 v->u.nval = ls->t.seminfo.r; 937 break; 938 } 939 #endif /* _KERNEL */ 940 case TK_INT: { 941 init_exp(v, VKINT, 0); 942 v->u.ival = ls->t.seminfo.i; 943 break; 944 } 945 case TK_STRING: { 946 codestring(ls, v, ls->t.seminfo.ts); 947 break; 948 } 949 case TK_NIL: { 950 init_exp(v, VNIL, 0); 951 break; 952 } 953 case TK_TRUE: { 954 init_exp(v, VTRUE, 0); 955 break; 956 } 957 case TK_FALSE: { 958 init_exp(v, VFALSE, 0); 959 break; 960 } 961 case TK_DOTS: { /* vararg */ 962 FuncState *fs = ls->fs; 963 check_condition(ls, fs->f->is_vararg, 964 "cannot use '...' outside a vararg function"); 965 fs->f->is_vararg = 1; /* function actually uses vararg */ 966 init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0)); 967 break; 968 } 969 case '{': { /* constructor */ 970 constructor(ls, v); 971 return; 972 } 973 case TK_FUNCTION: { 974 luaX_next(ls); 975 body(ls, v, 0, ls->linenumber); 976 return; 977 } 978 default: { 979 suffixedexp(ls, v); 980 return; 981 } 982 } 983 luaX_next(ls); 984 } 985 986 987 static UnOpr getunopr (int op) { 988 switch (op) { 989 case TK_NOT: return OPR_NOT; 990 case '-': return OPR_MINUS; 991 case '~': return OPR_BNOT; 992 case '#': return OPR_LEN; 993 default: return OPR_NOUNOPR; 994 } 995 } 996 997 998 static BinOpr getbinopr (int op) { 999 switch (op) { 1000 case '+': return OPR_ADD; 1001 case '-': return OPR_SUB; 1002 case '*': return OPR_MUL; 1003 case '%': return OPR_MOD; 1004 #ifndef _KERNEL 1005 case '^': return OPR_POW; 1006 case '/': return OPR_DIV; 1007 #else /* _KERNEL */ 1008 case '/': return OPR_IDIV; 1009 #endif /* _KERNEL */ 1010 case TK_IDIV: return OPR_IDIV; 1011 case '&': return OPR_BAND; 1012 case '|': return OPR_BOR; 1013 case '~': return OPR_BXOR; 1014 case TK_SHL: return OPR_SHL; 1015 case TK_SHR: return OPR_SHR; 1016 case TK_CONCAT: return OPR_CONCAT; 1017 case TK_NE: return OPR_NE; 1018 case TK_EQ: return OPR_EQ; 1019 case '<': return OPR_LT; 1020 case TK_LE: return OPR_LE; 1021 case '>': return OPR_GT; 1022 case TK_GE: return OPR_GE; 1023 case TK_AND: return OPR_AND; 1024 case TK_OR: return OPR_OR; 1025 default: return OPR_NOBINOPR; 1026 } 1027 } 1028 1029 1030 static const struct { 1031 lu_byte left; /* left priority for each binary operator */ 1032 lu_byte right; /* right priority */ 1033 } priority[] = { /* ORDER OPR */ 1034 {10, 10}, {10, 10}, /* '+' '-' */ 1035 {11, 11}, {11, 11}, /* '*' '%' */ 1036 #ifndef _KERNEL 1037 {14, 13}, /* '^' (right associative) */ 1038 {11, 11}, {11, 11}, /* '/' '//' */ 1039 #else /* _KERNEL */ 1040 {11, 11}, /* '//' */ 1041 #endif /* _KERNEL */ 1042 {6, 6}, {4, 4}, {5, 5}, /* '&' '|' '~' */ 1043 {7, 7}, {7, 7}, /* '<<' '>>' */ 1044 {9, 8}, /* '..' (right associative) */ 1045 {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */ 1046 {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */ 1047 {2, 2}, {1, 1} /* and, or */ 1048 }; 1049 1050 #define UNARY_PRIORITY 12 /* priority for unary operators */ 1051 1052 1053 /* 1054 ** subexpr -> (simpleexp | unop subexpr) { binop subexpr } 1055 ** where 'binop' is any binary operator with a priority higher than 'limit' 1056 */ 1057 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { 1058 BinOpr op; 1059 UnOpr uop; 1060 enterlevel(ls); 1061 uop = getunopr(ls->t.token); 1062 if (uop != OPR_NOUNOPR) { 1063 int line = ls->linenumber; 1064 luaX_next(ls); 1065 subexpr(ls, v, UNARY_PRIORITY); 1066 luaK_prefix(ls->fs, uop, v, line); 1067 } 1068 else simpleexp(ls, v); 1069 /* expand while operators have priorities higher than 'limit' */ 1070 op = getbinopr(ls->t.token); 1071 while (op != OPR_NOBINOPR && priority[op].left > limit) { 1072 expdesc v2; 1073 BinOpr nextop; 1074 int line = ls->linenumber; 1075 luaX_next(ls); 1076 luaK_infix(ls->fs, op, v); 1077 /* read sub-expression with higher priority */ 1078 nextop = subexpr(ls, &v2, priority[op].right); 1079 luaK_posfix(ls->fs, op, v, &v2, line); 1080 op = nextop; 1081 } 1082 leavelevel(ls); 1083 return op; /* return first untreated operator */ 1084 } 1085 1086 1087 static void expr (LexState *ls, expdesc *v) { 1088 subexpr(ls, v, 0); 1089 } 1090 1091 /* }==================================================================== */ 1092 1093 1094 1095 /* 1096 ** {====================================================================== 1097 ** Rules for Statements 1098 ** ======================================================================= 1099 */ 1100 1101 1102 static void block (LexState *ls) { 1103 /* block -> statlist */ 1104 FuncState *fs = ls->fs; 1105 BlockCnt bl; 1106 enterblock(fs, &bl, 0); 1107 statlist(ls); 1108 leaveblock(fs); 1109 } 1110 1111 1112 /* 1113 ** structure to chain all variables in the left-hand side of an 1114 ** assignment 1115 */ 1116 struct LHS_assign { 1117 struct LHS_assign *prev; 1118 expdesc v; /* variable (global, local, upvalue, or indexed) */ 1119 }; 1120 1121 1122 /* 1123 ** check whether, in an assignment to an upvalue/local variable, the 1124 ** upvalue/local variable is begin used in a previous assignment to a 1125 ** table. If so, save original upvalue/local value in a safe place and 1126 ** use this safe copy in the previous assignment. 1127 */ 1128 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { 1129 FuncState *fs = ls->fs; 1130 int extra = fs->freereg; /* eventual position to save local variable */ 1131 int conflict = 0; 1132 for (; lh; lh = lh->prev) { /* check all previous assignments */ 1133 if (lh->v.k == VINDEXED) { /* assigning to a table? */ 1134 /* table is the upvalue/local being assigned now? */ 1135 if (lh->v.u.ind.vt == v->k && lh->v.u.ind.t == v->u.info) { 1136 conflict = 1; 1137 lh->v.u.ind.vt = VLOCAL; 1138 lh->v.u.ind.t = extra; /* previous assignment will use safe copy */ 1139 } 1140 /* index is the local being assigned? (index cannot be upvalue) */ 1141 if (v->k == VLOCAL && lh->v.u.ind.idx == v->u.info) { 1142 conflict = 1; 1143 lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */ 1144 } 1145 } 1146 } 1147 if (conflict) { 1148 /* copy upvalue/local value to a temporary (in position 'extra') */ 1149 OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; 1150 luaK_codeABC(fs, op, extra, v->u.info, 0); 1151 luaK_reserveregs(fs, 1); 1152 } 1153 } 1154 1155 1156 static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { 1157 expdesc e; 1158 check_condition(ls, vkisvar(lh->v.k), "syntax error"); 1159 if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */ 1160 struct LHS_assign nv; 1161 nv.prev = lh; 1162 suffixedexp(ls, &nv.v); 1163 if (nv.v.k != VINDEXED) 1164 check_conflict(ls, lh, &nv.v); 1165 checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS, 1166 "C levels"); 1167 assignment(ls, &nv, nvars+1); 1168 } 1169 else { /* assignment -> '=' explist */ 1170 int nexps; 1171 checknext(ls, '='); 1172 nexps = explist(ls, &e); 1173 if (nexps != nvars) { 1174 adjust_assign(ls, nvars, nexps, &e); 1175 if (nexps > nvars) 1176 ls->fs->freereg -= nexps - nvars; /* remove extra values */ 1177 } 1178 else { 1179 luaK_setoneret(ls->fs, &e); /* close last expression */ 1180 luaK_storevar(ls->fs, &lh->v, &e); 1181 return; /* avoid default */ 1182 } 1183 } 1184 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ 1185 luaK_storevar(ls->fs, &lh->v, &e); 1186 } 1187 1188 1189 static int cond (LexState *ls) { 1190 /* cond -> exp */ 1191 expdesc v; 1192 expr(ls, &v); /* read condition */ 1193 if (v.k == VNIL) v.k = VFALSE; /* 'falses' are all equal here */ 1194 luaK_goiftrue(ls->fs, &v); 1195 return v.f; 1196 } 1197 1198 1199 static void gotostat (LexState *ls, int pc) { 1200 int line = ls->linenumber; 1201 TString *label; 1202 int g; 1203 if (testnext(ls, TK_GOTO)) 1204 label = str_checkname(ls); 1205 else { 1206 luaX_next(ls); /* skip break */ 1207 label = luaS_new(ls->L, "break"); 1208 } 1209 g = newlabelentry(ls, &ls->dyd->gt, label, line, pc); 1210 findlabel(ls, g); /* close it if label already defined */ 1211 } 1212 1213 1214 /* check for repeated labels on the same block */ 1215 static void checkrepeated (FuncState *fs, Labellist *ll, TString *label) { 1216 int i; 1217 for (i = fs->bl->firstlabel; i < ll->n; i++) { 1218 if (eqstr(label, ll->arr[i].name)) { 1219 const char *msg = luaO_pushfstring(fs->ls->L, 1220 "label '%s' already defined on line %d", 1221 getstr(label), ll->arr[i].line); 1222 semerror(fs->ls, msg); 1223 } 1224 } 1225 } 1226 1227 1228 /* skip no-op statements */ 1229 static void skipnoopstat (LexState *ls) { 1230 while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) 1231 statement(ls); 1232 } 1233 1234 1235 static void labelstat (LexState *ls, TString *label, int line) { 1236 /* label -> '::' NAME '::' */ 1237 FuncState *fs = ls->fs; 1238 Labellist *ll = &ls->dyd->label; 1239 int l; /* index of new label being created */ 1240 checkrepeated(fs, ll, label); /* check for repeated labels */ 1241 checknext(ls, TK_DBCOLON); /* skip double colon */ 1242 /* create new entry for this label */ 1243 l = newlabelentry(ls, ll, label, line, luaK_getlabel(fs)); 1244 skipnoopstat(ls); /* skip other no-op statements */ 1245 if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */ 1246 /* assume that locals are already out of scope */ 1247 ll->arr[l].nactvar = fs->bl->nactvar; 1248 } 1249 findgotos(ls, &ll->arr[l]); 1250 } 1251 1252 1253 static void whilestat (LexState *ls, int line) { 1254 /* whilestat -> WHILE cond DO block END */ 1255 FuncState *fs = ls->fs; 1256 int whileinit; 1257 int condexit; 1258 BlockCnt bl; 1259 luaX_next(ls); /* skip WHILE */ 1260 whileinit = luaK_getlabel(fs); 1261 condexit = cond(ls); 1262 enterblock(fs, &bl, 1); 1263 checknext(ls, TK_DO); 1264 block(ls); 1265 luaK_jumpto(fs, whileinit); 1266 check_match(ls, TK_END, TK_WHILE, line); 1267 leaveblock(fs); 1268 luaK_patchtohere(fs, condexit); /* false conditions finish the loop */ 1269 } 1270 1271 1272 static void repeatstat (LexState *ls, int line) { 1273 /* repeatstat -> REPEAT block UNTIL cond */ 1274 int condexit; 1275 FuncState *fs = ls->fs; 1276 int repeat_init = luaK_getlabel(fs); 1277 BlockCnt bl1, bl2; 1278 enterblock(fs, &bl1, 1); /* loop block */ 1279 enterblock(fs, &bl2, 0); /* scope block */ 1280 luaX_next(ls); /* skip REPEAT */ 1281 statlist(ls); 1282 check_match(ls, TK_UNTIL, TK_REPEAT, line); 1283 condexit = cond(ls); /* read condition (inside scope block) */ 1284 if (bl2.upval) /* upvalues? */ 1285 luaK_patchclose(fs, condexit, bl2.nactvar); 1286 leaveblock(fs); /* finish scope */ 1287 luaK_patchlist(fs, condexit, repeat_init); /* close the loop */ 1288 leaveblock(fs); /* finish loop */ 1289 } 1290 1291 1292 static int exp1 (LexState *ls) { 1293 expdesc e; 1294 int reg; 1295 expr(ls, &e); 1296 luaK_exp2nextreg(ls->fs, &e); 1297 lua_assert(e.k == VNONRELOC); 1298 reg = e.u.info; 1299 return reg; 1300 } 1301 1302 1303 static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { 1304 /* forbody -> DO block */ 1305 BlockCnt bl; 1306 FuncState *fs = ls->fs; 1307 int prep, endfor; 1308 adjustlocalvars(ls, 3); /* control variables */ 1309 checknext(ls, TK_DO); 1310 prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs); 1311 enterblock(fs, &bl, 0); /* scope for declared variables */ 1312 adjustlocalvars(ls, nvars); 1313 luaK_reserveregs(fs, nvars); 1314 block(ls); 1315 leaveblock(fs); /* end of scope for declared variables */ 1316 luaK_patchtohere(fs, prep); 1317 if (isnum) /* numeric for? */ 1318 endfor = luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP); 1319 else { /* generic for */ 1320 luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars); 1321 luaK_fixline(fs, line); 1322 endfor = luaK_codeAsBx(fs, OP_TFORLOOP, base + 2, NO_JUMP); 1323 } 1324 luaK_patchlist(fs, endfor, prep + 1); 1325 luaK_fixline(fs, line); 1326 } 1327 1328 1329 static void fornum (LexState *ls, TString *varname, int line) { 1330 /* fornum -> NAME = exp1,exp1[,exp1] forbody */ 1331 FuncState *fs = ls->fs; 1332 int base = fs->freereg; 1333 new_localvarliteral(ls, "(for index)"); 1334 new_localvarliteral(ls, "(for limit)"); 1335 new_localvarliteral(ls, "(for step)"); 1336 new_localvar(ls, varname); 1337 checknext(ls, '='); 1338 exp1(ls); /* initial value */ 1339 checknext(ls, ','); 1340 exp1(ls); /* limit */ 1341 if (testnext(ls, ',')) 1342 exp1(ls); /* optional step */ 1343 else { /* default step = 1 */ 1344 luaK_codek(fs, fs->freereg, luaK_intK(fs, 1)); 1345 luaK_reserveregs(fs, 1); 1346 } 1347 forbody(ls, base, line, 1, 1); 1348 } 1349 1350 1351 static void forlist (LexState *ls, TString *indexname) { 1352 /* forlist -> NAME {,NAME} IN explist forbody */ 1353 FuncState *fs = ls->fs; 1354 expdesc e; 1355 int nvars = 4; /* gen, state, control, plus at least one declared var */ 1356 int line; 1357 int base = fs->freereg; 1358 /* create control variables */ 1359 new_localvarliteral(ls, "(for generator)"); 1360 new_localvarliteral(ls, "(for state)"); 1361 new_localvarliteral(ls, "(for control)"); 1362 /* create declared variables */ 1363 new_localvar(ls, indexname); 1364 while (testnext(ls, ',')) { 1365 new_localvar(ls, str_checkname(ls)); 1366 nvars++; 1367 } 1368 checknext(ls, TK_IN); 1369 line = ls->linenumber; 1370 adjust_assign(ls, 3, explist(ls, &e), &e); 1371 luaK_checkstack(fs, 3); /* extra space to call generator */ 1372 forbody(ls, base, line, nvars - 3, 0); 1373 } 1374 1375 1376 static void forstat (LexState *ls, int line) { 1377 /* forstat -> FOR (fornum | forlist) END */ 1378 FuncState *fs = ls->fs; 1379 TString *varname; 1380 BlockCnt bl; 1381 enterblock(fs, &bl, 1); /* scope for loop and control variables */ 1382 luaX_next(ls); /* skip 'for' */ 1383 varname = str_checkname(ls); /* first variable name */ 1384 switch (ls->t.token) { 1385 case '=': fornum(ls, varname, line); break; 1386 case ',': case TK_IN: forlist(ls, varname); break; 1387 default: luaX_syntaxerror(ls, "'=' or 'in' expected"); 1388 } 1389 check_match(ls, TK_END, TK_FOR, line); 1390 leaveblock(fs); /* loop scope ('break' jumps to this point) */ 1391 } 1392 1393 1394 static void test_then_block (LexState *ls, int *escapelist) { 1395 /* test_then_block -> [IF | ELSEIF] cond THEN block */ 1396 BlockCnt bl; 1397 FuncState *fs = ls->fs; 1398 expdesc v; 1399 int jf; /* instruction to skip 'then' code (if condition is false) */ 1400 luaX_next(ls); /* skip IF or ELSEIF */ 1401 expr(ls, &v); /* read condition */ 1402 checknext(ls, TK_THEN); 1403 if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) { 1404 luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ 1405 enterblock(fs, &bl, 0); /* must enter block before 'goto' */ 1406 gotostat(ls, v.t); /* handle goto/break */ 1407 skipnoopstat(ls); /* skip other no-op statements */ 1408 if (block_follow(ls, 0)) { /* 'goto' is the entire block? */ 1409 leaveblock(fs); 1410 return; /* and that is it */ 1411 } 1412 else /* must skip over 'then' part if condition is false */ 1413 jf = luaK_jump(fs); 1414 } 1415 else { /* regular case (not goto/break) */ 1416 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ 1417 enterblock(fs, &bl, 0); 1418 jf = v.f; 1419 } 1420 statlist(ls); /* 'then' part */ 1421 leaveblock(fs); 1422 if (ls->t.token == TK_ELSE || 1423 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ 1424 luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */ 1425 luaK_patchtohere(fs, jf); 1426 } 1427 1428 1429 static void ifstat (LexState *ls, int line) { 1430 /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ 1431 FuncState *fs = ls->fs; 1432 int escapelist = NO_JUMP; /* exit list for finished parts */ 1433 test_then_block(ls, &escapelist); /* IF cond THEN block */ 1434 while (ls->t.token == TK_ELSEIF) 1435 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ 1436 if (testnext(ls, TK_ELSE)) 1437 block(ls); /* 'else' part */ 1438 check_match(ls, TK_END, TK_IF, line); 1439 luaK_patchtohere(fs, escapelist); /* patch escape list to 'if' end */ 1440 } 1441 1442 1443 static void localfunc (LexState *ls) { 1444 expdesc b; 1445 FuncState *fs = ls->fs; 1446 new_localvar(ls, str_checkname(ls)); /* new local variable */ 1447 adjustlocalvars(ls, 1); /* enter its scope */ 1448 body(ls, &b, 0, ls->linenumber); /* function created in next register */ 1449 /* debug information will only see the variable after this point! */ 1450 getlocvar(fs, b.u.info)->startpc = fs->pc; 1451 } 1452 1453 1454 static void localstat (LexState *ls) { 1455 /* stat -> LOCAL NAME {',' NAME} ['=' explist] */ 1456 int nvars = 0; 1457 int nexps; 1458 expdesc e; 1459 do { 1460 new_localvar(ls, str_checkname(ls)); 1461 nvars++; 1462 } while (testnext(ls, ',')); 1463 if (testnext(ls, '=')) 1464 nexps = explist(ls, &e); 1465 else { 1466 e.k = VVOID; 1467 nexps = 0; 1468 } 1469 adjust_assign(ls, nvars, nexps, &e); 1470 adjustlocalvars(ls, nvars); 1471 } 1472 1473 1474 static int funcname (LexState *ls, expdesc *v) { 1475 /* funcname -> NAME {fieldsel} [':' NAME] */ 1476 int ismethod = 0; 1477 singlevar(ls, v); 1478 while (ls->t.token == '.') 1479 fieldsel(ls, v); 1480 if (ls->t.token == ':') { 1481 ismethod = 1; 1482 fieldsel(ls, v); 1483 } 1484 return ismethod; 1485 } 1486 1487 1488 static void funcstat (LexState *ls, int line) { 1489 /* funcstat -> FUNCTION funcname body */ 1490 int ismethod; 1491 expdesc v, b; 1492 luaX_next(ls); /* skip FUNCTION */ 1493 ismethod = funcname(ls, &v); 1494 body(ls, &b, ismethod, line); 1495 luaK_storevar(ls->fs, &v, &b); 1496 luaK_fixline(ls->fs, line); /* definition "happens" in the first line */ 1497 } 1498 1499 1500 static void exprstat (LexState *ls) { 1501 /* stat -> func | assignment */ 1502 FuncState *fs = ls->fs; 1503 struct LHS_assign v; 1504 suffixedexp(ls, &v.v); 1505 if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ 1506 v.prev = NULL; 1507 assignment(ls, &v, 1); 1508 } 1509 else { /* stat -> func */ 1510 check_condition(ls, v.v.k == VCALL, "syntax error"); 1511 SETARG_C(getcode(fs, &v.v), 1); /* call statement uses no results */ 1512 } 1513 } 1514 1515 1516 static void retstat (LexState *ls) { 1517 /* stat -> RETURN [explist] [';'] */ 1518 FuncState *fs = ls->fs; 1519 expdesc e; 1520 int first, nret; /* registers with returned values */ 1521 if (block_follow(ls, 1) || ls->t.token == ';') 1522 first = nret = 0; /* return no values */ 1523 else { 1524 nret = explist(ls, &e); /* optional return values */ 1525 if (hasmultret(e.k)) { 1526 luaK_setmultret(fs, &e); 1527 if (e.k == VCALL && nret == 1) { /* tail call? */ 1528 SET_OPCODE(getcode(fs,&e), OP_TAILCALL); 1529 lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar); 1530 } 1531 first = fs->nactvar; 1532 nret = LUA_MULTRET; /* return all values */ 1533 } 1534 else { 1535 if (nret == 1) /* only one single value? */ 1536 first = luaK_exp2anyreg(fs, &e); 1537 else { 1538 luaK_exp2nextreg(fs, &e); /* values must go to the stack */ 1539 first = fs->nactvar; /* return all active values */ 1540 lua_assert(nret == fs->freereg - first); 1541 } 1542 } 1543 } 1544 luaK_ret(fs, first, nret); 1545 testnext(ls, ';'); /* skip optional semicolon */ 1546 } 1547 1548 1549 static void statement (LexState *ls) { 1550 int line = ls->linenumber; /* may be needed for error messages */ 1551 enterlevel(ls); 1552 switch (ls->t.token) { 1553 case ';': { /* stat -> ';' (empty statement) */ 1554 luaX_next(ls); /* skip ';' */ 1555 break; 1556 } 1557 case TK_IF: { /* stat -> ifstat */ 1558 ifstat(ls, line); 1559 break; 1560 } 1561 case TK_WHILE: { /* stat -> whilestat */ 1562 whilestat(ls, line); 1563 break; 1564 } 1565 case TK_DO: { /* stat -> DO block END */ 1566 luaX_next(ls); /* skip DO */ 1567 block(ls); 1568 check_match(ls, TK_END, TK_DO, line); 1569 break; 1570 } 1571 case TK_FOR: { /* stat -> forstat */ 1572 forstat(ls, line); 1573 break; 1574 } 1575 case TK_REPEAT: { /* stat -> repeatstat */ 1576 repeatstat(ls, line); 1577 break; 1578 } 1579 case TK_FUNCTION: { /* stat -> funcstat */ 1580 funcstat(ls, line); 1581 break; 1582 } 1583 case TK_LOCAL: { /* stat -> localstat */ 1584 luaX_next(ls); /* skip LOCAL */ 1585 if (testnext(ls, TK_FUNCTION)) /* local function? */ 1586 localfunc(ls); 1587 else 1588 localstat(ls); 1589 break; 1590 } 1591 case TK_DBCOLON: { /* stat -> label */ 1592 luaX_next(ls); /* skip double colon */ 1593 labelstat(ls, str_checkname(ls), line); 1594 break; 1595 } 1596 case TK_RETURN: { /* stat -> retstat */ 1597 luaX_next(ls); /* skip RETURN */ 1598 retstat(ls); 1599 break; 1600 } 1601 case TK_BREAK: /* stat -> breakstat */ 1602 case TK_GOTO: { /* stat -> 'goto' NAME */ 1603 gotostat(ls, luaK_jump(ls->fs)); 1604 break; 1605 } 1606 default: { /* stat -> func | assignment */ 1607 exprstat(ls); 1608 break; 1609 } 1610 } 1611 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && 1612 ls->fs->freereg >= ls->fs->nactvar); 1613 ls->fs->freereg = ls->fs->nactvar; /* free registers */ 1614 leavelevel(ls); 1615 } 1616 1617 /* }====================================================================== */ 1618 1619 1620 /* 1621 ** compiles the main function, which is a regular vararg function with an 1622 ** upvalue named LUA_ENV 1623 */ 1624 static void mainfunc (LexState *ls, FuncState *fs) { 1625 BlockCnt bl; 1626 expdesc v; 1627 open_func(ls, fs, &bl); 1628 fs->f->is_vararg = 2; /* main function is always declared vararg */ 1629 init_exp(&v, VLOCAL, 0); /* create and... */ 1630 newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ 1631 luaX_next(ls); /* read first token */ 1632 statlist(ls); /* parse main body */ 1633 check(ls, TK_EOS); 1634 close_func(ls); 1635 } 1636 1637 1638 LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, 1639 Dyndata *dyd, const char *name, int firstchar) { 1640 LexState lexstate; 1641 FuncState funcstate; 1642 LClosure *cl = luaF_newLclosure(L, 1); /* create main closure */ 1643 setclLvalue(L, L->top, cl); /* anchor it (to avoid being collected) */ 1644 luaD_inctop(L); 1645 lexstate.h = luaH_new(L); /* create table for scanner */ 1646 sethvalue(L, L->top, lexstate.h); /* anchor it */ 1647 luaD_inctop(L); 1648 funcstate.f = cl->p = luaF_newproto(L); 1649 funcstate.f->source = luaS_new(L, name); /* create and anchor TString */ 1650 lua_assert(iswhite(funcstate.f)); /* do not need barrier here */ 1651 lexstate.buff = buff; 1652 lexstate.dyd = dyd; 1653 dyd->actvar.n = dyd->gt.n = dyd->label.n = 0; 1654 luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar); 1655 mainfunc(&lexstate, &funcstate); 1656 lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs); 1657 /* all scopes should be correctly finished */ 1658 lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0); 1659 L->top--; /* remove scanner's table */ 1660 return cl; /* closure is on the stack, too */ 1661 } 1662 1663