aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-02-26 17:40:29 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-02-26 17:40:29 -0300
commit0fe2576a39633ab7873f9d4fd989f1e5203a5725 (patch)
treec759f10fb3565f924dad29874d85d9d1b139c3bf /lvm.c
parentd08d237a49ff3cb961012b1de374914af6da3000 (diff)
downloadlua-0fe2576a39633ab7873f9d4fd989f1e5203a5725.tar.gz
lua-0fe2576a39633ab7873f9d4fd989f1e5203a5725.tar.bz2
lua-0fe2576a39633ab7873f9d4fd989f1e5203a5725.zip
new instructions to optimize indexing on upvalues
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/lvm.c b/lvm.c
index 7ee9388f..ae4f6293 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.102 2009/12/17 16:20:01 roberto Exp roberto $ 2** $Id: lvm.c,v 2.103 2010/01/15 16:23:58 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*/
@@ -362,7 +362,7 @@ void luaV_finishOp (lua_State *L) {
362 switch (op) { /* finish its execution */ 362 switch (op) { /* finish its execution */
363 case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV: 363 case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV:
364 case OP_MOD: case OP_POW: case OP_UNM: case OP_LEN: 364 case OP_MOD: case OP_POW: case OP_UNM: case OP_LEN:
365 case OP_GETGLOBAL: case OP_GETTABLE: case OP_SELF: { 365 case OP_GETGLOBAL: case OP_GETTABUP: case OP_GETTABLE: case OP_SELF: {
366 setobjs2s(L, base + GETARG_A(inst), --L->top); 366 setobjs2s(L, base + GETARG_A(inst), --L->top);
367 break; 367 break;
368 } 368 }
@@ -403,7 +403,7 @@ void luaV_finishOp (lua_State *L) {
403 L->top = ci->top; /* adjust results */ 403 L->top = ci->top; /* adjust results */
404 break; 404 break;
405 } 405 }
406 case OP_TAILCALL: case OP_SETGLOBAL: case OP_SETTABLE: 406 case OP_TAILCALL: case OP_SETGLOBAL: case OP_SETTABUP: case OP_SETTABLE:
407 break; 407 break;
408 default: lua_assert(0); 408 default: lua_assert(0);
409 } 409 }
@@ -504,6 +504,11 @@ void luaV_execute (lua_State *L) {
504 Protect(luaV_gettable(L, &g, rb, ra)); 504 Protect(luaV_gettable(L, &g, rb, ra));
505 continue; 505 continue;
506 } 506 }
507 case OP_GETTABUP: {
508 int b = GETARG_B(i);
509 Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra));
510 continue;
511 }
507 case OP_GETTABLE: { 512 case OP_GETTABLE: {
508 Protect(luaV_gettable(L, RB(i), RKC(i), ra)); 513 Protect(luaV_gettable(L, RB(i), RKC(i), ra));
509 continue; 514 continue;
@@ -516,6 +521,11 @@ void luaV_execute (lua_State *L) {
516 Protect(luaV_settable(L, &g, rb, ra)); 521 Protect(luaV_settable(L, &g, rb, ra));
517 continue; 522 continue;
518 } 523 }
524 case OP_SETTABUP: {
525 int a = GETARG_A(i);
526 Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i)));
527 continue;
528 }
519 case OP_SETUPVAL: { 529 case OP_SETUPVAL: {
520 UpVal *uv = cl->upvals[GETARG_B(i)]; 530 UpVal *uv = cl->upvals[GETARG_B(i)];
521 setobj(L, uv->v, ra); 531 setobj(L, uv->v, ra);