From 80d9b09f351c7a9be557116e9c79ae11e9b3f032 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 13 Sep 2017 16:50:08 -0300 Subject: jumps do not close upvalues (to be faster and simpler); explicit instruction to close upvalues; command 'break' not handled like a 'goto' (to optimize removal of uneeded 'close' instructions) --- lvm.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'lvm.c') diff --git a/lvm.c b/lvm.c index be4793d1..b1e74f3d 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.290 2017/07/07 16:34:32 roberto Exp roberto $ +** $Id: lvm.c,v 2.291 2017/08/14 18:33:14 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -753,10 +753,7 @@ void luaV_finishOp (lua_State *L) { ** Execute a jump instruction. The 'updatemask' allows signals to stop ** tight loops. (Without it, the local copy of 'mask' could never change.) */ -#define dojump(ci,i,e) \ - { int a = GETARG_A(i); \ - if (a != 0) luaF_close(L, ci->func + a); \ - pc += GETARG_sBx(i) + e; updatemask(L); } +#define dojump(ci,i,e) { pc += GETARG_sBx(i) + e; updatemask(L); } /* for test instructions, execute the jump instruction that follows it */ @@ -1201,6 +1198,10 @@ void luaV_execute (lua_State *L) { L->top = ci->top; /* restore top */ vmbreak; } + vmcase(OP_CLOSE) { + luaF_close(L, ra); + vmbreak; + } vmcase(OP_JMP) { dojump(ci, i, 0); vmbreak; -- cgit v1.2.3-55-g6feb