Skip to content
This repository was archived by the owner on May 12, 2024. It is now read-only.

Commit 6aba596

Browse files
committed
Added DowngradeResult
1 parent 8f31a46 commit 6aba596

53 files changed

Lines changed: 314 additions & 171 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* This file is part of JavaDowngrader - https://github.com/RaphiMC/JavaDowngrader
3+
* Copyright (C) 2023 RK_01/RaphiMC and contributors
4+
*
5+
* This program is free software; you can redistribute it and/or
6+
* modify it under the terms of the GNU Lesser General Public
7+
* License as published by the Free Software Foundation; either
8+
* version 3 of the License, or (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package net.raphimc.javadowngrader.transformer;
19+
20+
public class DowngradeResult {
21+
22+
private int transformerCount;
23+
private boolean requiresStackMapFrames;
24+
25+
public int getTransformerCount() {
26+
return this.transformerCount;
27+
}
28+
29+
public void incrementTransformerCount() {
30+
this.transformerCount++;
31+
}
32+
33+
public boolean requiresStackMapFrames() {
34+
return this.requiresStackMapFrames;
35+
}
36+
37+
public void setRequiresStackMapFrames() {
38+
this.requiresStackMapFrames = true;
39+
}
40+
41+
}

src/main/java/net/raphimc/javadowngrader/transformer/DowngradingTransformer.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,16 @@ public void transform(final ClassNode classNode) {
8383
transform(classNode, RuntimeDepCollector.NULL);
8484
}
8585

86-
public void transform(final ClassNode classNode, final RuntimeDepCollector depCollector) {
86+
public DowngradeResult transform(final ClassNode classNode, final RuntimeDepCollector depCollector) {
87+
DowngradeResult result = new DowngradeResult();
8788
if ((classNode.version & 0xFF) > this.sourceVersion) {
8889
throw new IllegalArgumentException("Input class version is higher than supported");
8990
}
9091
if ((classNode.version & 0xFF) <= this.targetVersion) {
91-
return;
92+
return result;
9293
}
9394

94-
this.preTransform(classNode);
95+
this.preTransform(classNode, result);
9596

9697
int bridge = 100;
9798
for (final MethodNode methodNode : classNode.methods) {
@@ -112,9 +113,11 @@ public void transform(final ClassNode classNode, final RuntimeDepCollector depCo
112113
}
113114
if (replacer != null) {
114115
methodNode.instructions.insertBefore(
115-
methodInsn, replacer.getReplacement(classNode, methodNode, methodInsn.name, methodInsn.desc, depCollector)
116+
methodInsn, replacer.getReplacement(classNode, methodNode, methodInsn.name, methodInsn.desc, depCollector, result)
116117
);
117118
methodNode.instructions.remove(methodInsn);
119+
120+
result.incrementTransformerCount();
118121
}
119122
} else if (insn instanceof InvokeDynamicInsnNode) {
120123
final InvokeDynamicInsnNode invokeDynamicInsn = (InvokeDynamicInsnNode) insn;
@@ -131,20 +134,21 @@ public void transform(final ClassNode classNode, final RuntimeDepCollector depCo
131134
}
132135
if (replacer != null) {
133136
final String desc = handle.getTag() == Opcodes.H_INVOKESTATIC || handle.getTag() == Opcodes.H_GETSTATIC || handle.getTag() == Opcodes.H_PUTSTATIC
134-
? handle.getDesc()
135-
: "(L" + handle.getOwner() + ';' + handle.getDesc().substring(1);
137+
? handle.getDesc()
138+
: "(L" + handle.getOwner() + ';' + handle.getDesc().substring(1);
136139
final MethodNode bridgeMethod = new MethodNode(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC, BRIDGE_PREFIX + (bridge++), desc, null, null);
137140
final Type[] argumentTypes = Type.getArgumentTypes(desc);
138141
for (int i1 = 0; i1 < argumentTypes.length; i1++) {
139142
bridgeMethod.instructions.add(new VarInsnNode(argumentTypes[i1].getOpcode(Opcodes.ILOAD), i1));
140143
}
141144
bridgeMethod.instructions.add(replacer.getReplacement(
142-
classNode, bridgeMethod, handle.getName(), handle.getDesc(), depCollector
145+
classNode, bridgeMethod, handle.getName(), handle.getDesc(), depCollector, result
143146
));
144147
bridgeMethod.instructions.add(new InsnNode(Type.getReturnType(handle.getDesc()).getOpcode(Opcodes.IRETURN)));
145148
classNode.methods.add(bridgeMethod);
146149

147150
invokeDynamicInsn.bsmArgs[i] = new Handle(Opcodes.H_INVOKESTATIC, classNode.name, bridgeMethod.name, bridgeMethod.desc, (classNode.access & Opcodes.ACC_INTERFACE) != 0);
151+
result.incrementTransformerCount();
148152
}
149153
}
150154
}
@@ -182,15 +186,16 @@ public String map(String internalName) {
182186
}
183187
}
184188

185-
this.postTransform(classNode);
189+
this.postTransform(classNode, result);
186190

187191
classNode.version = this.targetVersion;
192+
return result;
188193
}
189194

190-
protected void preTransform(final ClassNode classNode) {
195+
protected void preTransform(final ClassNode classNode, final DowngradeResult result) {
191196
}
192197

193-
protected void postTransform(final ClassNode classNode) {
198+
protected void postTransform(final ClassNode classNode, final DowngradeResult result) {
194199
}
195200

196201
public int getSourceVersion() {

src/main/java/net/raphimc/javadowngrader/transformer/MethodCallReplacer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@
2424

2525
public interface MethodCallReplacer {
2626

27-
InsnList getReplacement(final ClassNode classNode, final MethodNode method, String originalName, final String originalDesc, final RuntimeDepCollector depCollector);
27+
InsnList getReplacement(final ClassNode classNode, final MethodNode method, String originalName, final String originalDesc, final RuntimeDepCollector depCollector, final DowngradeResult result);
2828

2929
}

src/main/java/net/raphimc/javadowngrader/transformer/j10/Java11ToJava10.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package net.raphimc.javadowngrader.transformer.j10;
1919

20+
import net.raphimc.javadowngrader.transformer.DowngradeResult;
2021
import net.raphimc.javadowngrader.transformer.DowngradingTransformer;
2122
import net.raphimc.javadowngrader.transformer.j10.methodcallreplacer.*;
2223
import org.objectweb.asm.Opcodes;
@@ -49,7 +50,7 @@ public Java11ToJava10() {
4950
}
5051

5152
@Override
52-
protected void preTransform(ClassNode classNode) {
53+
protected void preTransform(ClassNode classNode, DowngradeResult result) {
5354
this.makePackagePrivate(classNode);
5455
}
5556

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/CharacterToStringMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

2020
import net.raphimc.javadowngrader.RuntimeDepCollector;
21+
import net.raphimc.javadowngrader.transformer.DowngradeResult;
2122
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2223
import org.objectweb.asm.Opcodes;
2324
import org.objectweb.asm.tree.*;
2425

2526
public class CharacterToStringMCR implements MethodCallReplacer {
2627
@Override
27-
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
28+
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector, DowngradeResult result) {
2829
final InsnList replacement = new InsnList();
2930

3031
// int

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/FilesReadStringMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

2020
import net.raphimc.javadowngrader.RuntimeDepCollector;
21+
import net.raphimc.javadowngrader.transformer.DowngradeResult;
2122
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2223
import org.objectweb.asm.Opcodes;
2324
import org.objectweb.asm.tree.*;
2425

2526
public class FilesReadStringMCR implements MethodCallReplacer {
2627

2728
@Override
28-
public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
29+
public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, String originalName, String originalDesc, RuntimeDepCollector depCollector, DowngradeResult result) {
2930
final InsnList replacement = new InsnList();
3031

3132
if (originalDesc.equals("(Ljava/nio/file/Path;)Ljava/lang/String;")) {

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/InflaterInflateMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

2020
import net.raphimc.javadowngrader.RuntimeDepCollector;
21+
import net.raphimc.javadowngrader.transformer.DowngradeResult;
2122
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2223
import org.objectweb.asm.Opcodes;
2324
import org.objectweb.asm.tree.*;
2425

2526
public class InflaterInflateMCR implements MethodCallReplacer {
2627

2728
@Override
28-
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
29+
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector, DowngradeResult result) {
2930
final InsnList replacement = new InsnList();
3031

3132
// Inflater ByteBuffer

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/InflaterSetInputMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

2020
import net.raphimc.javadowngrader.RuntimeDepCollector;
21+
import net.raphimc.javadowngrader.transformer.DowngradeResult;
2122
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2223
import org.objectweb.asm.Opcodes;
2324
import org.objectweb.asm.tree.*;
2425

2526
public class InflaterSetInputMCR implements MethodCallReplacer {
2627

2728
@Override
28-
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
29+
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector, DowngradeResult result) {
2930
final InsnList replacement = new InsnList();
3031

3132
// Inflater ByteBuffer

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/ListToArrayMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

2020
import net.raphimc.javadowngrader.RuntimeDepCollector;
21+
import net.raphimc.javadowngrader.transformer.DowngradeResult;
2122
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2223
import org.objectweb.asm.Opcodes;
2324
import org.objectweb.asm.tree.*;
2425

2526
public class ListToArrayMCR implements MethodCallReplacer {
2627

2728
@Override
28-
public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
29+
public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, String originalName, String originalDesc, RuntimeDepCollector depCollector, DowngradeResult result) {
2930
final InsnList replacement = new InsnList();
3031

3132
// List IntFunction

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/OptionalIsEmptyMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

2020
import net.raphimc.javadowngrader.RuntimeDepCollector;
21+
import net.raphimc.javadowngrader.transformer.DowngradeResult;
2122
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2223
import org.objectweb.asm.Opcodes;
2324
import org.objectweb.asm.tree.*;
@@ -31,7 +32,7 @@ public OptionalIsEmptyMCR(final String optionalClass) {
3132
}
3233

3334
@Override
34-
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
35+
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector, DowngradeResult result) {
3536
final InsnList replacement = new InsnList();
3637

3738
// Optional

0 commit comments

Comments
 (0)