aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-11-01 14:08:45 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-11-01 14:08:45 -0200
commita160266c3d2d6fabbb06e9c77e6bf5a7c8ed06c2 (patch)
tree79eeaf71ba5ffa3b11f7e5d3a7996e32dff35b35
parentd4c99b26731f2706cb83aca0f5f4c1e821a4f8d7 (diff)
downloadlua-a160266c3d2d6fabbb06e9c77e6bf5a7c8ed06c2.tar.gz
lua-a160266c3d2d6fabbb06e9c77e6bf5a7c8ed06c2.tar.bz2
lua-a160266c3d2d6fabbb06e9c77e6bf5a7c8ed06c2.zip
details
-rw-r--r--lvm.c70
1 files changed, 20 insertions, 50 deletions
diff --git a/lvm.c b/lvm.c
index 87d3d0dc..29f432b3 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.57 2005/10/13 12:21:26 roberto Exp roberto $ 2** $Id: lvm.c,v 2.58 2005/10/24 17:37:52 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*/
@@ -65,7 +65,6 @@ static void traceexec (lua_State *L, const Instruction *pc) {
65 if (L->hookcount == 0) { 65 if (L->hookcount == 0) {
66 resethookcount(L); 66 resethookcount(L);
67 luaD_callhook(L, LUA_HOOKCOUNT, -1); 67 luaD_callhook(L, LUA_HOOKCOUNT, -1);
68 return;
69 } 68 }
70 } 69 }
71 if (mask & LUA_MASKLINE) { 70 if (mask & LUA_MASKLINE) {
@@ -357,6 +356,19 @@ static void Arith (lua_State *L, StkId ra, const TValue *rb,
357#define Protect(x) { L->savedpc = pc; {x;}; base = L->base; } 356#define Protect(x) { L->savedpc = pc; {x;}; base = L->base; }
358 357
359 358
359#define arith_op(op,tm) { \
360 TValue *rb = RKB(i); \
361 TValue *rc = RKC(i); \
362 if (ttisnumber(rb) && ttisnumber(rc)) { \
363 lua_Number nb = nvalue(rb), nc = nvalue(rc); \
364 setnvalue(ra, op(nb, nc)); \
365 } \
366 else \
367 Protect(Arith(L, ra, rb, rc, tm)); \
368 }
369
370
371
360void luaV_execute (lua_State *L, int nexeccalls) { 372void luaV_execute (lua_State *L, int nexeccalls) {
361 LClosure *cl; 373 LClosure *cl;
362 StkId base; 374 StkId base;
@@ -454,69 +466,27 @@ void luaV_execute (lua_State *L, int nexeccalls) {
454 continue; 466 continue;
455 } 467 }
456 case OP_ADD: { 468 case OP_ADD: {
457 TValue *rb = RKB(i); 469 arith_op(luai_numadd, TM_ADD);
458 TValue *rc = RKC(i);
459 if (ttisnumber(rb) && ttisnumber(rc)) {
460 lua_Number nb = nvalue(rb), nc = nvalue(rc);
461 setnvalue(ra, luai_numadd(nb, nc));
462 }
463 else
464 Protect(Arith(L, ra, rb, rc, TM_ADD));
465 continue; 470 continue;
466 } 471 }
467 case OP_SUB: { 472 case OP_SUB: {
468 TValue *rb = RKB(i); 473 arith_op(luai_numsub, TM_SUB);
469 TValue *rc = RKC(i);
470 if (ttisnumber(rb) && ttisnumber(rc)) {
471 lua_Number nb = nvalue(rb), nc = nvalue(rc);
472 setnvalue(ra, luai_numsub(nb, nc));
473 }
474 else
475 Protect(Arith(L, ra, rb, rc, TM_SUB));
476 continue; 474 continue;
477 } 475 }
478 case OP_MUL: { 476 case OP_MUL: {
479 TValue *rb = RKB(i); 477 arith_op(luai_nummul, TM_MUL);
480 TValue *rc = RKC(i);
481 if (ttisnumber(rb) && ttisnumber(rc)) {
482 lua_Number nb = nvalue(rb), nc = nvalue(rc);
483 setnvalue(ra, luai_nummul(nb, nc));
484 }
485 else
486 Protect(Arith(L, ra, rb, rc, TM_MUL));
487 continue; 478 continue;
488 } 479 }
489 case OP_DIV: { 480 case OP_DIV: {
490 TValue *rb = RKB(i); 481 arith_op(luai_numdiv, TM_DIV);
491 TValue *rc = RKC(i);
492 if (ttisnumber(rb) && ttisnumber(rc)) {
493 lua_Number nb = nvalue(rb), nc = nvalue(rc);
494 setnvalue(ra, luai_numdiv(nb, nc));
495 }
496 else
497 Protect(Arith(L, ra, rb, rc, TM_DIV));
498 continue; 482 continue;
499 } 483 }
500 case OP_MOD: { 484 case OP_MOD: {
501 TValue *rb = RKB(i); 485 arith_op(luai_nummod, TM_MOD);
502 TValue *rc = RKC(i);
503 if (ttisnumber(rb) && ttisnumber(rc)) {
504 lua_Number nb = nvalue(rb), nc = nvalue(rc);
505 setnvalue(ra, luai_nummod(nb, nc));
506 }
507 else
508 Protect(Arith(L, ra, rb, rc, TM_MOD));
509 continue; 486 continue;
510 } 487 }
511 case OP_POW: { 488 case OP_POW: {
512 TValue *rb = RKB(i); 489 arith_op(luai_numpow, TM_POW);
513 TValue *rc = RKC(i);
514 if (ttisnumber(rb) && ttisnumber(rc)) {
515 lua_Number nb = nvalue(rb), nc = nvalue(rc);
516 setnvalue(ra, luai_numpow(nb, nc));
517 }
518 else
519 Protect(Arith(L, ra, rb, rc, TM_POW));
520 continue; 490 continue;
521 } 491 }
522 case OP_UNM: { 492 case OP_UNM: {