diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-12-11 20:48:44 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-12-11 20:48:44 -0200 |
commit | 9aff171f3bf0125314a29a5ca952470b2d83708e (patch) | |
tree | 8d1b400e0108198bde554a31731c655113bc4086 /lvm.c | |
parent | ed9be5e1f0d4b68aa848f85744ad959d7a57c9f4 (diff) | |
download | lua-9aff171f3bf0125314a29a5ca952470b2d83708e.tar.gz lua-9aff171f3bf0125314a29a5ca952470b2d83708e.tar.bz2 lua-9aff171f3bf0125314a29a5ca952470b2d83708e.zip |
new type `boolean'
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 26 |
1 files changed, 12 insertions, 14 deletions
@@ -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); |