aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-09-13 16:50:08 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-09-13 16:50:08 -0300
commit80d9b09f351c7a9be557116e9c79ae11e9b3f032 (patch)
treea6ae7cce019e85c2f79987035c77d4e4213d07a9 /lvm.c
parent029d269f4d1afd0e9ea0f889eb3e65a7f0fab0f9 (diff)
downloadlua-80d9b09f351c7a9be557116e9c79ae11e9b3f032.tar.gz
lua-80d9b09f351c7a9be557116e9c79ae11e9b3f032.tar.bz2
lua-80d9b09f351c7a9be557116e9c79ae11e9b3f032.zip
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)
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/lvm.c b/lvm.c
index be4793d1..b1e74f3d 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.290 2017/07/07 16:34:32 roberto Exp roberto $ 2** $Id: lvm.c,v 2.291 2017/08/14 18:33:14 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*/
@@ -753,10 +753,7 @@ void luaV_finishOp (lua_State *L) {
753** Execute a jump instruction. The 'updatemask' allows signals to stop 753** Execute a jump instruction. The 'updatemask' allows signals to stop
754** tight loops. (Without it, the local copy of 'mask' could never change.) 754** tight loops. (Without it, the local copy of 'mask' could never change.)
755*/ 755*/
756#define dojump(ci,i,e) \ 756#define dojump(ci,i,e) { pc += GETARG_sBx(i) + e; updatemask(L); }
757 { int a = GETARG_A(i); \
758 if (a != 0) luaF_close(L, ci->func + a); \
759 pc += GETARG_sBx(i) + e; updatemask(L); }
760 757
761 758
762/* for test instructions, execute the jump instruction that follows it */ 759/* for test instructions, execute the jump instruction that follows it */
@@ -1201,6 +1198,10 @@ void luaV_execute (lua_State *L) {
1201 L->top = ci->top; /* restore top */ 1198 L->top = ci->top; /* restore top */
1202 vmbreak; 1199 vmbreak;
1203 } 1200 }
1201 vmcase(OP_CLOSE) {
1202 luaF_close(L, ra);
1203 vmbreak;
1204 }
1204 vmcase(OP_JMP) { 1205 vmcase(OP_JMP) {
1205 dojump(ci, i, 0); 1206 dojump(ci, i, 0);
1206 vmbreak; 1207 vmbreak;