changeset 494:b513f1da577b

Fix some issues with label placement (with regard to beginnings of blocks)
author tehtmi
date Sat, 06 May 2023 18:55:14 -0700
parents 3bf1a16c5c25
children cc858b402f6d
files src/unluac/decompile/Decompiler.java src/unluac/decompile/block/AlwaysLoop.java src/unluac/decompile/block/Block.java src/unluac/decompile/block/Break.java src/unluac/decompile/block/DoEndBlock.java src/unluac/decompile/block/ElseEndBlock.java src/unluac/decompile/block/ForBlock.java src/unluac/decompile/block/Goto.java src/unluac/decompile/block/IfThenElseBlock.java src/unluac/decompile/block/IfThenEndBlock.java src/unluac/decompile/block/OnceLoop.java src/unluac/decompile/block/OuterBlock.java src/unluac/decompile/block/RepeatBlock.java src/unluac/decompile/block/SetBlock.java src/unluac/decompile/block/TForBlock.java src/unluac/decompile/block/WhileBlock.java src/unluac/test/TestFiles.java test/src/52_goto08.lua
diffstat 18 files changed, 105 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/unluac/decompile/Decompiler.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/Decompiler.java	Sat May 06 18:55:14 2023 -0700
@@ -872,11 +872,6 @@
         operations = Arrays.asList(operation);
         prevLocals = r.getNewLocals(line - 1);
       } else {
-        if(!labels_handled[line] && state.labels[line]) {
-          blockStack.peek().addStatement(new Label(line));
-          labels_handled[line] = true;
-        }
-        
         List<Declaration> locals = r.getNewLocals(line, blockStack.peek().closeRegister);
         while(blockContainerIndex < blockContainers.size() && blockContainers.get(blockContainerIndex).begin <= line) {
           Block next = blockContainers.get(blockContainerIndex++);
@@ -893,8 +888,22 @@
             }
             blockStack.peek().addStatement(declaration);
           }
+          
+          if(!next.hasHeader()) {
+            if(!labels_handled[line] && state.labels[line]) {
+              blockStack.peek().addStatement(new Label(line));
+              labels_handled[line] = true;
+            }
+          }
+          
           blockStack.push(next);
         }
+        
+        if(!labels_handled[line] && state.labels[line]) {
+          blockStack.peek().addStatement(new Label(line));
+          labels_handled[line] = true;
+        }
+        
       }
       
       Block block = blockStack.peek();
--- a/src/unluac/decompile/block/AlwaysLoop.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/AlwaysLoop.java	Sat May 06 18:55:14 2023 -0700
@@ -1,5 +1,6 @@
 package unluac.decompile.block;
 
+import unluac.Version;
 import unluac.decompile.CloseType;
 import unluac.decompile.Decompiler;
 import unluac.decompile.Function;
@@ -13,10 +14,12 @@
   private final boolean repeat;
   
   private ConstantExpression condition;
+  private Version.WhileFormat whileFormat;
   
   public AlwaysLoop(LFunction function, int begin, int end, CloseType closeType, int closeLine, boolean repeat) {
     super(function, begin, end, closeType, closeLine, 0);
     this.repeat = repeat;
+    this.whileFormat = function.header.version.whileformat.get();
     condition = null;
   }
   
@@ -31,6 +34,17 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    if(whileFormat == Version.WhileFormat.BOTTOM_CONDITION) {
+      return !repeat;
+    } else {
+      return false;
+    }
+  }
+  
+  
+  
+  @Override
   public boolean isUnprotected() {
     return true;
   }
--- a/src/unluac/decompile/block/Block.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/Block.java	Sat May 06 18:55:14 2023 -0700
@@ -64,6 +64,8 @@
     throw new IllegalStateException();
   }
   
+  abstract public boolean hasHeader();
+  
   /**
    * An unprotected block is one that ends in a JMP instruction.
    * If this is the case, any inner statement that tries to jump
--- a/src/unluac/decompile/block/Break.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/Break.java	Sat May 06 18:55:14 2023 -0700
@@ -42,6 +42,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return false;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     //Actually, it is unprotected, but not really a block
     return false;
--- a/src/unluac/decompile/block/DoEndBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/DoEndBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -18,6 +18,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return false;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return false;
   }
--- a/src/unluac/decompile/block/ElseEndBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/ElseEndBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -35,6 +35,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return true;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return false;
   }
--- a/src/unluac/decompile/block/ForBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/ForBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -53,6 +53,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return true;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return false;
   }
--- a/src/unluac/decompile/block/Goto.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/Goto.java	Sat May 06 18:55:14 2023 -0700
@@ -41,6 +41,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return true;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     //Actually, it is unprotected, but not really a block
     return false;
--- a/src/unluac/decompile/block/IfThenElseBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/IfThenElseBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -63,6 +63,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return true;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return true;
   }
--- a/src/unluac/decompile/block/IfThenEndBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/IfThenEndBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -63,6 +63,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return false;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return false;
   }
--- a/src/unluac/decompile/block/OnceLoop.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/OnceLoop.java	Sat May 06 18:55:14 2023 -0700
@@ -23,6 +23,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return false;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return false;
   }
--- a/src/unluac/decompile/block/OuterBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/OuterBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -19,6 +19,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return false;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return false;
   }
--- a/src/unluac/decompile/block/RepeatBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/RepeatBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -54,6 +54,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return false;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return false;
   }
--- a/src/unluac/decompile/block/SetBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/SetBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -50,6 +50,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return true;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return false;
   }
--- a/src/unluac/decompile/block/TForBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/TForBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -151,6 +151,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return true;
+  }
+  
+  @Override
   public boolean isUnprotected() {
     return false;
   }
--- a/src/unluac/decompile/block/WhileBlock.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/decompile/block/WhileBlock.java	Sat May 06 18:55:14 2023 -0700
@@ -41,6 +41,11 @@
   }
   
   @Override
+  public boolean hasHeader() {
+    return true;
+  }
+  
+  @Override
   public int getLoopback() {
     throw new IllegalStateException();
   }
--- a/src/unluac/test/TestFiles.java	Mon Apr 10 23:03:29 2023 -0700
+++ b/src/unluac/test/TestFiles.java	Sat May 06 18:55:14 2023 -0700
@@ -262,6 +262,7 @@
     new TestFile("52_goto04"),
     new TestFile("52_goto05"),
     new TestFile("52_goto06"),
+    new TestFile("52_goto08"),
     new TestFile("53_expression"),
     new TestFile("53_expression02"),
     new TestFile("54_tbc01"),
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/src/52_goto08.lua	Sat May 06 18:55:14 2023 -0700
@@ -0,0 +1,9 @@
+for i=1,10 do
+  ::enter::
+  repeat
+  	
+  until cond()
+  for j=1,10 do
+  	goto enter
+  end
+end