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