Skip to content

Commit 0d373e9

Browse files
committed
Turbo ASM
1 parent ccbd702 commit 0d373e9

17 files changed

+1093
-123
lines changed

README.MD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ A library for 1.7.10 with lots of useful stuff, licensed under the LGPLv3 licens
1212
| [optifine](src/main/java/com/falsepattern/lib/optifine) | Tools for messing with OptiFine |
1313
| [text](src/main/java/com/falsepattern/lib/text) | Better Chat and GUI text processing |
1414
| [toasts](src/main/java/com/falsepattern/lib/toasts) | The toast system from newer versions, with some extras |
15+
| [turboasm](src/main/java/com/falsepattern/lib/turboasm) | A forge-style class transformer port of RFB's transformer API. |
1516
| [util](src/main/java/com/falsepattern/lib/util) | Additional utilities that do not fit the above categories, see below for more information |
1617

1718
The contents of the [util](src/main/java/com/falsepattern/lib/util) package so far:

src/main/java/com/falsepattern/lib/StableAPI.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@
4848
* You may set the {@link #since()} attribute to "__INTERNAL__", this will signal that even though the specific class/member
4949
* has been marked as stable, it is still for internal use only. This may be done for reference purposes in multi-developer
5050
* projects, where you need to communicate intent even in internal code.
51+
* <p>
52+
* Similarly, you may also set the {@link #since()} attribute to "__EXPERIMENTAL__", this will signal that the given API
53+
* is highly experimental and may be removed or change at any time, however, using it in third party projects is not an
54+
* error, unlike __INTERNAL__, but if any issues arise from the usage of the API or the API changing, the API developer
55+
* shall not be blamed for it.
5156
*/
5257
@Documented
5358
@Retention(RetentionPolicy.RUNTIME)

src/main/java/com/falsepattern/lib/asm/IClassNodeTransformer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,17 @@
2222
*/
2323
package com.falsepattern.lib.asm;
2424

25+
import com.falsepattern.lib.DeprecationDetails;
2526
import com.falsepattern.lib.StableAPI;
2627
import org.objectweb.asm.tree.ClassNode;
2728

29+
/**
30+
* See: {@link com.falsepattern.lib.turboasm.TurboClassTransformer}.
31+
* This class will not be removed, for backwards compatibility reasons.
32+
*/
2833
@StableAPI(since = "0.10.0")
34+
@Deprecated
35+
@DeprecationDetails(deprecatedSince = "1.2.0")
2936
public interface IClassNodeTransformer {
3037
@StableAPI.Expose
3138
String getName();

src/main/java/com/falsepattern/lib/asm/SmartTransformer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
*/
2323
package com.falsepattern.lib.asm;
2424

25+
import com.falsepattern.lib.DeprecationDetails;
2526
import com.falsepattern.lib.StableAPI;
2627
import com.falsepattern.lib.internal.asm.CoreLoadingPlugin;
2728
import lombok.val;
@@ -36,9 +37,12 @@
3637
import java.util.List;
3738

3839
/**
39-
* An ASM transformation dispatcher utility, inspired by mixins.
40+
* See: {@link com.falsepattern.lib.turboasm.MergeableTurboTransformer}.
41+
* This class will not be removed, for backwards compatibility reasons.
4042
*/
4143
@StableAPI(since = "0.10.0")
44+
@Deprecated
45+
@DeprecationDetails(deprecatedSince = "1.2.0")
4246
public interface SmartTransformer extends IClassTransformer {
4347
@StableAPI.Expose
4448
Logger logger();

src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public class FalsePatternLib {
5151
@SidedProxy(clientSide = Tags.GROUPNAME + ".internal.proxy.ClientProxy",
5252
serverSide = Tags.GROUPNAME + ".internal.proxy.CommonProxy")
5353
private static CommonProxy proxy;
54+
static {
55+
CoreLoadingPlugin.mergeTurboTransformers();
56+
}
5457

5558
public FalsePatternLib() {
5659
FPLog.LOG.info("Version " + Tags.VERSION + " initialized!");
@@ -74,9 +77,6 @@ public void init(FMLInitializationEvent e) {
7477

7578
@Mod.EventHandler
7679
public void postInit(FMLPostInitializationEvent e) {
77-
if (Loader.isModLoaded("gasstation")) {
78-
CoreLoadingPlugin.validateGasStation();
79-
}
8080
proxy.postInit(e);
8181
}
8282
}

src/main/java/com/falsepattern/lib/internal/asm/CoreLoadingPlugin.java

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,24 @@
2626
import com.falsepattern.lib.internal.Tags;
2727
import com.falsepattern.lib.internal.impl.dependencies.DependencyLoaderImpl;
2828
import com.falsepattern.lib.mapping.MappingManager;
29+
import com.falsepattern.lib.turboasm.MergeableTurboTransformer;
2930
import lombok.Getter;
31+
import lombok.SneakyThrows;
3032
import lombok.val;
3133

34+
import net.minecraft.launchwrapper.IClassTransformer;
35+
import net.minecraft.launchwrapper.Launch;
36+
import net.minecraft.launchwrapper.LaunchClassLoader;
3237
import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
3338
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
3439
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.Name;
3540
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.SortingIndex;
3641

42+
import javax.swing.BoxLayout;
43+
import javax.swing.JFrame;
44+
import javax.swing.JLabel;
45+
import javax.swing.SwingUtilities;
46+
import java.util.List;
3747
import java.util.Map;
3848

3949
import static com.falsepattern.lib.mixin.MixinInfo.isClassPresentSafe;
@@ -44,7 +54,7 @@
4454
@MCVersion("1.7.10")
4555
@Name(Tags.MODID)
4656
@SortingIndex(500)
47-
@IFMLLoadingPlugin.TransformerExclusions({Tags.GROUPNAME + ".internal.asm", Tags.GROUPNAME + ".asm"})
57+
@IFMLLoadingPlugin.TransformerExclusions({Tags.GROUPNAME + ".internal.asm", Tags.GROUPNAME + ".asm", Tags.GROUPNAME + ".turboasm"})
4858
public class CoreLoadingPlugin implements IFMLLoadingPlugin {
4959
@Getter
5060
private static boolean obfuscated;
@@ -117,25 +127,6 @@ private static Error skillIssue(String message) {
117127
return skillIssue;
118128
}
119129

120-
public static void validateGasStation() {
121-
FPLog.LOG.info("Got any gas?");
122-
//Make sure everything is loaded correctly, crash if gasstation is bugged
123-
// @formatter:off
124-
if (!isClassPresentSafe("com.falsepattern.gasstation.core.GasStationCore") //Validate core class
125-
|| !isClassPresentSafe("makamys.mixingasm.api.TransformerInclusions") //Validate the mixingasm compat
126-
|| !isClassPresentSafe("ru.timeconqueror.spongemixins.core.SpongeMixinsCore") //Validate the spongemixins compat
127-
|| !isClassPresentSafe("io.github.tox1cozz.mixinbooterlegacy.MixinBooterLegacyPlugin") //Validate the MBL compat
128-
|| !isClassPresentSafe("org.spongepowered.asm.lib.Opcodes") //Validate correct mixins class
129-
|| isClassPresentSafe("org.spongepowered.libraries.org.objectweb.asm.Opcodes")
130-
) {
131-
FPLog.LOG.fatal("Somebody put diesel in my gas tank!");
132-
throw new Error("Failed to validate your GasStation mixin plugin installation. "
133-
+ "Please make sure you have the latest GasStation installed from the official source: "
134-
+ "https://github.com/FalsePattern/GasStation");
135-
}
136-
// @formatter:on
137-
}
138-
139130
@Override
140131
public String[] getASMTransformerClass() {
141132
return new String[]{Tags.GROUPNAME + ".internal.asm.FPTransformer"};
@@ -154,10 +145,32 @@ public String getSetupClass() {
154145
@Override
155146
public void injectData(Map<String, Object> data) {
156147
obfuscated = (Boolean) data.get("runtimeDeobfuscationEnabled");
148+
mergeTurboTransformers();
157149
}
158150

159151
@Override
160152
public String getAccessTransformerClass() {
161153
return null;
162154
}
155+
156+
@SneakyThrows
157+
public static synchronized void mergeTurboTransformers() {
158+
val f = LaunchClassLoader.class.getDeclaredField("transformers");
159+
f.setAccessible(true);
160+
161+
val transformers = (List<IClassTransformer>) f.get(Launch.classLoader);
162+
for (int i = 0; i < transformers.size() - 1; i++) {
163+
val a = transformers.get(i);
164+
if (!(a instanceof MergeableTurboTransformer))
165+
continue;
166+
167+
val b = transformers.get(i + 1);
168+
if (!(b instanceof MergeableTurboTransformer))
169+
continue;
170+
171+
transformers.remove(i + 1);
172+
transformers.set(i, MergeableTurboTransformer.merge((MergeableTurboTransformer) a, (MergeableTurboTransformer) b));
173+
i--;
174+
}
175+
}
163176
}

src/main/java/com/falsepattern/lib/internal/asm/FPTransformer.java

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,41 +24,25 @@
2424
package com.falsepattern.lib.internal.asm;
2525

2626
import com.falsepattern.lib.StableAPI;
27-
import com.falsepattern.lib.asm.IClassNodeTransformer;
28-
import com.falsepattern.lib.asm.SmartTransformer;
29-
import com.falsepattern.lib.internal.Tags;
3027
import com.falsepattern.lib.internal.asm.transformers.ConfigOrderTransformer;
31-
import com.falsepattern.lib.internal.asm.transformers.GasStationValidatorTransformer;
32-
import com.falsepattern.lib.internal.asm.transformers.IMixinPluginTransformer;
33-
import com.falsepattern.lib.internal.asm.transformers.ITypeDiscovererTransformer;
28+
import com.falsepattern.lib.internal.asm.transformers.MixinPluginTransformer;
29+
import com.falsepattern.lib.internal.asm.transformers.TypeDiscovererModuleInfoSilencer;
3430
import com.falsepattern.lib.internal.impl.optifine.OptiFineTransformerHooksImpl;
35-
import lombok.Getter;
31+
import com.falsepattern.lib.turboasm.MergeableTurboTransformer;
3632
import lombok.experimental.Accessors;
37-
import org.apache.logging.log4j.LogManager;
38-
import org.apache.logging.log4j.Logger;
3933

4034
import java.util.Arrays;
41-
import java.util.List;
4235

4336
@Accessors(fluent = true)
4437
@StableAPI(since = "__INTERNAL__")
45-
public class FPTransformer implements SmartTransformer {
46-
public static final Logger LOG = LogManager.getLogger(Tags.MODNAME + " ASM");
47-
48-
@Getter
49-
private final List<IClassNodeTransformer> transformers;
50-
51-
@Getter
52-
private final Logger logger = LOG;
53-
38+
public class FPTransformer extends MergeableTurboTransformer {
5439
static {
5540
OptiFineTransformerHooksImpl.init();
5641
}
5742

5843
public FPTransformer() {
59-
transformers = Arrays.asList(new IMixinPluginTransformer(),
60-
new ITypeDiscovererTransformer(),
61-
new GasStationValidatorTransformer(),
62-
new ConfigOrderTransformer());
44+
super(Arrays.asList(new MixinPluginTransformer(),
45+
new TypeDiscovererModuleInfoSilencer(),
46+
new ConfigOrderTransformer()));
6347
}
6448
}

src/main/java/com/falsepattern/lib/internal/asm/transformers/ConfigOrderTransformer.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,36 @@
2323

2424
package com.falsepattern.lib.internal.asm.transformers;
2525

26-
import com.falsepattern.lib.asm.IClassNodeTransformer;
2726
import com.falsepattern.lib.config.Config;
27+
import com.falsepattern.lib.internal.Tags;
2828
import com.falsepattern.lib.internal.impl.config.DeclOrderInternal;
29+
import com.falsepattern.lib.turboasm.ClassNodeHandle;
30+
import com.falsepattern.lib.turboasm.TurboClassTransformer;
2931
import lombok.val;
32+
import org.jetbrains.annotations.NotNull;
3033
import org.objectweb.asm.Opcodes;
3134
import org.objectweb.asm.Type;
32-
import org.objectweb.asm.tree.ClassNode;
3335

34-
public class ConfigOrderTransformer implements IClassNodeTransformer {
36+
public class ConfigOrderTransformer implements TurboClassTransformer {
3537
private static final String DESC_CONFIG = Type.getDescriptor(Config.class);
3638
private static final String DESC_CONFIG_IGNORE = Type.getDescriptor(Config.Ignore.class);
3739
private static final String DESC_ORDER = Type.getDescriptor(DeclOrderInternal.class);
3840

3941
@Override
40-
public String getName() {
42+
public String name() {
4143
return "ConfigOrderTransformer";
4244
}
4345

4446
@Override
45-
public boolean shouldTransform(ClassNode cn, String transformedName, boolean obfuscated) {
47+
public String owner() {
48+
return Tags.MODNAME;
49+
}
50+
51+
@Override
52+
public boolean shouldTransformClass(@NotNull String className, @NotNull ClassNodeHandle classNode) {
53+
val cn = classNode.getNode();
54+
if (cn == null)
55+
return false;
4656
if (cn.visibleAnnotations != null) {
4757
for (val ann : cn.visibleAnnotations) {
4858
if (DESC_CONFIG.equals(ann.desc)) {
@@ -54,7 +64,10 @@ public boolean shouldTransform(ClassNode cn, String transformedName, boolean obf
5464
}
5565

5666
@Override
57-
public void transform(ClassNode cn, String transformedName, boolean obfuscated) {
67+
public void transformClass(@NotNull String className, @NotNull ClassNodeHandle classNode) {
68+
val cn = classNode.getNode();
69+
if (cn == null)
70+
return;
5871
int order = 0;
5972
outer:
6073
for (val field : cn.fields) {

src/main/java/com/falsepattern/lib/internal/asm/transformers/GasStationValidatorTransformer.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

0 commit comments

Comments
 (0)