Another way to compile goto's

The compilation of a goto or a label just create an entry and generate
boilerplate code for the gotos. As we don't know yet whether it needs a
CLOSE, we code a jump followed by a CLOSE, which is then dead code.

When a block ends (and then we know for sure whether there are variables
that need to be closed), we check the goto's against the labels of that
block. When closing a goto against a label, if it needs a CLOSE, the
compiler swaps the order of the jump and the CLOSE, making the CLOSE
active.
This commit is contained in:
Roberto Ierusalimschy
2025-01-10 13:54:51 -03:00
parent 8a3a49250c
commit 7ca3c40b50
6 changed files with 120 additions and 122 deletions

1
lvm.c
View File

@@ -1590,6 +1590,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
}
vmcase(OP_CLOSE) {
StkId ra = RA(i);
lua_assert(!GETARG_B(i)); /* 'close must be alive */
Protect(luaF_close(L, ra, LUA_OK, 1));
vmbreak;
}