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