From 0fe2576a39633ab7873f9d4fd989f1e5203a5725 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 26 Feb 2010 17:40:29 -0300 Subject: new instructions to optimize indexing on upvalues --- lcode.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'lcode.c') diff --git a/lcode.c b/lcode.c index 0d570c65..a61ef112 100644 --- a/lcode.c +++ b/lcode.c @@ -1,5 +1,5 @@ /* -** $Id: lcode.c,v 2.42 2009/09/23 20:33:05 roberto Exp roberto $ +** $Id: lcode.c,v 2.43 2010/01/11 17:38:30 roberto Exp roberto $ ** Code generator for Lua ** See Copyright Notice in lua.h */ @@ -384,6 +384,12 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) { e->k = VRELOCABLE; break; } + case VINDEXEDUP: { + freereg(fs, e->u.s.aux); + e->u.s.info = luaK_codeABC(fs, OP_GETTABUP, 0, e->u.s.info, e->u.s.aux); + e->k = VRELOCABLE; + break; + } case VVARARG: case VCALL: { luaK_setoneret(fs, e); @@ -493,6 +499,12 @@ int luaK_exp2anyreg (FuncState *fs, expdesc *e) { } +void luaK_exp2anyregup (FuncState *fs, expdesc *e) { + if (e->k != VUPVAL || hasjumps(e)) + luaK_exp2anyreg(fs, e); +} + + void luaK_exp2val (FuncState *fs, expdesc *e) { if (hasjumps(e)) luaK_exp2anyreg(fs, e); @@ -553,6 +565,11 @@ void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e); break; } + case VINDEXEDUP: { + int e = luaK_exp2RK(fs, ex); + luaK_codeABC(fs, OP_SETTABUP, var->u.s.info, var->u.s.aux, e); + break; + } default: { lua_assert(0); /* invalid var kind to store */ break; @@ -695,8 +712,9 @@ static void codenot (FuncState *fs, expdesc *e) { void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { + lua_assert(!hasjumps(t)); t->u.s.aux = luaK_exp2RK(fs, k); - t->k = VINDEXED; + t->k = (t->k == VUPVAL) ? VINDEXEDUP : VINDEXED; } -- cgit v1.2.3-55-g6feb