summaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-12-11 20:48:44 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-12-11 20:48:44 -0200
commit9aff171f3bf0125314a29a5ca952470b2d83708e (patch)
tree8d1b400e0108198bde554a31731c655113bc4086 /lvm.c
parented9be5e1f0d4b68aa848f85744ad959d7a57c9f4 (diff)
downloadlua-9aff171f3bf0125314a29a5ca952470b2d83708e.tar.gz
lua-9aff171f3bf0125314a29a5ca952470b2d83708e.tar.bz2
lua-9aff171f3bf0125314a29a5ca952470b2d83708e.zip
new type `boolean'
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/lvm.c b/lvm.c
index b49d8365..253c01a4 100644
--- a/lvm.c
+++ b/lvm.c
@@ -223,7 +223,7 @@ int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r) {
223 else { /* try TM */ 223 else { /* try TM */
224 if (!call_binTM(L, l, r, L->top, TM_LT)) 224 if (!call_binTM(L, l, r, L->top, TM_LT))
225 luaG_ordererror(L, l, r); 225 luaG_ordererror(L, l, r);
226 return (ttype(L->top) != LUA_TNIL); 226 return !l_isfalse(L->top);
227 } 227 }
228} 228}
229 229
@@ -369,6 +369,11 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
369 setnvalue(ra, (lua_Number)GETARG_sBc(i)); 369 setnvalue(ra, (lua_Number)GETARG_sBc(i));
370 break; 370 break;
371 } 371 }
372 case OP_LOADBOOL: {
373 setbvalue(ra, GETARG_B(i));
374 if (GETARG_C(i)) pc++; /* skip next instruction (if C) */
375 break;
376 }
372 case OP_LOADNIL: { 377 case OP_LOADNIL: {
373 TObject *rb = RB(i); 378 TObject *rb = RB(i);
374 do { 379 do {
@@ -450,11 +455,8 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
450 break; 455 break;
451 } 456 }
452 case OP_NOT: { 457 case OP_NOT: {
453 if (ttype(RB(i)) == LUA_TNIL) { 458 int res = l_isfalse(RB(i)); /* next assignment may change this value */
454 setnvalue(ra, 1); 459 setbvalue(ra, res);
455 } else {
456 setnilvalue(ra);
457 }
458 break; 460 break;
459 } 461 }
460 case OP_CONCAT: { 462 case OP_CONCAT: {
@@ -508,7 +510,7 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
508 case OP_TESTT: { 510 case OP_TESTT: {
509 StkId rb = RB(i); 511 StkId rb = RB(i);
510 lua_assert(GET_OPCODE(*pc) == OP_CJMP); 512 lua_assert(GET_OPCODE(*pc) == OP_CJMP);
511 if (ttype(rb) != LUA_TNIL) { 513 if (!l_isfalse(rb)) {
512 setobj(ra, rb); 514 setobj(ra, rb);
513 dojump(pc, *pc); 515 dojump(pc, *pc);
514 } 516 }
@@ -516,19 +518,15 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
516 break; 518 break;
517 } 519 }
518 case OP_TESTF: { 520 case OP_TESTF: {
521 StkId rb = RB(i);
519 lua_assert(GET_OPCODE(*pc) == OP_CJMP); 522 lua_assert(GET_OPCODE(*pc) == OP_CJMP);
520 if (ttype(RB(i)) == LUA_TNIL) { 523 if (l_isfalse(rb)) {
521 setnilvalue(ra); 524 setobj(ra, rb);
522 dojump(pc, *pc); 525 dojump(pc, *pc);
523 } 526 }
524 pc++; 527 pc++;
525 break; 528 break;
526 } 529 }
527 case OP_NILJMP: {
528 setnilvalue(ra);
529 pc++;
530 break;
531 }
532 case OP_CALL: { 530 case OP_CALL: {
533 int c; 531 int c;
534 int b = GETARG_B(i); 532 int b = GETARG_B(i);