diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-04-07 10:13:11 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-04-07 10:13:11 -0300 |
| commit | 031978798cc404c2c6757c564675d43a7da129ee (patch) | |
| tree | 993e59994258f1a9176d7d260214b132d0b2baa9 /lvm.c | |
| parent | 14251c5a5640f73f8f98d2445900a3c3a8d472fb (diff) | |
| download | lua-031978798cc404c2c6757c564675d43a7da129ee.tar.gz lua-031978798cc404c2c6757c564675d43a7da129ee.tar.bz2 lua-031978798cc404c2c6757c564675d43a7da129ee.zip | |
more optimizations
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 44 |
1 files changed, 24 insertions, 20 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.98 2000/03/29 20:19:20 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.99 2000/04/04 20:48:44 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 | */ |
| @@ -231,6 +231,13 @@ static void call_arith (lua_State *L, StkId top, IMS event) { | |||
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | 233 | ||
| 234 | static void addK (lua_State *L, StkId top, int k) { | ||
| 235 | ttype(top) = TAG_NUMBER; | ||
| 236 | nvalue(top) = (Number)k; | ||
| 237 | call_arith(L, top+1, IM_ADD); | ||
| 238 | } | ||
| 239 | |||
| 240 | |||
| 234 | static int luaV_strcomp (const TString *ls, const TString *rs) { | 241 | static int luaV_strcomp (const TString *ls, const TString *rs) { |
| 235 | const char *l = ls->str; | 242 | const char *l = ls->str; |
| 236 | long ll = ls->u.s.len; | 243 | long ll = ls->u.s.len; |
| @@ -403,7 +410,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 403 | *top++ = cl->consts[GETARG_U(i)]; | 410 | *top++ = cl->consts[GETARG_U(i)]; |
| 404 | break; | 411 | break; |
| 405 | 412 | ||
| 406 | case OP_PUSHLOCAL: | 413 | case OP_GETLOCAL: |
| 407 | *top++ = *(base+GETARG_U(i)); | 414 | *top++ = *(base+GETARG_U(i)); |
| 408 | break; | 415 | break; |
| 409 | 416 | ||
| @@ -424,6 +431,12 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 424 | top--; | 431 | top--; |
| 425 | break; | 432 | break; |
| 426 | 433 | ||
| 434 | case OP_GETINDEXED: | ||
| 435 | *top++ = *(base+GETARG_U(i)); | ||
| 436 | luaV_gettable(L, top); | ||
| 437 | top--; | ||
| 438 | break; | ||
| 439 | |||
| 427 | case OP_PUSHSELF: { | 440 | case OP_PUSHSELF: { |
| 428 | TObject receiver; | 441 | TObject receiver; |
| 429 | receiver = *(top-1); | 442 | receiver = *(top-1); |
| @@ -443,7 +456,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 443 | break; | 456 | break; |
| 444 | 457 | ||
| 445 | case OP_SETLOCAL: | 458 | case OP_SETLOCAL: |
| 446 | *(base+GETARG_U(i)) = *(--top); | 459 | *(base+GETARG_A(i)) = *(top-1); |
| 460 | top -= GETARG_B(i); | ||
| 447 | break; | 461 | break; |
| 448 | 462 | ||
| 449 | case OP_SETGLOBAL: | 463 | case OP_SETGLOBAL: |
| @@ -451,14 +465,9 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 451 | top--; | 465 | top--; |
| 452 | break; | 466 | break; |
| 453 | 467 | ||
| 454 | case OP_SETTABLEPOP: | ||
| 455 | luaV_settable(L, top-3, top); | ||
| 456 | top -= 3; /* pop table, index, and value */ | ||
| 457 | break; | ||
| 458 | |||
| 459 | case OP_SETTABLE: | 468 | case OP_SETTABLE: |
| 460 | luaV_settable(L, top-3-GETARG_U(i), top); | 469 | luaV_settable(L, top-GETARG_A(i), top); |
| 461 | top--; /* pop value */ | 470 | top -= GETARG_B(i); /* pop values */ |
| 462 | break; | 471 | break; |
| 463 | 472 | ||
| 464 | case OP_SETLIST: { | 473 | case OP_SETLIST: { |
| @@ -496,9 +505,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 496 | int n = GETARG_sA(i); | 505 | int n = GETARG_sA(i); |
| 497 | if (tonumber(var)) { | 506 | if (tonumber(var)) { |
| 498 | *top = *var; /* PUSHLOCAL */ | 507 | *top = *var; /* PUSHLOCAL */ |
| 499 | ttype(top+1) = TAG_NUMBER; | 508 | addK(L, top+1, n); |
| 500 | nvalue(top+1) = (Number)n; /* PUSHINT */ | ||
| 501 | call_arith(L, top+2, IM_ADD); | ||
| 502 | *var = *top; /* SETLOCAL */ | 509 | *var = *top; /* SETLOCAL */ |
| 503 | } | 510 | } |
| 504 | else | 511 | else |
| @@ -507,11 +514,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 507 | } | 514 | } |
| 508 | 515 | ||
| 509 | case OP_ADDI: | 516 | case OP_ADDI: |
| 510 | if (tonumber(top-1)) { | 517 | if (tonumber(top-1)) |
| 511 | ttype(top) = TAG_NUMBER; | 518 | addK(L, top, GETARG_S(i)); |
| 512 | nvalue(top) = (Number)GETARG_S(i); | ||
| 513 | call_arith(L, top+1, IM_ADD); | ||
| 514 | } | ||
| 515 | else | 519 | else |
| 516 | nvalue(top-1) += (Number)GETARG_S(i); | 520 | nvalue(top-1) += (Number)GETARG_S(i); |
| 517 | break; | 521 | break; |
| @@ -545,7 +549,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 545 | top--; | 549 | top--; |
| 546 | break; | 550 | break; |
| 547 | 551 | ||
| 548 | case OP_CONC: { | 552 | case OP_CONCAT: { |
| 549 | int n = GETARG_U(i); | 553 | int n = GETARG_U(i); |
| 550 | strconc(L, n, top); | 554 | strconc(L, n, top); |
| 551 | top -= n-1; | 555 | top -= n-1; |
| @@ -569,7 +573,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 569 | nvalue(top-1) = 1; | 573 | nvalue(top-1) = 1; |
| 570 | break; | 574 | break; |
| 571 | 575 | ||
| 572 | case OP_JMPNEQ: | 576 | case OP_JMPNE: |
| 573 | top -= 2; | 577 | top -= 2; |
| 574 | if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i); | 578 | if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i); |
| 575 | break; | 579 | break; |
