Mercurial > p > unluac > hgcode
changeset 521:7f2f283699b5
Resolving else could break hanger resolution
This might be too aggressive, but it doesn't break any existing test...
author | tehtmi |
---|---|
date | Sun, 24 Dec 2023 17:21:59 -0800 |
parents | a8191c4334b8 |
children | d01ab6b389a8 |
files | src/unluac/decompile/ControlFlowHandler.java src/unluac/test/TestFiles.java test/src/break26.lua |
diffstat | 3 files changed, 28 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/unluac/decompile/ControlFlowHandler.java Fri Dec 15 22:45:23 2023 -0800 +++ b/src/unluac/decompile/ControlFlowHandler.java Sun Dec 24 17:21:59 2023 -0800 @@ -978,6 +978,11 @@ } if(top != null && top.targetSecond - 1 == b.line) { if(top.targetSecond != b.targetSecond) { + // resolve intervening hangers + while(!hangingResolver.isEmpty() && !hanging.isEmpty() && is_hanger_resolvable(state, declList, hanging.peek(), hangingResolver.peek())) { + resolve_hanger(state, declList, stack, hanging.pop(), hangingResolver.peek()); + } + resolve_else(state, stack, hanging, elseStack, top, b, tailTargetSecond); stack.pop(); } else if(!splits_decl(top.line, top.targetFirst, top.targetSecond - 1, declList)) {
--- a/src/unluac/test/TestFiles.java Fri Dec 15 22:45:23 2023 -0800 +++ b/src/unluac/test/TestFiles.java Sun Dec 24 17:21:59 2023 -0800 @@ -218,6 +218,7 @@ new TestFile("break23", TestFile.DEFAULT_VERSION, TestFile.RELAXED_SCOPE), //TODO: relaxed scope is maybe not necessary if scopes inform hanger resolution? new TestFile("break24"), new TestFile("break25"), + new TestFile("break26"), new TestFile("close01"), new TestFile("close02"), new TestFile("close03"),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/src/break26.lua Sun Dec 24 17:21:59 2023 -0800 @@ -0,0 +1,22 @@ +for k, v in pairs(t) do + if v.x == 1 then + if v.y == 1 then + print("A") + break + elseif v.y == 2 then + print("B") + if v.z == 1 then + print("C") + end + break + end + elseif v.x == 2 then + if v.y == 1 then + print("D") + break + elseif v.y == 2 then + print("E") + break + end + end +end