Mercurial > p > unluac > hgcode
changeset 494:b513f1da577b
Fix some issues with label placement (with regard to beginnings of blocks)
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"),