History

Lua 5.2.0-work3

Lua Team committed 16 years ago

Commit d618ddd1 parent be77f2777 files · +3825 −3949Browse files

Showing the changes to src/lcode.c (1 of 77 files). Show all

Unified · Split

src/lcode.c+31−20
@@ -1,5 +1,5 @@
11 /*
2−** $Id: lcode.c,v 2.43 2010/01/11 17:38:30 roberto Exp $
2+** $Id: lcode.c,v 2.46 2010/04/17 12:46:32 roberto Exp $
33 ** Code generator for Lua
44 ** See Copyright Notice in lua.h
55 */
@@ -372,11 +372,6 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) { · 366 unmodified lines
372372 e->k = VRELOCABLE;
373373 break;
374374 }
375− case VGLOBAL: {
376− e->u.s.info = luaK_codeABxX(fs, OP_GETGLOBAL, 0, e->u.s.info);
377− e->k = VRELOCABLE;
378− break;
379− }
380375 case VINDEXED: {
381376 freereg(fs, e->u.s.aux);
382377 freereg(fs, e->u.s.info);
@@ -384,6 +379,12 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) { · 1 unmodified line
384379 e->k = VRELOCABLE;
385380 break;
386381 }
382+ case VINDEXEDUP: {
383+ freereg(fs, e->u.s.aux);
384+ e->u.s.info = luaK_codeABC(fs, OP_GETTABUP, 0, e->u.s.info, e->u.s.aux);
385+ e->k = VRELOCABLE;
386+ break;
387+ }
387388 case VVARARG:
388389 case VCALL: {
389390 luaK_setoneret(fs, e);
@@ -493,6 +494,12 @@ int luaK_exp2anyreg (FuncState *fs, expdesc *e) { · 103 unmodified lines
493494 }
494495
495496
497+void luaK_exp2anyregup (FuncState *fs, expdesc *e) {
498+ if (e->k != VUPVAL || hasjumps(e))
499+ luaK_exp2anyreg(fs, e);
500+}
501+
502+
496503 void luaK_exp2val (FuncState *fs, expdesc *e) {
497504 if (hasjumps(e))
498505 luaK_exp2anyreg(fs, e);
@@ -543,16 +550,16 @@ void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { · 44 unmodified lines
543550 luaK_codeABC(fs, OP_SETUPVAL, e, var->u.s.info, 0);
544551 break;
545552 }
546− case VGLOBAL: {
547− int e = luaK_exp2anyreg(fs, ex);
548− luaK_codeABxX(fs, OP_SETGLOBAL, e, var->u.s.info);
549− break;
550− }
551553 case VINDEXED: {
552554 int e = luaK_exp2RK(fs, ex);
553555 luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e);
554556 break;
555557 }
558+ case VINDEXEDUP: {
559+ int e = luaK_exp2RK(fs, ex);
560+ luaK_codeABC(fs, OP_SETTABUP, var->u.s.info, var->u.s.aux, e);
561+ break;
562+ }
556563 default: {
557564 lua_assert(0); /* invalid var kind to store */
558565 break;
@@ -567,9 +574,9 @@ void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { · 8 unmodified lines
567574 luaK_exp2anyreg(fs, e);
568575 freeexp(fs, e);
569576 func = fs->freereg;
570− luaK_reserveregs(fs, 2);
571577 luaK_codeABC(fs, OP_SELF, func, e->u.s.info, luaK_exp2RK(fs, key));
572578 freeexp(fs, key);
579+ luaK_reserveregs(fs, 2);
573580 e->u.s.info = func;
574581 e->k = VNONRELOC;
575582 }
@@ -695,8 +702,9 @@ static void codenot (FuncState *fs, expdesc *e) { · 119 unmodified lines
695702
696703
697704 void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
705+ lua_assert(!hasjumps(t));
698706 t->u.s.aux = luaK_exp2RK(fs, k);
699− t->k = VINDEXED;
707+ t->k = (t->k == VUPVAL) ? VINDEXEDUP : VINDEXED;
700708 }
701709
702710
@@ -711,7 +719,8 @@ static int constfolding (OpCode op, expdesc *e1, expdesc *e2) { · 8 unmodified lines
711719 }
712720
713721
714−static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {
722+static void codearith (FuncState *fs, OpCode op,
723+ expdesc *e1, expdesc *e2, int line) {
715724 if (constfolding(op, e1, e2))
716725 return;
717726 else {
@@ -727,6 +736,7 @@ static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { · 9 unmodified lines
727736 }
728737 e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2);
729738 e1->k = VRELOCABLE;
739+ luaK_fixline(fs, line);
730740 }
731741 }
732742
@@ -747,7 +757,7 @@ static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1, · 14 unmodified lines
747757 }
748758
749759
750−void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {
760+void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) {
751761 expdesc e2;
752762 e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0;
753763 switch (op) {
@@ -756,14 +766,14 @@ void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) { · 2 unmodified lines
756766 e->u.nval = luai_numunm(NULL, e->u.nval); /* fold it */
757767 else {
758768 luaK_exp2anyreg(fs, e);
759− codearith(fs, OP_UNM, e, &e2);
769+ codearith(fs, OP_UNM, e, &e2, line);
760770 }
761771 break;
762772 }
763773 case OPR_NOT: codenot(fs, e); break;
764774 case OPR_LEN: {
765775 luaK_exp2anyreg(fs, e); /* cannot operate on constants */
766− codearith(fs, OP_LEN, e, &e2);
776+ codearith(fs, OP_LEN, e, &e2, line);
767777 break;
768778 }
769779 default: lua_assert(0);
@@ -798,7 +808,8 @@ void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { · 28 unmodified lines
798808 }
799809
800810
801−void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
811+void luaK_posfix (FuncState *fs, BinOpr op,
812+ expdesc *e1, expdesc *e2, int line) {
802813 switch (op) {
803814 case OPR_AND: {
804815 lua_assert(e1->t == NO_JUMP); /* list must be closed */
@@ -824,13 +835,13 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) { · 19 unmodified lines
824835 }
825836 else {
826837 luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */
827− codearith(fs, OP_CONCAT, e1, e2);
838+ codearith(fs, OP_CONCAT, e1, e2, line);
828839 }
829840 break;
830841 }
831842 case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:
832843 case OPR_MOD: case OPR_POW: {
833− codearith(fs, cast(OpCode, op - OPR_ADD + OP_ADD), e1, e2);
844+ codearith(fs, cast(OpCode, op - OPR_ADD + OP_ADD), e1, e2, line);
834845 break;
835846 }
836847 case OPR_EQ: case OPR_LT: case OPR_LE: {