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); |
