From 7ca3c40b50b385ead6b8bc4c54de97b61d11a12a Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 10 Jan 2025 13:54:51 -0300 Subject: 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. --- lparser.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lparser.h') diff --git a/lparser.h b/lparser.h index 589befdb..a8004fa0 100644 --- a/lparser.h +++ b/lparser.h @@ -112,7 +112,7 @@ typedef struct Labeldesc { int pc; /* position in code */ int line; /* line where it appeared */ lu_byte nactvar; /* number of active variables in that position */ - lu_byte close; /* goto that escapes upvalues */ + lu_byte close; /* true for goto that escapes upvalues */ } Labeldesc; -- cgit v1.2.3-55-g6feb