summaryrefslogtreecommitdiff
path: root/lcode.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-04-16 15:46:28 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-04-16 15:46:28 -0300
commit1294b09d8eff59a5fa00a43a2c462d338546da1f (patch)
treeaec3bb6fbfdefba54fae9f0ebabda72885d1a3a7 /lcode.c
parentd4f0c4435d026e5621b4b777c872815cee6f57bb (diff)
downloadlua-1294b09d8eff59a5fa00a43a2c462d338546da1f.tar.gz
lua-1294b09d8eff59a5fa00a43a2c462d338546da1f.tar.bz2
lua-1294b09d8eff59a5fa00a43a2c462d338546da1f.zip
first implementation of literal integers (no constant folding yet)
Diffstat (limited to 'lcode.c')
-rw-r--r--lcode.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/lcode.c b/lcode.c
index 5ff659d0..8e0b443d 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 2.62 2012/08/16 17:34:28 roberto Exp $ 2** $Id: lcode.c,v 2.63 2013/04/15 15:43:34 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*/
@@ -30,7 +30,7 @@
30 30
31 31
32static int isnumeral(expdesc *e) { 32static int isnumeral(expdesc *e) {
33 return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP); 33 return (e->k == VKFLT && e->t == NO_JUMP && e->f == NO_JUMP);
34} 34}
35 35
36 36
@@ -322,6 +322,13 @@ int luaK_stringK (FuncState *fs, TString *s) {
322} 322}
323 323
324 324
325static int luaK_intK (FuncState *fs, lua_Integer n) {
326 TValue o;
327 setivalue(&o, n);
328 return addk(fs, &o, &o);
329}
330
331
325int luaK_numberK (FuncState *fs, lua_Number r) { 332int luaK_numberK (FuncState *fs, lua_Number r) {
326 int n; 333 int n;
327 lua_State *L = fs->ls->L; 334 lua_State *L = fs->ls->L;
@@ -333,8 +340,11 @@ int luaK_numberK (FuncState *fs, lua_Number r) {
333 n = addk(fs, L->top - 1, &o); 340 n = addk(fs, L->top - 1, &o);
334 L->top--; 341 L->top--;
335 } 342 }
336 else 343 else {
337 n = addk(fs, &o, &o); /* regular case */ 344 TValue k;
345 setnvalue(&k, r + 0.5); /* ???? (avoid some collisions with ints) */
346 n = addk(fs, &k, &o); /* regular case */
347 }
338 return n; 348 return n;
339} 349}
340 350
@@ -432,10 +442,14 @@ static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
432 luaK_codek(fs, reg, e->u.info); 442 luaK_codek(fs, reg, e->u.info);
433 break; 443 break;
434 } 444 }
435 case VKNUM: { 445 case VKFLT: {
436 luaK_codek(fs, reg, luaK_numberK(fs, e->u.nval)); 446 luaK_codek(fs, reg, luaK_numberK(fs, e->u.nval));
437 break; 447 break;
438 } 448 }
449 case VKINT: {
450 luaK_codek(fs, reg, luaK_intK(fs, e->u.ival));
451 break;
452 }
439 case VRELOCABLE: { 453 case VRELOCABLE: {
440 Instruction *pc = &getcode(fs, e); 454 Instruction *pc = &getcode(fs, e);
441 SETARG_A(*pc, reg); 455 SETARG_A(*pc, reg);
@@ -537,12 +551,18 @@ int luaK_exp2RK (FuncState *fs, expdesc *e) {
537 } 551 }
538 else break; 552 else break;
539 } 553 }
540 case VKNUM: { 554 case VKINT: {
555 e->u.info = luaK_intK(fs, e->u.ival);
556 e->k = VK;
557 goto vk;
558 }
559 case VKFLT: {
541 e->u.info = luaK_numberK(fs, e->u.nval); 560 e->u.info = luaK_numberK(fs, e->u.nval);
542 e->k = VK; 561 e->k = VK;
543 /* go through */ 562 /* go through */
544 } 563 }
545 case VK: { 564 case VK: {
565 vk:
546 if (e->u.info <= MAXINDEXRK) /* constant fits in argC? */ 566 if (e->u.info <= MAXINDEXRK) /* constant fits in argC? */
547 return RKASK(e->u.info); 567 return RKASK(e->u.info);
548 else break; 568 else break;
@@ -626,7 +646,7 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) {
626 pc = e->u.info; 646 pc = e->u.info;
627 break; 647 break;
628 } 648 }
629 case VK: case VKNUM: case VTRUE: { 649 case VK: case VKFLT: case VKINT: case VTRUE: {
630 pc = NO_JUMP; /* always true; do nothing */ 650 pc = NO_JUMP; /* always true; do nothing */
631 break; 651 break;
632 } 652 }
@@ -671,7 +691,7 @@ static void codenot (FuncState *fs, expdesc *e) {
671 e->k = VTRUE; 691 e->k = VTRUE;
672 break; 692 break;
673 } 693 }
674 case VK: case VKNUM: case VTRUE: { 694 case VK: case VKFLT: case VKINT: case VTRUE: {
675 e->k = VFALSE; 695 e->k = VFALSE;
676 break; 696 break;
677 } 697 }
@@ -760,7 +780,7 @@ static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1,
760 780
761void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) { 781void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) {
762 expdesc e2; 782 expdesc e2;
763 e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0; 783 e2.t = e2.f = NO_JUMP; e2.k = VKFLT; e2.u.nval = 0;
764 switch (op) { 784 switch (op) {
765 case OPR_MINUS: { 785 case OPR_MINUS: {
766 if (isnumeral(e)) /* minus constant? */ 786 if (isnumeral(e)) /* minus constant? */