| 496 | |
| 497 | |
| 498 | static void constructor (LexState *ls, expdesc *t) { |
| 499 | /* constructor -> ?? */ |
| 500 | FuncState *fs = ls->fs; |
| 501 | int line = ls->linenumber; |
| 502 | int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); |
| 503 | struct ConsControl cc; |
| 504 | cc.na = cc.nh = cc.tostore = 0; |
| 505 | cc.t = t; |
| 506 | init_exp(t, VRELOCABLE, pc); |
| 507 | init_exp(&cc.v, VVOID, 0); /* no value (yet) */ |
| 508 | luaK_exp2nextreg(ls->fs, t); /* fix it at stack top (for gc) */ |
| 509 | checknext(ls, '{'); |
| 510 | do { |
| 511 | lua_assert(cc.v.k == VVOID || cc.tostore > 0); |
| 512 | if (ls->t.token == '}') break; |
| 513 | closelistfield(fs, &cc); |
| 514 | switch(ls->t.token) { |
| 515 | case TK_NAME: { /* may be listfields or recfields */ |
| 516 | luaX_lookahead(ls); |
| 517 | if (ls->lookahead.token != '=') /* expression? */ |
| 518 | listfield(ls, &cc); |
| 519 | else |
| 520 | recfield(ls, &cc); |
| 521 | break; |
| 522 | } |
| 523 | case '[': { /* constructor_item -> recfield */ |
| 524 | recfield(ls, &cc); |
| 525 | break; |
| 526 | } |
| 527 | default: { /* constructor_part -> listfield */ |
| 528 | listfield(ls, &cc); |
| 529 | break; |
| 530 | } |
| 531 | } |
| 532 | } while (testnext(ls, ',') || testnext(ls, ';')); |
| 533 | check_match(ls, '}', '{', line); |
| 534 | lastlistfield(fs, &cc); |
| 535 | SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ |
| 536 | SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */ |
| 537 | } |
| 538 | |
| 539 | /* }====================================================================== */ |
| 540 |
no test coverage detected