diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-03-08 15:00:16 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-03-08 15:00:16 -0300 |
| commit | 7d57ea70bc975922485d589c8a6d8dedaa0fba02 (patch) | |
| tree | d7f7da1492de151749a69042cd2bf63320638020 /lvm.c | |
| parent | 2d5b923759a77d8f5f7bfa62906ea37f46b9281d (diff) | |
| download | lua-7d57ea70bc975922485d589c8a6d8dedaa0fba02.tar.gz lua-7d57ea70bc975922485d589c8a6d8dedaa0fba02.tar.bz2 lua-7d57ea70bc975922485d589c8a6d8dedaa0fba02.zip | |
new `mod' (`%') operator
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 43 |
1 files changed, 31 insertions, 12 deletions
| @@ -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); |
