From 1f2ee3c81f27f253178100c2d5dd8e7f19a0d9f6 Mon Sep 17 00:00:00 2001 From: Graham Date: Sat, 8 Aug 2020 21:02:22 +0100 Subject: [PATCH] Inline assignments made before a return Extracted from https://github.com/MinecraftForge/ForgeFlower/blob/master/FernFlower-Patches/0030-Improve-stack-var-processor-output.patch --- .../decompiler/SimplifyExprentsHelper.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/SimplifyExprentsHelper.java b/src/org/jetbrains/java/decompiler/modules/decompiler/SimplifyExprentsHelper.java index 72c845f..bcbf277 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/SimplifyExprentsHelper.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/SimplifyExprentsHelper.java @@ -128,6 +128,11 @@ public class SimplifyExprentsHelper { } Exprent next = list.get(index + 1); + if (isAssignmentReturn(current, next)) { + list.remove(index); + res = true; + continue; + } // constructor invocation if (isConstructorInvocationRemote(list, index)) { @@ -335,6 +340,27 @@ public class SimplifyExprentsHelper { return 0; } + private static boolean isAssignmentReturn(Exprent first, Exprent second) { + //If assignment then exit. + if (first.type == Exprent.EXPRENT_ASSIGNMENT && second.type == Exprent.EXPRENT_EXIT) { + AssignmentExprent assignment = (AssignmentExprent) first; + ExitExprent exit = (ExitExprent) second; + //if simple assign and exit is return and return isn't void + if (assignment.getCondType() == AssignmentExprent.CONDITION_NONE && exit.getExitType() == ExitExprent.EXIT_RETURN && exit.getValue() != null) { + if (assignment.getLeft().type == Exprent.EXPRENT_VAR && exit.getValue().type == Exprent.EXPRENT_VAR) { + VarExprent assignmentLeft = (VarExprent) assignment.getLeft(); + VarExprent exitValue = (VarExprent) exit.getValue(); + //If the assignment before the return is immediately used in the return, inline it. + if (assignmentLeft.equals(exitValue) && !assignmentLeft.isStack() && !exitValue.isStack()) { + exit.replaceExprent(exitValue, assignment.getRight()); + return true; + } + } + } + } + return false; + } + private static boolean isTrivialStackAssignment(Exprent first) { if (first.type == Exprent.EXPRENT_ASSIGNMENT) { AssignmentExprent asf = (AssignmentExprent)first;