aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c154
1 files changed, 78 insertions, 76 deletions
diff --git a/lvm.c b/lvm.c
index b8ac9ec8..e10763d6 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.287 2003/05/14 12:09:12 roberto Exp roberto $ 2** $Id: lvm.c,v 1.288 2003/07/07 13:37:56 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -64,8 +64,11 @@ int luaV_tostring (lua_State *L, StkId obj) {
64} 64}
65 65
66 66
67static void traceexec (lua_State *L) { 67static void traceexec (lua_State *L, const Instruction *pc) {
68 lu_byte mask = L->hookmask; 68 lu_byte mask = L->hookmask;
69 CallInfo *ci = L->ci;
70 const Instruction *oldpc = ci->u.l.savedpc;
71 ci->u.l.savedpc = pc;
69 if (mask > LUA_MASKLINE) { /* instruction-hook set? */ 72 if (mask > LUA_MASKLINE) { /* instruction-hook set? */
70 if (L->hookcount == 0) { 73 if (L->hookcount == 0) {
71 resethookcount(L); 74 resethookcount(L);
@@ -74,25 +77,13 @@ static void traceexec (lua_State *L) {
74 } 77 }
75 } 78 }
76 if (mask & LUA_MASKLINE) { 79 if (mask & LUA_MASKLINE) {
77 CallInfo *ci = L->ci;
78 Proto *p = ci_func(ci)->l.p; 80 Proto *p = ci_func(ci)->l.p;
79 int pc = pcRel(*ci->u.l.pc, p); 81 int npc = pcRel(pc, p);
80 int newline = getline(p, pc); 82 int newline = getline(p, npc);
81 if (!L->hookinit) { 83 /* call linehook when enter a new function, when jump back (loop),
82 luaG_inithooks(L); 84 or when enter a new line */
83 if (pc != 0) /* not function start? */ 85 if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p)))
84 return; /* begin tracing on next line */
85 }
86 lua_assert(ci->state & CI_HASFRAME);
87 if (pc == 0) /* function may be starting now? */
88 ci->u.l.savedpc = *ci->u.l.pc; /* initialize `savedpc' */
89 /* calls linehook when enters a new line or jumps back (loop) */
90 if (*ci->u.l.pc <= ci->u.l.savedpc ||
91 newline != getline(p, pcRel(ci->u.l.savedpc, p))) {
92 luaD_callhook(L, LUA_HOOKLINE, newline); 86 luaD_callhook(L, LUA_HOOKLINE, newline);
93 ci = L->ci; /* previous call may reallocate `ci' */
94 }
95 ci->u.l.savedpc = *ci->u.l.pc;
96 } 87 }
97} 88}
98 89
@@ -327,10 +318,11 @@ void luaV_concat (lua_State *L, int total, int last) {
327} 318}
328 319
329 320
330static void Arith (lua_State *L, StkId ra, 321static StkId Arith (lua_State *L, StkId ra, const TObject *rb,
331 const TObject *rb, const TObject *rc, TMS op) { 322 const TObject *rc, TMS op, const Instruction *pc) {
332 TObject tempb, tempc; 323 TObject tempb, tempc;
333 const TObject *b, *c; 324 const TObject *b, *c;
325 L->ci->u.l.savedpc = pc;
334 if ((b = luaV_tonumber(rb, &tempb)) != NULL && 326 if ((b = luaV_tonumber(rb, &tempb)) != NULL &&
335 (c = luaV_tonumber(rc, &tempc)) != NULL) { 327 (c = luaV_tonumber(rc, &tempc)) != NULL) {
336 switch (op) { 328 switch (op) {
@@ -350,6 +342,7 @@ static void Arith (lua_State *L, StkId ra,
350 } 342 }
351 else if (!call_binTM(L, rb, rc, ra, op)) 343 else if (!call_binTM(L, rb, rc, ra, op))
352 luaG_aritherror(L, rb, rc); 344 luaG_aritherror(L, rb, rc);
345 return L->base;
353} 346}
354 347
355 348
@@ -362,7 +355,6 @@ static void Arith (lua_State *L, StkId ra,
362 355
363#define RA(i) (base+GETARG_A(i)) 356#define RA(i) (base+GETARG_A(i))
364/* to be used after possible stack reallocation */ 357/* to be used after possible stack reallocation */
365#define XRA(i) (L->base+GETARG_A(i))
366#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) 358#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))
367#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) 359#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))
368#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ 360#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \
@@ -375,39 +367,35 @@ static void Arith (lua_State *L, StkId ra,
375#define dojump(pc, i) ((pc) += (i)) 367#define dojump(pc, i) ((pc) += (i))
376 368
377 369
378StkId luaV_execute (lua_State *L) { 370StkId luaV_execute (lua_State *L, int nexeccalls) {
379 LClosure *cl; 371 LClosure *cl;
380 TObject *k; 372 TObject *k;
373 StkId base;
381 const Instruction *pc; 374 const Instruction *pc;
382 callentry: /* entry point when calling new functions */ 375 callentry: /* entry point when calling new functions */
383 L->ci->u.l.pc = &pc;
384 if (L->hookmask & LUA_MASKCALL) 376 if (L->hookmask & LUA_MASKCALL)
385 luaD_callhook(L, LUA_HOOKCALL, -1); 377 luaD_callhook(L, LUA_HOOKCALL, -1);
386 retentry: /* entry point when returning to old functions */ 378 retentry: /* entry point when returning to old functions */
387 lua_assert(L->ci->state == CI_SAVEDPC ||
388 L->ci->state == (CI_SAVEDPC | CI_CALLING));
389 L->ci->state = CI_HASFRAME; /* activate frame */
390 pc = L->ci->u.l.savedpc; 379 pc = L->ci->u.l.savedpc;
391 cl = &clvalue(L->base - 1)->l; 380 base = L->base;
381 cl = &clvalue(base - 1)->l;
392 k = cl->p->k; 382 k = cl->p->k;
393 /* main loop of interpreter */ 383 /* main loop of interpreter */
394 for (;;) { 384 for (;;) {
395 const Instruction i = *pc++; 385 const Instruction i = *pc++;
396 StkId base, ra; 386 StkId ra;
397 if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && 387 if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&
398 (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { 388 (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {
399 traceexec(L); 389 traceexec(L, pc); /***/
400 if (L->ci->state & CI_YIELD) { /* did hook yield? */ 390 if (L->isSuspended) { /* did hook yield? */
401 L->ci->u.l.savedpc = pc - 1; 391 L->ci->u.l.savedpc = pc - 1;
402 L->ci->state = CI_YIELD | CI_SAVEDPC;
403 return NULL; 392 return NULL;
404 } 393 }
394 base = L->base;
405 } 395 }
406 /* warning!! several calls may realloc the stack and invalidate `ra' */ 396 /* warning!! several calls may realloc the stack and invalidate `ra' */
407 base = L->base;
408 ra = RA(i); 397 ra = RA(i);
409 lua_assert(L->ci->state & CI_HASFRAME); 398 lua_assert(base == L->ci->base && base == L->base);
410 lua_assert(base == L->ci->base);
411 lua_assert(L->top <= L->stack + L->stacksize && L->top >= base); 399 lua_assert(L->top <= L->stack + L->stacksize && L->top >= base);
412 lua_assert(L->top == L->ci->top || 400 lua_assert(L->top == L->ci->top ||
413 GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL || 401 GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
@@ -441,16 +429,22 @@ StkId luaV_execute (lua_State *L) {
441 case OP_GETGLOBAL: { 429 case OP_GETGLOBAL: {
442 TObject *rb = KBx(i); 430 TObject *rb = KBx(i);
443 lua_assert(ttisstring(rb) && ttistable(&cl->g)); 431 lua_assert(ttisstring(rb) && ttistable(&cl->g));
444 luaV_gettable(L, &cl->g, rb, ra); 432 L->ci->u.l.savedpc = pc;
433 luaV_gettable(L, &cl->g, rb, ra); /***/
434 base = L->base;
445 break; 435 break;
446 } 436 }
447 case OP_GETTABLE: { 437 case OP_GETTABLE: {
448 luaV_gettable(L, RB(i), RKC(i), ra); 438 L->ci->u.l.savedpc = pc;
439 luaV_gettable(L, RB(i), RKC(i), ra); /***/
440 base = L->base;
449 break; 441 break;
450 } 442 }
451 case OP_SETGLOBAL: { 443 case OP_SETGLOBAL: {
452 lua_assert(ttisstring(KBx(i)) && ttistable(&cl->g)); 444 lua_assert(ttisstring(KBx(i)) && ttistable(&cl->g));
453 luaV_settable(L, &cl->g, KBx(i), ra); 445 L->ci->u.l.savedpc = pc;
446 luaV_settable(L, &cl->g, KBx(i), ra); /***/
447 base = L->base;
454 break; 448 break;
455 } 449 }
456 case OP_SETUPVAL: { 450 case OP_SETUPVAL: {
@@ -459,20 +453,26 @@ StkId luaV_execute (lua_State *L) {
459 break; 453 break;
460 } 454 }
461 case OP_SETTABLE: { 455 case OP_SETTABLE: {
462 luaV_settable(L, ra, RKB(i), RKC(i)); 456 L->ci->u.l.savedpc = pc;
457 luaV_settable(L, ra, RKB(i), RKC(i)); /***/
458 base = L->base;
463 break; 459 break;
464 } 460 }
465 case OP_NEWTABLE: { 461 case OP_NEWTABLE: {
466 int b = GETARG_B(i); 462 int b = GETARG_B(i);
467 b = fb2int(b); 463 b = fb2int(b);
468 sethvalue(ra, luaH_new(L, b, GETARG_C(i))); 464 sethvalue(ra, luaH_new(L, b, GETARG_C(i)));
469 luaC_checkGC(L); 465 L->ci->u.l.savedpc = pc;
466 luaC_checkGC(L); /***/
467 base = L->base;
470 break; 468 break;
471 } 469 }
472 case OP_SELF: { 470 case OP_SELF: {
473 StkId rb = RB(i); 471 StkId rb = RB(i);
474 setobjs2s(ra+1, rb); 472 setobjs2s(ra+1, rb);
475 luaV_gettable(L, rb, RKC(i), ra); 473 L->ci->u.l.savedpc = pc;
474 luaV_gettable(L, rb, RKC(i), ra); /***/
475 base = L->base;
476 break; 476 break;
477 } 477 }
478 case OP_ADD: { 478 case OP_ADD: {
@@ -482,7 +482,7 @@ StkId luaV_execute (lua_State *L) {
482 setnvalue(ra, nvalue(rb) + nvalue(rc)); 482 setnvalue(ra, nvalue(rb) + nvalue(rc));
483 } 483 }
484 else 484 else
485 Arith(L, ra, rb, rc, TM_ADD); 485 base = Arith(L, ra, rb, rc, TM_ADD, pc); /***/
486 break; 486 break;
487 } 487 }
488 case OP_SUB: { 488 case OP_SUB: {
@@ -492,7 +492,7 @@ StkId luaV_execute (lua_State *L) {
492 setnvalue(ra, nvalue(rb) - nvalue(rc)); 492 setnvalue(ra, nvalue(rb) - nvalue(rc));
493 } 493 }
494 else 494 else
495 Arith(L, ra, rb, rc, TM_SUB); 495 base = Arith(L, ra, rb, rc, TM_SUB, pc); /***/
496 break; 496 break;
497 } 497 }
498 case OP_MUL: { 498 case OP_MUL: {
@@ -502,7 +502,7 @@ StkId luaV_execute (lua_State *L) {
502 setnvalue(ra, nvalue(rb) * nvalue(rc)); 502 setnvalue(ra, nvalue(rb) * nvalue(rc));
503 } 503 }
504 else 504 else
505 Arith(L, ra, rb, rc, TM_MUL); 505 base = Arith(L, ra, rb, rc, TM_MUL, pc); /***/
506 break; 506 break;
507 } 507 }
508 case OP_DIV: { 508 case OP_DIV: {
@@ -512,11 +512,11 @@ StkId luaV_execute (lua_State *L) {
512 setnvalue(ra, nvalue(rb) / nvalue(rc)); 512 setnvalue(ra, nvalue(rb) / nvalue(rc));
513 } 513 }
514 else 514 else
515 Arith(L, ra, rb, rc, TM_DIV); 515 base = Arith(L, ra, rb, rc, TM_DIV, pc); /***/
516 break; 516 break;
517 } 517 }
518 case OP_POW: { 518 case OP_POW: {
519 Arith(L, ra, RKB(i), RKC(i), TM_POW); 519 base = Arith(L, ra, RKB(i), RKC(i), TM_POW, pc); /***/
520 break; 520 break;
521 } 521 }
522 case OP_UNM: { 522 case OP_UNM: {
@@ -527,8 +527,10 @@ StkId luaV_execute (lua_State *L) {
527 } 527 }
528 else { 528 else {
529 setnilvalue(&temp); 529 setnilvalue(&temp);
530 if (!call_binTM(L, RB(i), &temp, ra, TM_UNM)) 530 L->ci->u.l.savedpc = pc;
531 if (!call_binTM(L, RB(i), &temp, ra, TM_UNM)) /***/
531 luaG_aritherror(L, RB(i), &temp); 532 luaG_aritherror(L, RB(i), &temp);
533 base = L->base;
532 } 534 }
533 break; 535 break;
534 } 536 }
@@ -540,10 +542,11 @@ StkId luaV_execute (lua_State *L) {
540 case OP_CONCAT: { 542 case OP_CONCAT: {
541 int b = GETARG_B(i); 543 int b = GETARG_B(i);
542 int c = GETARG_C(i); 544 int c = GETARG_C(i);
543 luaV_concat(L, c-b+1, c); /* may change `base' (and `ra') */ 545 L->ci->u.l.savedpc = pc;
546 luaV_concat(L, c-b+1, c); /* may change `base' (and `ra') */ /***/
547 luaC_checkGC(L); /***/
544 base = L->base; 548 base = L->base;
545 setobjs2s(RA(i), base+b); 549 setobjs2s(RA(i), base+b);
546 luaC_checkGC(L);
547 break; 550 break;
548 } 551 }
549 case OP_JMP: { 552 case OP_JMP: {
@@ -551,18 +554,24 @@ StkId luaV_execute (lua_State *L) {
551 break; 554 break;
552 } 555 }
553 case OP_EQ: { 556 case OP_EQ: {
554 if (equalobj(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; 557 L->ci->u.l.savedpc = pc;
558 if (equalobj(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/
555 else dojump(pc, GETARG_sBx(*pc) + 1); 559 else dojump(pc, GETARG_sBx(*pc) + 1);
560 base = L->base;
556 break; 561 break;
557 } 562 }
558 case OP_LT: { 563 case OP_LT: {
559 if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; 564 L->ci->u.l.savedpc = pc;
565 if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/
560 else dojump(pc, GETARG_sBx(*pc) + 1); 566 else dojump(pc, GETARG_sBx(*pc) + 1);
567 base = L->base;
561 break; 568 break;
562 } 569 }
563 case OP_LE: { 570 case OP_LE: {
564 if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; 571 L->ci->u.l.savedpc = pc;
572 if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/
565 else dojump(pc, GETARG_sBx(*pc) + 1); 573 else dojump(pc, GETARG_sBx(*pc) + 1);
574 base = L->base;
566 break; 575 break;
567 } 576 }
568 case OP_TEST: { 577 case OP_TEST: {
@@ -575,18 +584,16 @@ StkId luaV_execute (lua_State *L) {
575 break; 584 break;
576 } 585 }
577 case OP_CALL: 586 case OP_CALL:
578 case OP_TAILCALL: { 587 case OP_TAILCALL: { /***/
579 StkId firstResult; 588 StkId firstResult;
580 int b = GETARG_B(i); 589 int b = GETARG_B(i);
581 int nresults;
582 if (b != 0) L->top = ra+b; /* else previous instruction set top */ 590 if (b != 0) L->top = ra+b; /* else previous instruction set top */
583 nresults = GETARG_C(i) - 1; 591 L->ci->u.l.savedpc = pc;
584 firstResult = luaD_precall(L, ra); 592 firstResult = luaD_precall(L, ra);
585 if (firstResult) { 593 if (firstResult) {
594 int nresults = GETARG_C(i) - 1;
586 if (firstResult > L->top) { /* yield? */ 595 if (firstResult > L->top) { /* yield? */
587 lua_assert(L->ci->state == (CI_C | CI_YIELD));
588 (L->ci - 1)->u.l.savedpc = pc; 596 (L->ci - 1)->u.l.savedpc = pc;
589 (L->ci - 1)->state = CI_SAVEDPC;
590 return NULL; 597 return NULL;
591 } 598 }
592 /* it was a C function (`precall' called it); adjust results */ 599 /* it was a C function (`precall' called it); adjust results */
@@ -594,10 +601,8 @@ StkId luaV_execute (lua_State *L) {
594 if (nresults >= 0) L->top = L->ci->top; 601 if (nresults >= 0) L->top = L->ci->top;
595 } 602 }
596 else { /* it is a Lua function */ 603 else { /* it is a Lua function */
597 if (GET_OPCODE(i) == OP_CALL) { /* regular call? */ 604 if (GET_OPCODE(i) == OP_CALL) /* regular call? */
598 (L->ci-1)->u.l.savedpc = pc; /* save `pc' to return later */ 605 nexeccalls++;
599 (L->ci-1)->state = (CI_SAVEDPC | CI_CALLING);
600 }
601 else { /* tail call: put new frame in place of previous one */ 606 else { /* tail call: put new frame in place of previous one */
602 int aux; 607 int aux;
603 base = (L->ci - 1)->base; /* `luaD_precall' may change the stack */ 608 base = (L->ci - 1)->base; /* `luaD_precall' may change the stack */
@@ -606,35 +611,27 @@ StkId luaV_execute (lua_State *L) {
606 for (aux = 0; ra+aux < L->top; aux++) /* move frame down */ 611 for (aux = 0; ra+aux < L->top; aux++) /* move frame down */
607 setobjs2s(base+aux-1, ra+aux); 612 setobjs2s(base+aux-1, ra+aux);
608 (L->ci - 1)->top = L->top = base+aux; /* correct top */ 613 (L->ci - 1)->top = L->top = base+aux; /* correct top */
609 lua_assert(L->ci->state & CI_SAVEDPC);
610 (L->ci - 1)->u.l.savedpc = L->ci->u.l.savedpc; 614 (L->ci - 1)->u.l.savedpc = L->ci->u.l.savedpc;
611 (L->ci - 1)->u.l.tailcalls++; /* one more call lost */ 615 (L->ci - 1)->u.l.tailcalls++; /* one more call lost */
612 (L->ci - 1)->state = CI_SAVEDPC;
613 L->ci--; /* remove new frame */ 616 L->ci--; /* remove new frame */
614 L->base = L->ci->base; 617 L->base = L->ci->base;
615 } 618 }
616 goto callentry; 619 goto callentry;
617 } 620 }
621 base = L->base;
618 break; 622 break;
619 } 623 }
620 case OP_RETURN: { 624 case OP_RETURN: {
621 CallInfo *ci = L->ci - 1; /* previous function frame */ 625 CallInfo *ci = L->ci - 1; /* previous function frame */
622 int b = GETARG_B(i); 626 int b = GETARG_B(i);
623 if (b != 0) L->top = ra+b-1; 627 if (b != 0) L->top = ra+b-1;
624 lua_assert(L->ci->state & CI_HASFRAME);
625 if (L->openupval) luaF_close(L, base); 628 if (L->openupval) luaF_close(L, base);
626 L->ci->state = CI_SAVEDPC; /* deactivate current function */
627 L->ci->u.l.savedpc = pc; 629 L->ci->u.l.savedpc = pc;
628 /* previous function was running `here'? */ 630 if (--nexeccalls == 0) /* was previous function running `here'? */
629 if (!(ci->state & CI_CALLING)) {
630 lua_assert((ci->state & CI_C) || ci->u.l.pc != &pc);
631 return ra; /* no: return */ 631 return ra; /* no: return */
632 }
633 else { /* yes: continue its execution */ 632 else { /* yes: continue its execution */
634 int nresults; 633 int nresults;
635 lua_assert(ci->u.l.pc == &pc && 634 lua_assert(isLua(ci));
636 ttisfunction(ci->base - 1) &&
637 (ci->state & CI_SAVEDPC));
638 lua_assert(GET_OPCODE(*(ci->u.l.savedpc - 1)) == OP_CALL); 635 lua_assert(GET_OPCODE(*(ci->u.l.savedpc - 1)) == OP_CALL);
639 nresults = GETARG_C(*(ci->u.l.savedpc - 1)) - 1; 636 nresults = GETARG_C(*(ci->u.l.savedpc - 1)) - 1;
640 luaD_poscall(L, nresults, ra); 637 luaD_poscall(L, nresults, ra);
@@ -653,10 +650,11 @@ StkId luaV_execute (lua_State *L) {
653 } 650 }
654 break; 651 break;
655 } 652 }
656 case OP_FORPREP: { 653 case OP_FORPREP: { /***/
657 const TObject *init = ra; 654 const TObject *init = ra;
658 const TObject *plimit = ra+1; 655 const TObject *plimit = ra+1;
659 const TObject *pstep = ra+2; 656 const TObject *pstep = ra+2;
657 L->ci->u.l.savedpc = pc;
660 if (!tonumber(init, ra)) 658 if (!tonumber(init, ra))
661 luaG_runerror(L, "`for' initial value must be a number"); 659 luaG_runerror(L, "`for' initial value must be a number");
662 else if (!tonumber(plimit, ra+1)) 660 else if (!tonumber(plimit, ra+1))
@@ -673,9 +671,11 @@ StkId luaV_execute (lua_State *L) {
673 setobjs2s(cb+1, ra+1); 671 setobjs2s(cb+1, ra+1);
674 setobjs2s(cb, ra); 672 setobjs2s(cb, ra);
675 L->top = cb+3; /* func. + 2 args (state and index) */ 673 L->top = cb+3; /* func. + 2 args (state and index) */
676 luaD_call(L, cb, GETARG_C(i)); 674 L->ci->u.l.savedpc = pc;
675 luaD_call(L, cb, GETARG_C(i)); /***/
677 L->top = L->ci->top; 676 L->top = L->ci->top;
678 cb = XRA(i) + 3; /* previous call may change the stack */ 677 base = L->base;
678 cb = RA(i) + 3; /* previous call may change the stack */
679 if (ttisnil(cb)) /* break loop? */ 679 if (ttisnil(cb)) /* break loop? */
680 pc++; /* skip jump (break loop) */ 680 pc++; /* skip jump (break loop) */
681 else { 681 else {
@@ -732,7 +732,9 @@ StkId luaV_execute (lua_State *L) {
732 } 732 }
733 } 733 }
734 setclvalue(ra, ncl); 734 setclvalue(ra, ncl);
735 luaC_checkGC(L); 735 L->ci->u.l.savedpc = pc;
736 luaC_checkGC(L); /***/
737 base = L->base;
736 break; 738 break;
737 } 739 }
738 } 740 }