summaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-03-08 15:00:16 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-03-08 15:00:16 -0300
commit7d57ea70bc975922485d589c8a6d8dedaa0fba02 (patch)
treed7f7da1492de151749a69042cd2bf63320638020 /lvm.c
parent2d5b923759a77d8f5f7bfa62906ea37f46b9281d (diff)
downloadlua-7d57ea70bc975922485d589c8a6d8dedaa0fba02.tar.gz
lua-7d57ea70bc975922485d589c8a6d8dedaa0fba02.tar.bz2
lua-7d57ea70bc975922485d589c8a6d8dedaa0fba02.zip
new `mod' (`%') operator
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/lvm.c b/lvm.c
index 0883776b..003e2a43 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.27 2005/03/07 16:59:01 roberto Exp roberto $ 2** $Id: lvm.c,v 2.28 2005/03/07 18:27:34 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*/
@@ -334,12 +334,14 @@ static StkId Arith (lua_State *L, StkId ra, const TValue *rb,
334 L->ci->savedpc = pc; 334 L->ci->savedpc = pc;
335 if ((b = luaV_tonumber(rb, &tempb)) != NULL && 335 if ((b = luaV_tonumber(rb, &tempb)) != NULL &&
336 (c = luaV_tonumber(rc, &tempc)) != NULL) { 336 (c = luaV_tonumber(rc, &tempc)) != NULL) {
337 lua_Number nb = nvalue(b), nc = nvalue(c);
337 switch (op) { 338 switch (op) {
338 case TM_ADD: setnvalue(ra, num_add(nvalue(b), nvalue(c))); break; 339 case TM_ADD: setnvalue(ra, num_add(nb, nc)); break;
339 case TM_SUB: setnvalue(ra, num_sub(nvalue(b), nvalue(c))); break; 340 case TM_SUB: setnvalue(ra, num_sub(nb, nc)); break;
340 case TM_MUL: setnvalue(ra, num_mul(nvalue(b), nvalue(c))); break; 341 case TM_MUL: setnvalue(ra, num_mul(nb, nc)); break;
341 case TM_DIV: setnvalue(ra, num_div(nvalue(b), nvalue(c))); break; 342 case TM_DIV: setnvalue(ra, num_div(nb, nc)); break;
342 case TM_POW: setnvalue(ra, num_pow(nvalue(b), nvalue(c))); break; 343 case TM_MOD: setnvalue(ra, num_mod(nb, nc)); break;
344 case TM_POW: setnvalue(ra, num_pow(nb, nc)); break;
343 default: lua_assert(0); break; 345 default: lua_assert(0); break;
344 } 346 }
345 } 347 }
@@ -475,7 +477,8 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
475 TValue *rb = RKB(i); 477 TValue *rb = RKB(i);
476 TValue *rc = RKC(i); 478 TValue *rc = RKC(i);
477 if (ttisnumber(rb) && ttisnumber(rc)) { 479 if (ttisnumber(rb) && ttisnumber(rc)) {
478 setnvalue(ra, num_add(nvalue(rb), nvalue(rc))); 480 lua_Number nb = nvalue(rb), nc = nvalue(rc);
481 setnvalue(ra, num_add(nb, nc));
479 } 482 }
480 else 483 else
481 base = Arith(L, ra, rb, rc, TM_ADD, pc); /***/ 484 base = Arith(L, ra, rb, rc, TM_ADD, pc); /***/
@@ -485,7 +488,8 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
485 TValue *rb = RKB(i); 488 TValue *rb = RKB(i);
486 TValue *rc = RKC(i); 489 TValue *rc = RKC(i);
487 if (ttisnumber(rb) && ttisnumber(rc)) { 490 if (ttisnumber(rb) && ttisnumber(rc)) {
488 setnvalue(ra, num_sub(nvalue(rb), nvalue(rc))); 491 lua_Number nb = nvalue(rb), nc = nvalue(rc);
492 setnvalue(ra, num_sub(nb, nc));
489 } 493 }
490 else 494 else
491 base = Arith(L, ra, rb, rc, TM_SUB, pc); /***/ 495 base = Arith(L, ra, rb, rc, TM_SUB, pc); /***/
@@ -495,7 +499,8 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
495 TValue *rb = RKB(i); 499 TValue *rb = RKB(i);
496 TValue *rc = RKC(i); 500 TValue *rc = RKC(i);
497 if (ttisnumber(rb) && ttisnumber(rc)) { 501 if (ttisnumber(rb) && ttisnumber(rc)) {
498 setnvalue(ra, num_mul(nvalue(rb), nvalue(rc))); 502 lua_Number nb = nvalue(rb), nc = nvalue(rc);
503 setnvalue(ra, num_mul(nb, nc));
499 } 504 }
500 else 505 else
501 base = Arith(L, ra, rb, rc, TM_MUL, pc); /***/ 506 base = Arith(L, ra, rb, rc, TM_MUL, pc); /***/
@@ -505,17 +510,30 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
505 TValue *rb = RKB(i); 510 TValue *rb = RKB(i);
506 TValue *rc = RKC(i); 511 TValue *rc = RKC(i);
507 if (ttisnumber(rb) && ttisnumber(rc)) { 512 if (ttisnumber(rb) && ttisnumber(rc)) {
508 setnvalue(ra, num_div(nvalue(rb), nvalue(rc))); 513 lua_Number nb = nvalue(rb), nc = nvalue(rc);
514 setnvalue(ra, num_div(nb, nc));
509 } 515 }
510 else 516 else
511 base = Arith(L, ra, rb, rc, TM_DIV, pc); /***/ 517 base = Arith(L, ra, rb, rc, TM_DIV, pc); /***/
512 continue; 518 continue;
513 } 519 }
520 case OP_MOD: {
521 TValue *rb = RKB(i);
522 TValue *rc = RKC(i);
523 if (ttisnumber(rb) && ttisnumber(rc)) {
524 lua_Number nb = nvalue(rb), nc = nvalue(rc);
525 setnvalue(ra, num_mod(nb, nc));
526 }
527 else
528 base = Arith(L, ra, rb, rc, TM_MOD, pc); /***/
529 continue;
530 }
514 case OP_POW: { 531 case OP_POW: {
515 TValue *rb = RKB(i); 532 TValue *rb = RKB(i);
516 TValue *rc = RKC(i); 533 TValue *rc = RKC(i);
517 if (ttisnumber(rb) && ttisnumber(rc)) { 534 if (ttisnumber(rb) && ttisnumber(rc)) {
518 setnvalue(ra, num_pow(nvalue(rb), nvalue(rc))); 535 lua_Number nb = nvalue(rb), nc = nvalue(rc);
536 setnvalue(ra, num_pow(nb, nc));
519 } 537 }
520 else 538 else
521 base = Arith(L, ra, rb, rc, TM_POW, pc); /***/ 539 base = Arith(L, ra, rb, rc, TM_POW, pc); /***/
@@ -525,7 +543,8 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
525 const TValue *rb = RB(i); 543 const TValue *rb = RB(i);
526 TValue temp; 544 TValue temp;
527 if (tonumber(rb, &temp)) { 545 if (tonumber(rb, &temp)) {
528 setnvalue(ra, num_unm(nvalue(rb))); 546 lua_Number nb = nvalue(rb);
547 setnvalue(ra, num_unm(nb));
529 } 548 }
530 else { 549 else {
531 setnilvalue(&temp); 550 setnilvalue(&temp);