diff options
-rw-r--r-- | lcode.c | 19 | ||||
-rw-r--r-- | ldebug.c | 96 | ||||
-rw-r--r-- | ldebug.h | 5 | ||||
-rw-r--r-- | lopcodes.h | 24 | ||||
-rw-r--r-- | lparser.c | 22 | ||||
-rw-r--r-- | lvm.c | 24 |
6 files changed, 94 insertions, 96 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 1.72 2001/06/08 12:29:27 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.73 2001/06/08 19:00:57 roberto Exp roberto $ |
3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -69,8 +69,8 @@ int luaK_jump (FuncState *fs) { | |||
69 | } | 69 | } |
70 | 70 | ||
71 | 71 | ||
72 | static int luaK_condjump (FuncState *fs, OpCode op, int B, int C) { | 72 | static int luaK_condjump (FuncState *fs, OpCode op, int A, int B, int C) { |
73 | luaK_codeABC(fs, op, NO_REG, B, C); | 73 | luaK_codeABC(fs, op, A, B, C); |
74 | return luaK_codeAsBc(fs, OP_CJMP, 0, NO_JUMP); | 74 | return luaK_codeAsBc(fs, OP_CJMP, 0, NO_JUMP); |
75 | } | 75 | } |
76 | 76 | ||
@@ -261,12 +261,11 @@ static int number_constant (FuncState *fs, lua_Number r) { | |||
261 | 261 | ||
262 | void luaK_setcallreturns (FuncState *fs, expdesc *e, int nresults) { | 262 | void luaK_setcallreturns (FuncState *fs, expdesc *e, int nresults) { |
263 | if (e->k == VCALL) { /* expression is an open function call? */ | 263 | if (e->k == VCALL) { /* expression is an open function call? */ |
264 | int a = GETARG_A(getcode(fs, e)); | 264 | if (nresults == LUA_MULTRET) nresults = NO_REG; |
265 | int c = (nresults == LUA_MULTRET) ? NO_REG : a + nresults; | 265 | SETARG_C(getcode(fs, e), nresults); |
266 | SETARG_C(getcode(fs, e), c); | ||
267 | if (nresults == 1) { /* `regular' expression? */ | 266 | if (nresults == 1) { /* `regular' expression? */ |
268 | e->k = VNONRELOC; | 267 | e->k = VNONRELOC; |
269 | e->u.i.info = a; | 268 | e->u.i.info = GETARG_A(getcode(fs, e)); |
270 | } | 269 | } |
271 | } | 270 | } |
272 | } | 271 | } |
@@ -499,13 +498,13 @@ static int jumponcond (FuncState *fs, expdesc *e, OpCode op) { | |||
499 | if (GET_OPCODE(ie) == OP_NOT) { | 498 | if (GET_OPCODE(ie) == OP_NOT) { |
500 | op = invertoperator(op); | 499 | op = invertoperator(op); |
501 | fs->pc--; /* remove previous OP_NOT */ | 500 | fs->pc--; /* remove previous OP_NOT */ |
502 | return luaK_condjump(fs, op, GETARG_B(ie), 0); | 501 | return luaK_condjump(fs, op, NO_REG, GETARG_B(ie), 0); |
503 | } | 502 | } |
504 | /* else go through */ | 503 | /* else go through */ |
505 | } | 504 | } |
506 | discharge2anyreg(fs, e); | 505 | discharge2anyreg(fs, e); |
507 | freeexp(fs, e); | 506 | freeexp(fs, e); |
508 | return luaK_condjump(fs, op, e->u.i.info, 0); | 507 | return luaK_condjump(fs, op, NO_REG, e->u.i.info, 0); |
509 | } | 508 | } |
510 | 509 | ||
511 | 510 | ||
@@ -748,7 +747,7 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) { | |||
748 | e1->k = VRELOCABLE; | 747 | e1->k = VRELOCABLE; |
749 | } | 748 | } |
750 | else { /* jump */ | 749 | else { /* jump */ |
751 | e1->u.i.info = luaK_condjump(fs, opc, o1, o2); | 750 | e1->u.i.info = luaK_condjump(fs, opc, o1, 0, o2); |
752 | e1->k = VJMP; | 751 | e1->k = VJMP; |
753 | } | 752 | } |
754 | } | 753 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 1.80 2001/06/08 12:29:27 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 1.81 2001/06/08 19:00:57 roberto Exp roberto $ |
3 | ** Debug Interface | 3 | ** Debug Interface |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -349,6 +349,7 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { | |||
349 | int a = GETARG_A(i); | 349 | int a = GETARG_A(i); |
350 | int b = 0; | 350 | int b = 0; |
351 | int c = 0; | 351 | int c = 0; |
352 | checkreg(pt, a); | ||
352 | switch (getOpMode(op)) { | 353 | switch (getOpMode(op)) { |
353 | case iABC: { | 354 | case iABC: { |
354 | b = GETARG_B(i); | 355 | b = GETARG_B(i); |
@@ -370,7 +371,6 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { | |||
370 | break; | 371 | break; |
371 | } | 372 | } |
372 | } | 373 | } |
373 | if (testOpMode(op, OpModeAreg)) checkreg(pt, a); | ||
374 | if (testOpMode(op, OpModesetA)) { | 374 | if (testOpMode(op, OpModesetA)) { |
375 | if (a == reg) last = pc; /* change register `a' */ | 375 | if (a == reg) last = pc; /* change register `a' */ |
376 | } | 376 | } |
@@ -414,20 +414,20 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { | |||
414 | break; | 414 | break; |
415 | } | 415 | } |
416 | case OP_CALL: { | 416 | case OP_CALL: { |
417 | if (b == NO_REG) b = pt->maxstacksize; | 417 | if (b != NO_REG) { |
418 | checkreg(pt, a+b); | ||
419 | } | ||
418 | if (c == NO_REG) { | 420 | if (c == NO_REG) { |
419 | check(checkopenop(pt->code[pc+1])); | 421 | check(checkopenop(pt->code[pc+1])); |
420 | c = 1; | ||
421 | } | 422 | } |
422 | check(b > a); | 423 | else if (c != 0) |
423 | checkreg(pt, b-1); | 424 | checkreg(pt, a+c-1); |
424 | checkreg(pt, c-1); | ||
425 | if (reg >= a) last = pc; /* affect all registers above base */ | 425 | if (reg >= a) last = pc; /* affect all registers above base */ |
426 | break; | 426 | break; |
427 | } | 427 | } |
428 | case OP_RETURN: { | 428 | case OP_RETURN: { |
429 | if (b == NO_REG) b = pt->maxstacksize; | 429 | if (b != NO_REG && b != 0) |
430 | checkreg(pt, b-1); | 430 | checkreg(pt, a+b-1); |
431 | break; | 431 | break; |
432 | } | 432 | } |
433 | case OP_FORPREP: | 433 | case OP_FORPREP: |
@@ -566,49 +566,49 @@ void luaG_ordererror (lua_State *L, const TObject *p1, const TObject *p2) { | |||
566 | 566 | ||
567 | 567 | ||
568 | #define opmode(t,a,b,c,sa,k,m) (((t)<<OpModeT) | \ | 568 | #define opmode(t,a,b,c,sa,k,m) (((t)<<OpModeT) | \ |
569 | ((a)<<OpModeAreg) | ((b)<<OpModeBreg) | ((c)<<OpModeCreg) | \ | 569 | ((b)<<OpModeBreg) | ((c)<<OpModeCreg) | \ |
570 | ((sa)<<OpModesetA) | ((k)<<OpModeK) | (m)) | 570 | ((sa)<<OpModesetA) | ((k)<<OpModeK) | (m)) |
571 | 571 | ||
572 | 572 | ||
573 | const lu_byte luaG_opmodes[] = { | 573 | const lu_byte luaG_opmodes[] = { |
574 | /* T A B C sA K mode opcode */ | 574 | /* T J B C sA K mode opcode */ |
575 | opmode(0,1,1,0, 1,0,iABC), /* OP_MOVE */ | 575 | opmode(0,0,1,0, 1,0,iABC), /* OP_MOVE */ |
576 | opmode(0,1,0,0, 1,1,iABc), /* OP_LOADK */ | 576 | opmode(0,0,0,0, 1,1,iABc), /* OP_LOADK */ |
577 | opmode(0,1,0,0, 1,0,iAsBc), /* OP_LOADINT */ | 577 | opmode(0,0,0,0, 1,0,iAsBc), /* OP_LOADINT */ |
578 | opmode(0,1,1,0, 1,0,iABC), /* OP_LOADNIL */ | 578 | opmode(0,0,1,0, 1,0,iABC), /* OP_LOADNIL */ |
579 | opmode(0,1,0,0, 1,0,iABc), /* OP_LOADUPVAL */ | 579 | opmode(0,0,0,0, 1,0,iABc), /* OP_LOADUPVAL */ |
580 | opmode(0,1,0,0, 1,1,iABc), /* OP_GETGLOBAL */ | 580 | opmode(0,0,0,0, 1,1,iABc), /* OP_GETGLOBAL */ |
581 | opmode(0,1,1,1, 1,0,iABC), /* OP_GETTABLE */ | 581 | opmode(0,0,1,1, 1,0,iABC), /* OP_GETTABLE */ |
582 | opmode(0,1,0,0, 0,1,iABc), /* OP_SETGLOBAL */ | 582 | opmode(0,0,0,0, 0,1,iABc), /* OP_SETGLOBAL */ |
583 | opmode(0,1,1,1, 0,0,iABC), /* OP_SETTABLE */ | 583 | opmode(0,0,1,1, 0,0,iABC), /* OP_SETTABLE */ |
584 | opmode(0,1,0,0, 1,0,iABc), /* OP_NEWTABLE */ | 584 | opmode(0,0,0,0, 1,0,iABc), /* OP_NEWTABLE */ |
585 | opmode(0,1,1,1, 1,0,iABC), /* OP_SELF */ | 585 | opmode(0,0,1,1, 1,0,iABC), /* OP_SELF */ |
586 | opmode(0,1,1,1, 1,0,iABC), /* OP_ADD */ | 586 | opmode(0,0,1,1, 1,0,iABC), /* OP_ADD */ |
587 | opmode(0,1,1,1, 1,0,iABC), /* OP_SUB */ | 587 | opmode(0,0,1,1, 1,0,iABC), /* OP_SUB */ |
588 | opmode(0,1,1,1, 1,0,iABC), /* OP_MUL */ | 588 | opmode(0,0,1,1, 1,0,iABC), /* OP_MUL */ |
589 | opmode(0,1,1,1, 1,0,iABC), /* OP_DIV */ | 589 | opmode(0,0,1,1, 1,0,iABC), /* OP_DIV */ |
590 | opmode(0,1,1,1, 1,0,iABC), /* OP_POW */ | 590 | opmode(0,0,1,1, 1,0,iABC), /* OP_POW */ |
591 | opmode(0,1,1,0, 1,0,iABC), /* OP_UNM */ | 591 | opmode(0,0,1,0, 1,0,iABC), /* OP_UNM */ |
592 | opmode(0,1,1,0, 1,0,iABC), /* OP_NOT */ | 592 | opmode(0,0,1,0, 1,0,iABC), /* OP_NOT */ |
593 | opmode(0,1,1,1, 1,0,iABC), /* OP_CONCAT */ | 593 | opmode(0,0,1,1, 1,0,iABC), /* OP_CONCAT */ |
594 | opmode(0,0,0,0, 0,0,iAsBc), /* OP_JMP */ | 594 | opmode(0,1,0,0, 0,0,iAsBc), /* OP_JMP */ |
595 | opmode(0,0,0,0, 0,0,iAsBc), /* OP_CJMP */ | 595 | opmode(0,1,0,0, 0,0,iAsBc), /* OP_CJMP */ |
596 | opmode(1,0,1,1, 0,0,iABC), /* OP_TESTEQ */ | 596 | opmode(1,0,0,1, 0,0,iABC), /* OP_TESTEQ */ |
597 | opmode(1,0,1,1, 0,0,iABC), /* OP_TESTNE */ | 597 | opmode(1,0,0,1, 0,0,iABC), /* OP_TESTNE */ |
598 | opmode(1,0,1,1, 0,0,iABC), /* OP_TESTLT */ | 598 | opmode(1,0,0,1, 0,0,iABC), /* OP_TESTLT */ |
599 | opmode(1,0,1,1, 0,0,iABC), /* OP_TESTLE */ | 599 | opmode(1,0,0,1, 0,0,iABC), /* OP_TESTLE */ |
600 | opmode(1,0,1,1, 0,0,iABC), /* OP_TESTGT */ | 600 | opmode(1,0,0,1, 0,0,iABC), /* OP_TESTGT */ |
601 | opmode(1,0,1,1, 0,0,iABC), /* OP_TESTGE */ | 601 | opmode(1,0,0,1, 0,0,iABC), /* OP_TESTGE */ |
602 | opmode(1,1,1,0, 1,0,iABC), /* OP_TESTT */ | 602 | opmode(1,0,1,0, 1,0,iABC), /* OP_TESTT */ |
603 | opmode(1,1,1,0, 1,0,iABC), /* OP_TESTF */ | 603 | opmode(1,0,1,0, 1,0,iABC), /* OP_TESTF */ |
604 | opmode(0,1,0,0, 1,0,iAsBc), /* OP_NILJMP */ | 604 | opmode(0,0,0,0, 1,0,iAsBc), /* OP_NILJMP */ |
605 | opmode(0,1,0,0, 0,0,iABC), /* OP_CALL */ | 605 | opmode(0,0,0,0, 0,0,iABC), /* OP_CALL */ |
606 | opmode(0,1,0,0, 0,0,iABC), /* OP_RETURN */ | 606 | opmode(0,0,0,0, 0,0,iABC), /* OP_RETURN */ |
607 | opmode(0,1,0,0, 0,0,iAsBc), /* OP_FORPREP */ | 607 | opmode(0,0,0,0, 0,0,iAsBc), /* OP_FORPREP */ |
608 | opmode(0,1,0,0, 0,0,iAsBc), /* OP_FORLOOP */ | 608 | opmode(0,0,0,0, 0,0,iAsBc), /* OP_FORLOOP */ |
609 | opmode(0,1,0,0, 0,0,iAsBc), /* OP_TFORPREP */ | 609 | opmode(0,1,0,0, 0,0,iAsBc), /* OP_TFORPREP */ |
610 | opmode(0,1,0,0, 0,0,iAsBc), /* OP_TFORLOOP */ | 610 | opmode(0,1,0,0, 0,0,iAsBc), /* OP_TFORLOOP */ |
611 | opmode(0,1,0,0, 0,0,iABc), /* OP_SETLIST */ | 611 | opmode(0,0,0,0, 0,0,iABc), /* OP_SETLIST */ |
612 | opmode(0,1,0,0, 0,0,iABc), /* OP_SETLIST0 */ | 612 | opmode(0,0,0,0, 0,0,iABc), /* OP_SETLIST0 */ |
613 | opmode(0,1,0,0, 0,0,iABc) /* OP_CLOSURE */ | 613 | opmode(0,0,0,0, 0,0,iABc) /* OP_CLOSURE */ |
614 | }; | 614 | }; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.h,v 1.12 2001/06/05 18:17:01 roberto Exp roberto $ | 2 | ** $Id: ldebug.h,v 1.13 2001/06/06 17:50:36 roberto Exp roberto $ |
3 | ** Auxiliary functions from Debug Interface module | 3 | ** Auxiliary functions from Debug Interface module |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -18,8 +18,7 @@ enum OpMode {iABC, iABc, iAsBc}; /* basic instruction format */ | |||
18 | ** masks for instruction properties | 18 | ** masks for instruction properties |
19 | */ | 19 | */ |
20 | enum OpModeMask { | 20 | enum OpModeMask { |
21 | OpModeAreg = 2, /* A is a register */ | 21 | OpModeBreg = 2, /* B is a register */ |
22 | OpModeBreg, /* B is a register */ | ||
23 | OpModeCreg, /* C is a register/constant */ | 22 | OpModeCreg, /* C is a register/constant */ |
24 | OpModesetA, /* instruction set register A */ | 23 | OpModesetA, /* instruction set register A */ |
25 | OpModeK, /* Bc is a constant */ | 24 | OpModeK, /* Bc is a constant */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lopcodes.h,v 1.73 2001/06/05 18:17:01 roberto Exp roberto $ | 2 | ** $Id: lopcodes.h,v 1.74 2001/06/08 19:00:57 roberto Exp roberto $ |
3 | ** Opcodes for Lua virtual machine | 3 | ** Opcodes for Lua virtual machine |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -153,20 +153,20 @@ OP_CONCAT,/* A B C R(A) := R(B).. ... ..R(C) */ | |||
153 | OP_JMP,/* sBc PC += sBc */ | 153 | OP_JMP,/* sBc PC += sBc */ |
154 | OP_CJMP,/* sBc if test then PC += sBc (see (1)) */ | 154 | OP_CJMP,/* sBc if test then PC += sBc (see (1)) */ |
155 | 155 | ||
156 | OP_TESTEQ,/* B C test := (R(B) == R/K(C)) */ | 156 | OP_TESTEQ,/* A C test := (R(A) == R/K(C)) */ |
157 | OP_TESTNE,/* B C test := (R(B) ~= R/K(C)) */ | 157 | OP_TESTNE,/* A C test := (R(A) ~= R/K(C)) */ |
158 | OP_TESTLT,/* B C test := (R(B) < R/K(C)) */ | 158 | OP_TESTLT,/* A C test := (R(A) < R/K(C)) */ |
159 | OP_TESTLE,/* B C test := (R(B) <= R/K(C)) */ | 159 | OP_TESTLE,/* A C test := (R(A) <= R/K(C)) */ |
160 | OP_TESTGT,/* B C test := (R(B) > R/K(C)) */ | 160 | OP_TESTGT,/* A C test := (R(A) > R/K(C)) */ |
161 | OP_TESTGE,/* B C test := (R(B) >= R/K(C)) */ | 161 | OP_TESTGE,/* A C test := (R(A) >= R/K(C)) */ |
162 | 162 | ||
163 | OP_TESTT,/* A B test := R(B); if (test) R(A) := R(B) */ | 163 | OP_TESTT,/* A B test := R(B); if (test) R(A) := R(B) */ |
164 | OP_TESTF,/* A B test := not R(B); if (test) R(A) := nil */ | 164 | OP_TESTF,/* A B test := not R(B); if (test) R(A) := nil */ |
165 | 165 | ||
166 | OP_NILJMP,/* A R(A) := nil; PC++; */ | 166 | OP_NILJMP,/* A R(A) := nil; PC++; */ |
167 | 167 | ||
168 | OP_CALL,/* A B C R(A), ... ,R(C-1) := R(A)(R(A+1), ... ,R(B-1)) */ | 168 | OP_CALL,/* A B C R(A), ... ,R(A+C-1) := R(A)(R(A+1), ... ,R(A+B))*/ |
169 | OP_RETURN,/* A B return R(A), ... ,R(B-1) (see (3)) */ | 169 | OP_RETURN,/* A B return R(A), ... ,R(A+B-1) (see (3)) */ |
170 | 170 | ||
171 | OP_FORPREP,/* A sBc */ | 171 | OP_FORPREP,/* A sBc */ |
172 | OP_FORLOOP,/* A sBc */ | 172 | OP_FORLOOP,/* A sBc */ |
@@ -191,10 +191,10 @@ OP_CLOSURE /* A Bc R(A) := closure(KPROTO[Bc], R(A), ... ,R(A+n)) */ | |||
191 | instructions OP_TEST* and OP_CJMP must always occur together. | 191 | instructions OP_TEST* and OP_CJMP must always occur together. |
192 | 192 | ||
193 | (2) In OP_CALL, if (B == NO_REG) then B = top. C is the number of returns, | 193 | (2) In OP_CALL, if (B == NO_REG) then B = top. C is the number of returns, |
194 | and can be NO_REG. OP_CALL always set "top" to last_result+1, so | 194 | and can be NO_REG. OP_CALL can set `top' to last_result+1, so |
195 | next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use "top". | 195 | next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'. |
196 | 196 | ||
197 | (3) In OP_RETURN, if (B == NO_REG) then B = top. | 197 | (3) In OP_RETURN, if (B == NO_REG) then return up to `top' |
198 | ===========================================================================*/ | 198 | ===========================================================================*/ |
199 | 199 | ||
200 | 200 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 1.146 2001/06/08 12:29:27 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.147 2001/06/08 19:00:57 roberto Exp roberto $ |
3 | ** LL(1) Parser and code generator for Lua | 3 | ** LL(1) Parser and code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -415,7 +415,7 @@ static int explist1 (LexState *ls, expdesc *v) { | |||
415 | static void funcargs (LexState *ls, expdesc *f) { | 415 | static void funcargs (LexState *ls, expdesc *f) { |
416 | FuncState *fs = ls->fs; | 416 | FuncState *fs = ls->fs; |
417 | expdesc args; | 417 | expdesc args; |
418 | int base, top; | 418 | int base, nparams; |
419 | switch (ls->t.token) { | 419 | switch (ls->t.token) { |
420 | case l_c('('): { /* funcargs -> `(' [ explist1 ] `)' */ | 420 | case l_c('('): { /* funcargs -> `(' [ explist1 ] `)' */ |
421 | int line = ls->linenumber; | 421 | int line = ls->linenumber; |
@@ -446,13 +446,13 @@ static void funcargs (LexState *ls, expdesc *f) { | |||
446 | lua_assert(f->k == VNONRELOC); | 446 | lua_assert(f->k == VNONRELOC); |
447 | base = f->u.i.info; /* base register for call */ | 447 | base = f->u.i.info; /* base register for call */ |
448 | if (args.k == VCALL) | 448 | if (args.k == VCALL) |
449 | top = NO_REG; /* open call */ | 449 | nparams = NO_REG; /* open call */ |
450 | else { | 450 | else { |
451 | if (args.k != VVOID) | 451 | if (args.k != VVOID) |
452 | luaK_exp2nextreg(fs, &args); /* close last argument */ | 452 | luaK_exp2nextreg(fs, &args); /* close last argument */ |
453 | top = fs->freereg; | 453 | nparams = fs->freereg - (base+1); |
454 | } | 454 | } |
455 | init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, top, base+1)); | 455 | init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams, 1)); |
456 | fs->freereg = base+1; /* call remove function and arguments and leaves | 456 | fs->freereg = base+1; /* call remove function and arguments and leaves |
457 | (unless changed) one result */ | 457 | (unless changed) one result */ |
458 | } | 458 | } |
@@ -1091,31 +1091,31 @@ static void retstat (LexState *ls) { | |||
1091 | /* stat -> RETURN explist */ | 1091 | /* stat -> RETURN explist */ |
1092 | FuncState *fs = ls->fs; | 1092 | FuncState *fs = ls->fs; |
1093 | expdesc e; | 1093 | expdesc e; |
1094 | int first, last1; /* registers with returned values */ | 1094 | int first, nret; /* registers with returned values */ |
1095 | next(ls); /* skip RETURN */ | 1095 | next(ls); /* skip RETURN */ |
1096 | if (block_follow(ls->t.token) || ls->t.token == l_c(';')) | 1096 | if (block_follow(ls->t.token) || ls->t.token == l_c(';')) |
1097 | first = last1 = 0; /* return no values */ | 1097 | first = nret = 0; /* return no values */ |
1098 | else { | 1098 | else { |
1099 | int n = explist1(ls, &e); /* optional return values */ | 1099 | int n = explist1(ls, &e); /* optional return values */ |
1100 | if (e.k == VCALL) { | 1100 | if (e.k == VCALL) { |
1101 | luaK_setcallreturns(fs, &e, LUA_MULTRET); | 1101 | luaK_setcallreturns(fs, &e, LUA_MULTRET); |
1102 | first = fs->nactloc; | 1102 | first = fs->nactloc; |
1103 | last1 = NO_REG; /* return all values */ | 1103 | nret = NO_REG; /* return all values */ |
1104 | } | 1104 | } |
1105 | else { | 1105 | else { |
1106 | if (n == 1) { /* only one value? */ | 1106 | if (n == 1) { /* only one value? */ |
1107 | luaK_exp2anyreg(fs, &e); | 1107 | luaK_exp2anyreg(fs, &e); |
1108 | first = e.u.i.info; | 1108 | first = e.u.i.info; |
1109 | last1 = first+1; /* return only this value */ | 1109 | nret = 1; /* return only this value */ |
1110 | } | 1110 | } |
1111 | else { | 1111 | else { |
1112 | luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ | 1112 | luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ |
1113 | first = fs->nactloc; | 1113 | first = fs->nactloc; |
1114 | last1 = fs->freereg; /* return all `active' values */ | 1114 | nret = fs->freereg - first; /* return all `active' values */ |
1115 | } | 1115 | } |
1116 | } | 1116 | } |
1117 | } | 1117 | } |
1118 | luaK_codeABC(fs, OP_RETURN, first, last1, 0); | 1118 | luaK_codeABC(fs, OP_RETURN, first, nret, 0); |
1119 | fs->freereg = fs->nactloc; /* removes all temp values */ | 1119 | fs->freereg = fs->nactloc; /* removes all temp values */ |
1120 | } | 1120 | } |
1121 | 1121 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.182 2001/06/08 19:00:57 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.183 2001/06/08 19:20:02 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 | */ |
@@ -488,37 +488,37 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
488 | } | 488 | } |
489 | case OP_TESTEQ: { | 489 | case OP_TESTEQ: { |
490 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 490 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); |
491 | if (luaO_equalObj(RB(i), RKC(i))) dojump(pc, *pc); | 491 | if (luaO_equalObj(ra, RKC(i))) dojump(pc, *pc); |
492 | pc++; | 492 | pc++; |
493 | break; | 493 | break; |
494 | } | 494 | } |
495 | case OP_TESTNE: { | 495 | case OP_TESTNE: { |
496 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 496 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); |
497 | if (!luaO_equalObj(RB(i), RKC(i))) dojump(pc, *pc); | 497 | if (!luaO_equalObj(ra, RKC(i))) dojump(pc, *pc); |
498 | pc++; | 498 | pc++; |
499 | break; | 499 | break; |
500 | } | 500 | } |
501 | case OP_TESTLT: { | 501 | case OP_TESTLT: { |
502 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 502 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); |
503 | if (luaV_lessthan(L, RB(i), RKC(i))) dojump(pc, *pc); | 503 | if (luaV_lessthan(L, ra, RKC(i))) dojump(pc, *pc); |
504 | pc++; | 504 | pc++; |
505 | break; | 505 | break; |
506 | } | 506 | } |
507 | case OP_TESTLE: { /* b <= c === !(c<b) */ | 507 | case OP_TESTLE: { /* b <= c === !(c<b) */ |
508 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 508 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); |
509 | if (!luaV_lessthan(L, RKC(i), RB(i))) dojump(pc, *pc); | 509 | if (!luaV_lessthan(L, RKC(i), ra)) dojump(pc, *pc); |
510 | pc++; | 510 | pc++; |
511 | break; | 511 | break; |
512 | } | 512 | } |
513 | case OP_TESTGT: { /* b > c === (c<b) */ | 513 | case OP_TESTGT: { /* b > c === (c<b) */ |
514 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 514 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); |
515 | if (luaV_lessthan(L, RKC(i), RB(i))) dojump(pc, *pc); | 515 | if (luaV_lessthan(L, RKC(i), ra)) dojump(pc, *pc); |
516 | pc++; | 516 | pc++; |
517 | break; | 517 | break; |
518 | } | 518 | } |
519 | case OP_TESTGE: { /* b >= c === !(b<c) */ | 519 | case OP_TESTGE: { /* b >= c === !(b<c) */ |
520 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 520 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); |
521 | if (!luaV_lessthan(L, RB(i), RKC(i))) dojump(pc, *pc); | 521 | if (!luaV_lessthan(L, ra, RKC(i))) dojump(pc, *pc); |
522 | pc++; | 522 | pc++; |
523 | break; | 523 | break; |
524 | } | 524 | } |
@@ -550,11 +550,11 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
550 | int c; | 550 | int c; |
551 | int b = GETARG_B(i); | 551 | int b = GETARG_B(i); |
552 | if (b != NO_REG) | 552 | if (b != NO_REG) |
553 | L->top = base+b; | 553 | L->top = ra+b+1; |
554 | luaD_call(L, ra); | 554 | luaD_call(L, ra); |
555 | c = GETARG_C(i); | 555 | c = GETARG_C(i); |
556 | if (c != NO_REG) { | 556 | if (c != NO_REG) { |
557 | while (L->top < base+c) setnilvalue(L->top++); | 557 | while (L->top < ra+c) setnilvalue(L->top++); |
558 | L->top = base + tf->maxstacksize; | 558 | L->top = base + tf->maxstacksize; |
559 | } | 559 | } |
560 | break; | 560 | break; |
@@ -562,7 +562,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
562 | case OP_RETURN: { | 562 | case OP_RETURN: { |
563 | int b = GETARG_B(i); | 563 | int b = GETARG_B(i); |
564 | if (b != NO_REG) | 564 | if (b != NO_REG) |
565 | L->top = base+b; | 565 | L->top = ra+b; |
566 | return ra; | 566 | return ra; |
567 | } | 567 | } |
568 | case OP_FORPREP: { | 568 | case OP_FORPREP: { |
@@ -578,10 +578,10 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
578 | /* go through */ | 578 | /* go through */ |
579 | } | 579 | } |
580 | case OP_FORLOOP: { | 580 | case OP_FORLOOP: { |
581 | if (ttype(ra) != LUA_TNUMBER) | ||
582 | luaD_error(L, l_s("`for' index must be a number")); | ||
583 | runtime_check(L, ttype(ra+1) == LUA_TNUMBER && | 581 | runtime_check(L, ttype(ra+1) == LUA_TNUMBER && |
584 | ttype(ra+2) == LUA_TNUMBER); | 582 | ttype(ra+2) == LUA_TNUMBER); |
583 | if (ttype(ra) != LUA_TNUMBER) | ||
584 | luaD_error(L, l_s("`for' index must be a number")); | ||
585 | nvalue(ra) += nvalue(ra+2); /* increment index */ | 585 | nvalue(ra) += nvalue(ra+2); /* increment index */ |
586 | if (nvalue(ra+2) > 0 ? | 586 | if (nvalue(ra+2) > 0 ? |
587 | nvalue(ra) <= nvalue(ra+1) : | 587 | nvalue(ra) <= nvalue(ra+1) : |