Commit a02a19dfc1678e8405155332b58b89b1da401be6
1 parent
98dc04c3
Remove legacy ASM in favour of Mixin ASM
Showing
36 changed files
with
197 additions
and
1213 deletions
build.gradle
@@ -72,7 +72,7 @@ repositories { | @@ -72,7 +72,7 @@ repositories { | ||
72 | } | 72 | } |
73 | 73 | ||
74 | dependencies { | 74 | dependencies { |
75 | - compile('org.spongepowered:mixin:0.7.3-SNAPSHOT') { | 75 | + compile('org.spongepowered:mixin:0.7.4-SNAPSHOT') { |
76 | exclude module: 'asm-commons' | 76 | exclude module: 'asm-commons' |
77 | exclude module: 'asm-tree' | 77 | exclude module: 'asm-tree' |
78 | exclude module: 'launchwrapper' | 78 | exclude module: 'launchwrapper' |
@@ -81,6 +81,12 @@ dependencies { | @@ -81,6 +81,12 @@ dependencies { | ||
81 | } | 81 | } |
82 | } | 82 | } |
83 | 83 | ||
84 | +configurations { | ||
85 | + forgeGradleMcDeps { | ||
86 | + exclude module: 'asm-debug-all' | ||
87 | + } | ||
88 | +} | ||
89 | + | ||
84 | minecraft { | 90 | minecraft { |
85 | version = project.mcVersion | 91 | version = project.mcVersion |
86 | mappings = project.mcMappings | 92 | mappings = project.mcMappings |
src/client/java/com/mumfrey/liteloader/client/transformers/CrashReportTransformer.java
@@ -7,13 +7,13 @@ package com.mumfrey.liteloader.client.transformers; | @@ -7,13 +7,13 @@ package com.mumfrey.liteloader.client.transformers; | ||
7 | 7 | ||
8 | import java.util.ListIterator; | 8 | import java.util.ListIterator; |
9 | 9 | ||
10 | -import org.objectweb.asm.Opcodes; | ||
11 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
12 | -import org.objectweb.asm.tree.ClassNode; | ||
13 | -import org.objectweb.asm.tree.InsnList; | ||
14 | -import org.objectweb.asm.tree.MethodInsnNode; | ||
15 | -import org.objectweb.asm.tree.MethodNode; | ||
16 | -import org.objectweb.asm.tree.VarInsnNode; | 10 | +import org.spongepowered.asm.lib.Opcodes; |
11 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; | ||
12 | +import org.spongepowered.asm.lib.tree.ClassNode; | ||
13 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
14 | +import org.spongepowered.asm.lib.tree.MethodInsnNode; | ||
15 | +import org.spongepowered.asm.lib.tree.MethodNode; | ||
16 | +import org.spongepowered.asm.lib.tree.VarInsnNode; | ||
17 | 17 | ||
18 | import com.mumfrey.liteloader.core.runtime.Obf; | 18 | import com.mumfrey.liteloader.core.runtime.Obf; |
19 | import com.mumfrey.liteloader.transformers.ClassTransformer; | 19 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
src/main/java/com/mumfrey/liteloader/common/mixin/MixinNetHandlerPlayServer.java
@@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.common.mixin; | 6 | package com.mumfrey.liteloader.common.mixin; |
7 | 7 | ||
8 | -import org.objectweb.asm.Opcodes; | 8 | +import org.spongepowered.asm.lib.Opcodes; |
9 | import org.spongepowered.asm.mixin.Mixin; | 9 | import org.spongepowered.asm.mixin.Mixin; |
10 | import org.spongepowered.asm.mixin.Shadow; | 10 | import org.spongepowered.asm.mixin.Shadow; |
11 | import org.spongepowered.asm.mixin.injection.At; | 11 | import org.spongepowered.asm.mixin.injection.At; |
src/main/java/com/mumfrey/liteloader/common/transformers/LiteLoaderPacketTransformer.java
@@ -5,10 +5,11 @@ | @@ -5,10 +5,11 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.common.transformers; | 6 | package com.mumfrey.liteloader.common.transformers; |
7 | 7 | ||
8 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
9 | + | ||
8 | import com.mumfrey.liteloader.core.runtime.Obf; | 10 | import com.mumfrey.liteloader.core.runtime.Obf; |
9 | import com.mumfrey.liteloader.core.runtime.Packets; | 11 | import com.mumfrey.liteloader.core.runtime.Packets; |
10 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; | 12 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; |
11 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | ||
12 | import com.mumfrey.liteloader.transformers.event.MethodInfo; | 13 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
13 | import com.mumfrey.liteloader.transformers.event.inject.MethodHead; | 14 | import com.mumfrey.liteloader.transformers.event.inject.MethodHead; |
14 | 15 |
src/main/java/com/mumfrey/liteloader/common/transformers/PacketEvent.java
@@ -8,13 +8,13 @@ package com.mumfrey.liteloader.common.transformers; | @@ -8,13 +8,13 @@ package com.mumfrey.liteloader.common.transformers; | ||
8 | import java.util.HashSet; | 8 | import java.util.HashSet; |
9 | import java.util.Set; | 9 | import java.util.Set; |
10 | 10 | ||
11 | -import org.objectweb.asm.Opcodes; | ||
12 | -import org.objectweb.asm.tree.InsnList; | ||
13 | -import org.objectweb.asm.tree.InsnNode; | ||
14 | -import org.objectweb.asm.tree.IntInsnNode; | ||
15 | -import org.objectweb.asm.tree.LdcInsnNode; | ||
16 | -import org.objectweb.asm.tree.MethodInsnNode; | ||
17 | -import org.objectweb.asm.tree.VarInsnNode; | 11 | +import org.spongepowered.asm.lib.Opcodes; |
12 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
13 | +import org.spongepowered.asm.lib.tree.InsnNode; | ||
14 | +import org.spongepowered.asm.lib.tree.IntInsnNode; | ||
15 | +import org.spongepowered.asm.lib.tree.LdcInsnNode; | ||
16 | +import org.spongepowered.asm.lib.tree.MethodInsnNode; | ||
17 | +import org.spongepowered.asm.lib.tree.VarInsnNode; | ||
18 | 18 | ||
19 | import com.mumfrey.liteloader.core.runtime.Obf; | 19 | import com.mumfrey.liteloader.core.runtime.Obf; |
20 | import com.mumfrey.liteloader.core.runtime.Packets; | 20 | import com.mumfrey.liteloader.core.runtime.Packets; |
src/main/java/com/mumfrey/liteloader/core/event/EventProxy.java
@@ -9,9 +9,9 @@ import java.util.concurrent.Callable; | @@ -9,9 +9,9 @@ import java.util.concurrent.Callable; | ||
9 | 9 | ||
10 | import javax.management.RuntimeErrorException; | 10 | import javax.management.RuntimeErrorException; |
11 | 11 | ||
12 | -import org.objectweb.asm.Type; | 12 | +import org.spongepowered.asm.lib.Type; |
13 | +import org.spongepowered.asm.util.SignaturePrinter; | ||
13 | 14 | ||
14 | -import com.mumfrey.liteloader.transformers.ByteCodeUtilities; | ||
15 | import com.mumfrey.liteloader.transformers.event.EventInfo; | 15 | import com.mumfrey.liteloader.transformers.event.EventInfo; |
16 | 16 | ||
17 | import net.minecraft.crash.CrashReport; | 17 | import net.minecraft.crash.CrashReport; |
@@ -181,7 +181,7 @@ public final class EventProxy | @@ -181,7 +181,7 @@ public final class EventProxy | ||
181 | } | 181 | } |
182 | return false; | 182 | return false; |
183 | default: | 183 | default: |
184 | - tpl.append(ByteCodeUtilities.getTypeName(type)); | 184 | + tpl.append(SignaturePrinter.getTypeName(type, false)); |
185 | return false; | 185 | return false; |
186 | } | 186 | } |
187 | } | 187 | } |
src/main/java/com/mumfrey/liteloader/core/event/HandlerList.java
@@ -20,26 +20,14 @@ import java.util.List; | @@ -20,26 +20,14 @@ import java.util.List; | ||
20 | import java.util.Set; | 20 | import java.util.Set; |
21 | 21 | ||
22 | import org.apache.commons.io.FileUtils; | 22 | import org.apache.commons.io.FileUtils; |
23 | -import org.objectweb.asm.ClassReader; | ||
24 | -import org.objectweb.asm.ClassWriter; | ||
25 | -import org.objectweb.asm.Label; | ||
26 | -import org.objectweb.asm.Opcodes; | ||
27 | -import org.objectweb.asm.Type; | ||
28 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
29 | -import org.objectweb.asm.tree.ClassNode; | ||
30 | -import org.objectweb.asm.tree.FieldInsnNode; | ||
31 | -import org.objectweb.asm.tree.FieldNode; | ||
32 | -import org.objectweb.asm.tree.InsnNode; | ||
33 | -import org.objectweb.asm.tree.IntInsnNode; | ||
34 | -import org.objectweb.asm.tree.JumpInsnNode; | ||
35 | -import org.objectweb.asm.tree.LabelNode; | ||
36 | -import org.objectweb.asm.tree.LdcInsnNode; | ||
37 | -import org.objectweb.asm.tree.LineNumberNode; | ||
38 | -import org.objectweb.asm.tree.MethodInsnNode; | ||
39 | -import org.objectweb.asm.tree.MethodNode; | ||
40 | -import org.objectweb.asm.tree.TypeInsnNode; | ||
41 | -import org.objectweb.asm.tree.VarInsnNode; | ||
42 | -import org.objectweb.asm.util.CheckClassAdapter; | 23 | +import org.spongepowered.asm.lib.ClassReader; |
24 | +import org.spongepowered.asm.lib.ClassWriter; | ||
25 | +import org.spongepowered.asm.lib.Label; | ||
26 | +import org.spongepowered.asm.lib.Opcodes; | ||
27 | +import org.spongepowered.asm.lib.Type; | ||
28 | +import org.spongepowered.asm.lib.tree.*; | ||
29 | +import org.spongepowered.asm.lib.util.CheckClassAdapter; | ||
30 | +import org.spongepowered.asm.util.Bytecode; | ||
43 | 31 | ||
44 | import com.mumfrey.liteloader.Priority; | 32 | import com.mumfrey.liteloader.Priority; |
45 | import com.mumfrey.liteloader.core.runtime.Obf; | 33 | import com.mumfrey.liteloader.core.runtime.Obf; |
@@ -1008,7 +996,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | @@ -1008,7 +996,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | ||
1008 | 996 | ||
1009 | method.instructions.add(new InsnNode(returnType.getOpcode(Opcodes.IRETURN))); | 997 | method.instructions.add(new InsnNode(returnType.getOpcode(Opcodes.IRETURN))); |
1010 | 998 | ||
1011 | - int argsSize = ByteCodeUtilities.getArgsSize(args); | 999 | + int argsSize = Bytecode.getFirstNonArgLocalIndex(args, false); |
1012 | method.maxLocals = argsSize + 1; | 1000 | method.maxLocals = argsSize + 1; |
1013 | method.maxStack = argsSize + 1; | 1001 | method.maxStack = argsSize + 1; |
1014 | } | 1002 | } |
@@ -1023,7 +1011,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | @@ -1023,7 +1011,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | ||
1023 | boolean isOrOperation = this.logicOp.isOr(); | 1011 | boolean isOrOperation = this.logicOp.isOr(); |
1024 | boolean breakOnMatch = this.logicOp.breakOnMatch(); | 1012 | boolean breakOnMatch = this.logicOp.breakOnMatch(); |
1025 | int initialValue = isOrOperation && (!this.logicOp.assumeTrue() || this.size > 0) ? Opcodes.ICONST_0 : Opcodes.ICONST_1; | 1013 | int initialValue = isOrOperation && (!this.logicOp.assumeTrue() || this.size > 0) ? Opcodes.ICONST_0 : Opcodes.ICONST_1; |
1026 | - int localIndex = ByteCodeUtilities.getArgsSize(args) + 1; | 1014 | + int localIndex = Bytecode.getFirstNonArgLocalIndex(args, false) + 1; |
1027 | 1015 | ||
1028 | method.instructions.add(new InsnNode(initialValue)); | 1016 | method.instructions.add(new InsnNode(initialValue)); |
1029 | method.instructions.add(new VarInsnNode(Opcodes.ISTORE, localIndex)); | 1017 | method.instructions.add(new VarInsnNode(Opcodes.ISTORE, localIndex)); |
src/main/java/com/mumfrey/liteloader/core/event/IHandlerListDecorator.java
@@ -7,9 +7,9 @@ package com.mumfrey.liteloader.core.event; | @@ -7,9 +7,9 @@ package com.mumfrey.liteloader.core.event; | ||
7 | 7 | ||
8 | import java.util.List; | 8 | import java.util.List; |
9 | 9 | ||
10 | -import org.objectweb.asm.Type; | ||
11 | -import org.objectweb.asm.tree.ClassNode; | ||
12 | -import org.objectweb.asm.tree.MethodNode; | 10 | +import org.spongepowered.asm.lib.Type; |
11 | +import org.spongepowered.asm.lib.tree.ClassNode; | ||
12 | +import org.spongepowered.asm.lib.tree.MethodNode; | ||
13 | 13 | ||
14 | import com.mumfrey.liteloader.core.event.HandlerList.BakedHandlerList; | 14 | import com.mumfrey.liteloader.core.event.HandlerList.BakedHandlerList; |
15 | import com.mumfrey.liteloader.core.runtime.Obf; | 15 | import com.mumfrey.liteloader.core.runtime.Obf; |
src/main/java/com/mumfrey/liteloader/core/event/ProfilingHandlerList.java
@@ -9,14 +9,14 @@ import java.lang.reflect.Constructor; | @@ -9,14 +9,14 @@ import java.lang.reflect.Constructor; | ||
9 | import java.util.ArrayList; | 9 | import java.util.ArrayList; |
10 | import java.util.List; | 10 | import java.util.List; |
11 | 11 | ||
12 | -import org.objectweb.asm.Opcodes; | ||
13 | -import org.objectweb.asm.Type; | ||
14 | -import org.objectweb.asm.tree.ClassNode; | ||
15 | -import org.objectweb.asm.tree.InsnNode; | ||
16 | -import org.objectweb.asm.tree.LdcInsnNode; | ||
17 | -import org.objectweb.asm.tree.MethodInsnNode; | ||
18 | -import org.objectweb.asm.tree.MethodNode; | ||
19 | -import org.objectweb.asm.tree.VarInsnNode; | 12 | +import org.spongepowered.asm.lib.Opcodes; |
13 | +import org.spongepowered.asm.lib.Type; | ||
14 | +import org.spongepowered.asm.lib.tree.ClassNode; | ||
15 | +import org.spongepowered.asm.lib.tree.InsnNode; | ||
16 | +import org.spongepowered.asm.lib.tree.LdcInsnNode; | ||
17 | +import org.spongepowered.asm.lib.tree.MethodInsnNode; | ||
18 | +import org.spongepowered.asm.lib.tree.MethodNode; | ||
19 | +import org.spongepowered.asm.lib.tree.VarInsnNode; | ||
20 | 20 | ||
21 | import com.mumfrey.liteloader.api.Listener; | 21 | import com.mumfrey.liteloader.api.Listener; |
22 | import com.mumfrey.liteloader.core.runtime.Obf; | 22 | import com.mumfrey.liteloader.core.runtime.Obf; |
src/main/java/com/mumfrey/liteloader/launch/LiteLoaderTransformer.java
@@ -5,11 +5,11 @@ | @@ -5,11 +5,11 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.launch; | 6 | package com.mumfrey.liteloader.launch; |
7 | 7 | ||
8 | -import org.objectweb.asm.Opcodes; | ||
9 | -import org.objectweb.asm.tree.ClassNode; | ||
10 | -import org.objectweb.asm.tree.FieldNode; | ||
11 | -import org.objectweb.asm.tree.MethodInsnNode; | ||
12 | -import org.objectweb.asm.tree.MethodNode; | 8 | +import org.spongepowered.asm.lib.Opcodes; |
9 | +import org.spongepowered.asm.lib.tree.ClassNode; | ||
10 | +import org.spongepowered.asm.lib.tree.FieldNode; | ||
11 | +import org.spongepowered.asm.lib.tree.MethodInsnNode; | ||
12 | +import org.spongepowered.asm.lib.tree.MethodNode; | ||
13 | 13 | ||
14 | import com.mumfrey.liteloader.core.runtime.Obf; | 14 | import com.mumfrey.liteloader.core.runtime.Obf; |
15 | import com.mumfrey.liteloader.transformers.ClassTransformer; | 15 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
src/main/java/com/mumfrey/liteloader/launch/LiteLoaderTweaker.java
@@ -16,6 +16,7 @@ import java.util.Set; | @@ -16,6 +16,7 @@ import java.util.Set; | ||
16 | import java.util.TreeSet; | 16 | import java.util.TreeSet; |
17 | 17 | ||
18 | import org.spongepowered.asm.launch.MixinBootstrap; | 18 | import org.spongepowered.asm.launch.MixinBootstrap; |
19 | +import org.spongepowered.asm.service.MixinService; | ||
19 | 20 | ||
20 | import com.google.common.base.Preconditions; | 21 | import com.google.common.base.Preconditions; |
21 | import com.mumfrey.liteloader.launch.LoaderEnvironment.EnvironmentType; | 22 | import com.mumfrey.liteloader.launch.LoaderEnvironment.EnvironmentType; |
@@ -374,7 +375,7 @@ public class LiteLoaderTweaker implements ITweaker | @@ -374,7 +375,7 @@ public class LiteLoaderTweaker implements ITweaker | ||
374 | { | 375 | { |
375 | this.transformerManager.injectDownstreamTransformers(Launch.classLoader); | 376 | this.transformerManager.injectDownstreamTransformers(Launch.classLoader); |
376 | this.bootstrap.preBeginGame(); | 377 | this.bootstrap.preBeginGame(); |
377 | - MixinBootstrap.addProxy(); | 378 | + MixinService.getService().beginPhase(); |
378 | StartupState.BEGINGAME.completed(); | 379 | StartupState.BEGINGAME.completed(); |
379 | } | 380 | } |
380 | catch (Throwable th) | 381 | catch (Throwable th) |
src/main/java/com/mumfrey/liteloader/transformers/ByteCodeUtilities.java
@@ -6,33 +6,15 @@ | @@ -6,33 +6,15 @@ | ||
6 | package com.mumfrey.liteloader.transformers; | 6 | package com.mumfrey.liteloader.transformers; |
7 | 7 | ||
8 | import java.io.IOException; | 8 | import java.io.IOException; |
9 | -import java.lang.annotation.Annotation; | ||
10 | -import java.util.ArrayList; | ||
11 | -import java.util.HashMap; | ||
12 | -import java.util.Iterator; | ||
13 | import java.util.List; | 9 | import java.util.List; |
14 | -import java.util.Map; | ||
15 | - | ||
16 | -import org.objectweb.asm.ClassReader; | ||
17 | -import org.objectweb.asm.Opcodes; | ||
18 | -import org.objectweb.asm.Type; | ||
19 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
20 | -import org.objectweb.asm.tree.AnnotationNode; | ||
21 | -import org.objectweb.asm.tree.ClassNode; | ||
22 | -import org.objectweb.asm.tree.FieldNode; | ||
23 | -import org.objectweb.asm.tree.FrameNode; | ||
24 | -import org.objectweb.asm.tree.InsnList; | ||
25 | -import org.objectweb.asm.tree.LabelNode; | ||
26 | -import org.objectweb.asm.tree.LocalVariableNode; | ||
27 | -import org.objectweb.asm.tree.MethodInsnNode; | ||
28 | -import org.objectweb.asm.tree.MethodNode; | ||
29 | -import org.objectweb.asm.tree.TypeInsnNode; | ||
30 | -import org.objectweb.asm.tree.VarInsnNode; | ||
31 | -import org.objectweb.asm.tree.analysis.Analyzer; | ||
32 | -import org.objectweb.asm.tree.analysis.AnalyzerException; | ||
33 | -import org.objectweb.asm.tree.analysis.BasicValue; | ||
34 | -import org.objectweb.asm.tree.analysis.Frame; | ||
35 | -import org.objectweb.asm.tree.analysis.SimpleVerifier; | 10 | + |
11 | +import org.spongepowered.asm.lib.ClassReader; | ||
12 | +import org.spongepowered.asm.lib.Type; | ||
13 | +import org.spongepowered.asm.lib.tree.AnnotationNode; | ||
14 | +import org.spongepowered.asm.lib.tree.ClassNode; | ||
15 | +import org.spongepowered.asm.lib.tree.FieldNode; | ||
16 | +import org.spongepowered.asm.lib.tree.MethodNode; | ||
17 | +import org.spongepowered.asm.util.Annotations; | ||
36 | 18 | ||
37 | import com.mumfrey.liteloader.core.runtime.Obf; | 19 | import com.mumfrey.liteloader.core.runtime.Obf; |
38 | 20 | ||
@@ -46,498 +28,8 @@ import net.minecraft.launchwrapper.Launch; | @@ -46,498 +28,8 @@ import net.minecraft.launchwrapper.Launch; | ||
46 | */ | 28 | */ |
47 | public abstract class ByteCodeUtilities | 29 | public abstract class ByteCodeUtilities |
48 | { | 30 | { |
49 | - private static Map<String, List<LocalVariableNode>> calculatedLocalVariables = new HashMap<String, List<LocalVariableNode>>(); | ||
50 | - | ||
51 | private ByteCodeUtilities() {} | 31 | private ByteCodeUtilities() {} |
52 | - | ||
53 | - /** | ||
54 | - * Replace all constructor invocations for the target class in the supplied | ||
55 | - * classNode with invocations of the replacement class. | ||
56 | - * | ||
57 | - * @param classNode Class to search in | ||
58 | - * @param target Target type | ||
59 | - * @param replacement Replacement type | ||
60 | - */ | ||
61 | - public static void replaceConstructors(ClassNode classNode, Obf target, Obf replacement) | ||
62 | - { | ||
63 | - for (MethodNode method : classNode.methods) | ||
64 | - { | ||
65 | - ByteCodeUtilities.replaceConstructors(method, target, replacement); | ||
66 | - } | ||
67 | - } | ||
68 | - | ||
69 | - /** | ||
70 | - * Replace all constructor invocations for the target class in the supplied | ||
71 | - * method with invocations of the replacement class. | ||
72 | - * | ||
73 | - * @param method Method to look in | ||
74 | - * @param target Target type | ||
75 | - * @param replacement Replacement type | ||
76 | - */ | ||
77 | - public static void replaceConstructors(MethodNode method, Obf target, Obf replacement) | ||
78 | - { | ||
79 | - Iterator<AbstractInsnNode> iter = method.instructions.iterator(); | ||
80 | - while (iter.hasNext()) | ||
81 | - { | ||
82 | - AbstractInsnNode insn = iter.next(); | ||
83 | - if (insn.getOpcode() == Opcodes.NEW) | ||
84 | - { | ||
85 | - TypeInsnNode typeInsn = (TypeInsnNode)insn; | ||
86 | - if (target.obf.equals(typeInsn.desc) || target.ref.equals(typeInsn.desc)) | ||
87 | - { | ||
88 | - typeInsn.desc = replacement.ref; | ||
89 | - } | ||
90 | - } | ||
91 | - else if (insn instanceof MethodInsnNode && insn.getOpcode() == Opcodes.INVOKESPECIAL) | ||
92 | - { | ||
93 | - MethodInsnNode methodInsn = (MethodInsnNode)insn; | ||
94 | - if ((target.obf.equals(methodInsn.owner) || target.ref.equals(methodInsn.owner)) && "<init>".equals(methodInsn.name)) | ||
95 | - { | ||
96 | - methodInsn.owner = replacement.ref; | ||
97 | - } | ||
98 | - } | ||
99 | - } | ||
100 | - } | ||
101 | - | ||
102 | - /** | ||
103 | - * Injects appropriate LOAD opcodes into the supplied InsnList appropriate | ||
104 | - * for each entry in the args array starting at pos. | ||
105 | - * | ||
106 | - * @param args Argument types | ||
107 | - * @param insns Instruction List to inject into | ||
108 | - * @param pos Start position | ||
109 | - */ | ||
110 | - public static void loadArgs(Type[] args, InsnList insns, int pos) | ||
111 | - { | ||
112 | - ByteCodeUtilities.loadArgs(args, insns, pos, -1); | ||
113 | - } | ||
114 | - | ||
115 | - /** | ||
116 | - * Injects appropriate LOAD opcodes into the supplied InsnList appropriate | ||
117 | - * for each entry in the args array starting at start and ending at end. | ||
118 | - * | ||
119 | - * @param args Argument types | ||
120 | - * @param insns Instruction List to inject into | ||
121 | - * @param start Start position | ||
122 | - * @param end End position | ||
123 | - */ | ||
124 | - public static void loadArgs(Type[] args, InsnList insns, int start, int end) | ||
125 | - { | ||
126 | - int pos = start; | ||
127 | - | ||
128 | - for (Type type : args) | ||
129 | - { | ||
130 | - insns.add(new VarInsnNode(type.getOpcode(Opcodes.ILOAD), pos)); | ||
131 | - pos += type.getSize(); | ||
132 | - if (end >= start && pos >= end) return; | ||
133 | - } | ||
134 | - } | ||
135 | - | ||
136 | - /** | ||
137 | - * Injects appropriate LOAD opcodes into the supplied InsnList for each | ||
138 | - * entry in the supplied locals array starting at pos. | ||
139 | - * | ||
140 | - * @param locals Local types (can contain nulls for uninitialised, TOP, or | ||
141 | - * RETURN values in locals) | ||
142 | - * @param insns Instruction List to inject into | ||
143 | - * @param pos Start position | ||
144 | - */ | ||
145 | - public static void loadLocals(Type[] locals, InsnList insns, int pos) | ||
146 | - { | ||
147 | - for (; pos < locals.length; pos++) | ||
148 | - { | ||
149 | - if (locals[pos] != null) | ||
150 | - { | ||
151 | - insns.add(new VarInsnNode(locals[pos].getOpcode(Opcodes.ILOAD), pos)); | ||
152 | - } | ||
153 | - } | ||
154 | - } | ||
155 | - | ||
156 | - /** | ||
157 | - * Get the first variable index in the supplied method which is not an | ||
158 | - * argument or "this" reference, this corresponds to the size of the | ||
159 | - * arguments passed in to the method plus an extra spot for "this" if the | ||
160 | - * method is non-static. | ||
161 | - * | ||
162 | - * @param method MethodNode to inspect | ||
163 | - * @return first available local index which is NOT used by a method | ||
164 | - * argument or "this" | ||
165 | - */ | ||
166 | - public static int getFirstNonArgLocalIndex(MethodNode method) | ||
167 | - { | ||
168 | - return ByteCodeUtilities.getFirstNonArgLocalIndex(Type.getArgumentTypes(method.desc), (method.access & Opcodes.ACC_STATIC) == 0); | ||
169 | - } | ||
170 | - | ||
171 | - /** | ||
172 | - * Get the first non-arg variable index based on the supplied arg array and | ||
173 | - * whether to include the "this" reference, this corresponds to the size of | ||
174 | - * the arguments passed in to the method plus an extra spot for "this" is | ||
175 | - * specified. | ||
176 | - * | ||
177 | - * @param args Method arguments | ||
178 | - * @param includeThis Whether to include a slot for "this" (generally true | ||
179 | - * for all non-static methods) | ||
180 | - * @return first available local index which is NOT used by a method | ||
181 | - * argument or "this" | ||
182 | - */ | ||
183 | - public static int getFirstNonArgLocalIndex(Type[] args, boolean includeThis) | ||
184 | - { | ||
185 | - return ByteCodeUtilities.getArgsSize(args) + (includeThis ? 1 : 0); | ||
186 | - } | ||
187 | - | ||
188 | - /** | ||
189 | - * Get the size of the specified args array in local variable terms (eg. | ||
190 | - * doubles and longs take two spaces). | ||
191 | - * | ||
192 | - * @param args Method argument types as array | ||
193 | - * @return size of the specified arguments array in terms of stack slots | ||
194 | - */ | ||
195 | - public static int getArgsSize(Type[] args) | ||
196 | - { | ||
197 | - int size = 0; | ||
198 | - | ||
199 | - for (Type type : args) | ||
200 | - { | ||
201 | - size += type.getSize(); | ||
202 | - } | ||
203 | - | ||
204 | - return size; | ||
205 | - } | ||
206 | - | ||
207 | - /** | ||
208 | - * Attempts to identify available locals at an arbitrary point in the | ||
209 | - * bytecode specified by node. | ||
210 | - * | ||
211 | - * <p>This method builds an approximate view of the locals available at an | ||
212 | - * arbitrary point in the bytecode by examining the following features in | ||
213 | - * the bytecode:</p> | ||
214 | - * | ||
215 | - * <ul> | ||
216 | - * <li>Any available stack map frames</li> | ||
217 | - * <li>STORE opcodes</li> | ||
218 | - * <li>The local variable table</li> | ||
219 | - * </ul> | ||
220 | - * | ||
221 | - * <p>Inference proceeds by walking the bytecode from the start of the | ||
222 | - * method looking for stack frames and STORE opcodes. When either of these | ||
223 | - * is encountered, an attempt is made to cross-reference the values in the | ||
224 | - * stack map or STORE opcode with the value in the local variable table | ||
225 | - * which covers the code range. Stack map frames overwrite the entire | ||
226 | - * simulated local variable table with their own value types, STORE opcodes | ||
227 | - * overwrite only the local slot to which they pertain. Values in the | ||
228 | - * simulated locals array are spaced according to their size (unlike the | ||
229 | - * representation in FrameNode) and this TOP, NULL and UNINTITIALIZED_THIS | ||
230 | - * opcodes will be represented as null values in the simulated frame.</p> | ||
231 | - * | ||
232 | - * <p>This code does not currently simulate the prescribed JVM behaviour | ||
233 | - * where overwriting the second slot of a DOUBLE or LONG actually | ||
234 | - * invalidates the DOUBLE or LONG stored in the previous location, so we | ||
235 | - * have to hope (for now) that this behaviour isn't emitted by the compiler | ||
236 | - * or any upstream transformers. I may have to re-think this strategy if | ||
237 | - * this situation is encountered in the wild.</p> | ||
238 | - * | ||
239 | - * @param classNode ClassNode containing the method, used to initialise the | ||
240 | - * implicit "this" reference in simple methods with no stack frames | ||
241 | - * @param method MethodNode to explore | ||
242 | - * @param node Node indicating the position at which to determine the locals | ||
243 | - * state. The locals will be enumerated UP TO the specified node, so | ||
244 | - * bear in mind that if the specified node is itself a STORE opcode, | ||
245 | - * then we will be looking at the state of the locals PRIOR to its | ||
246 | - * invocation | ||
247 | - * @return A sparse array containing a view (hopefully) of the locals at the | ||
248 | - * specified location | ||
249 | - */ | ||
250 | - public static LocalVariableNode[] getLocalsAt(ClassNode classNode, MethodNode method, AbstractInsnNode node) | ||
251 | - { | ||
252 | - LocalVariableNode[] frame = new LocalVariableNode[method.maxLocals]; | ||
253 | - | ||
254 | - // Initialise implicit "this" reference in non-static methods | ||
255 | - if ((method.access & Opcodes.ACC_STATIC) == 0) | ||
256 | - { | ||
257 | - frame[0] = new LocalVariableNode("this", classNode.name, null, null, null, 0); | ||
258 | - } | ||
259 | - | ||
260 | - for (Iterator<AbstractInsnNode> iter = method.instructions.iterator(); iter.hasNext();) | ||
261 | - { | ||
262 | - AbstractInsnNode insn = iter.next(); | ||
263 | - if (insn instanceof FrameNode) | ||
264 | - { | ||
265 | - FrameNode frameNode = (FrameNode)insn; | ||
266 | - | ||
267 | - // localPos tracks the location in the frame node's locals list, which doesn't leave space for TOP entries | ||
268 | - for (int localPos = 0, framePos = 0; framePos < frame.length; framePos++, localPos++) | ||
269 | - { | ||
270 | - // Get the local at the current position in the FrameNode's locals list | ||
271 | - final Object localType = (localPos < frameNode.local.size()) ? frameNode.local.get(localPos) : null; | ||
272 | - | ||
273 | - if (localType instanceof String) // String refers to a reference type | ||
274 | - { | ||
275 | - frame[framePos] = ByteCodeUtilities.getLocalVariableAt(classNode, method, node, framePos); | ||
276 | - } | ||
277 | - else if (localType instanceof Integer) // Integer refers to a primitive type or other marker | ||
278 | - { | ||
279 | - boolean isMarkerType = localType == Opcodes.UNINITIALIZED_THIS || localType == Opcodes.TOP || localType == Opcodes.NULL; | ||
280 | - boolean is32bitValue = localType == Opcodes.INTEGER || localType == Opcodes.FLOAT; | ||
281 | - boolean is64bitValue = localType == Opcodes.DOUBLE || localType == Opcodes.LONG; | ||
282 | - if (isMarkerType) | ||
283 | - { | ||
284 | - frame[framePos] = null; | ||
285 | - } | ||
286 | - else if (is32bitValue || is64bitValue) | ||
287 | - { | ||
288 | - frame[framePos] = ByteCodeUtilities.getLocalVariableAt(classNode, method, node, framePos); | ||
289 | - | ||
290 | - if (is64bitValue) | ||
291 | - { | ||
292 | - framePos++; | ||
293 | - frame[framePos] = null; // TOP | ||
294 | - } | ||
295 | - } | ||
296 | - else | ||
297 | - { | ||
298 | - throw new RuntimeException("Unrecognised locals opcode " + localType + " in locals array at position " + localPos + " in " | ||
299 | - + classNode.name + "." + method.name + method.desc); | ||
300 | - } | ||
301 | - } | ||
302 | - else if (localType == null) | ||
303 | - { | ||
304 | - frame[framePos] = null; | ||
305 | - } | ||
306 | - else | ||
307 | - { | ||
308 | - throw new RuntimeException("Invalid value " + localType + " in locals array at position " + localPos + " in " + classNode.name | ||
309 | - + "." + method.name + method.desc); | ||
310 | - } | ||
311 | - } | ||
312 | - } | ||
313 | - else if (insn instanceof VarInsnNode) | ||
314 | - { | ||
315 | - VarInsnNode varNode = (VarInsnNode)insn; | ||
316 | - frame[varNode.var] = ByteCodeUtilities.getLocalVariableAt(classNode, method, node, varNode.var); | ||
317 | - } | ||
318 | - else if (insn == node) | ||
319 | - { | ||
320 | - break; | ||
321 | - } | ||
322 | - } | ||
323 | - | ||
324 | - return frame; | ||
325 | - } | ||
326 | - | ||
327 | - /** | ||
328 | - * Attempts to locate the appropriate entry in the local variable table for | ||
329 | - * the specified local variable index at the location specified by node. | ||
330 | - * | ||
331 | - * @param classNode Containing class | ||
332 | - * @param method Method | ||
333 | - * @param node Instruction defining the location to get the local variable | ||
334 | - * table at | ||
335 | - * @param var Local variable index | ||
336 | - * @return a LocalVariableNode containing information about the local | ||
337 | - * variable at the specified location in the specified local slot | ||
338 | - */ | ||
339 | - public static LocalVariableNode getLocalVariableAt(ClassNode classNode, MethodNode method, AbstractInsnNode node, int var) | ||
340 | - { | ||
341 | - LocalVariableNode localVariableNode = null; | ||
342 | - | ||
343 | - int pos = method.instructions.indexOf(node); | ||
344 | - | ||
345 | - List<LocalVariableNode> localVariables = ByteCodeUtilities.getLocalVariableTable(classNode, method); | ||
346 | - for (LocalVariableNode local : localVariables) | ||
347 | - { | ||
348 | - if (local.index != var) continue; | ||
349 | - int start = method.instructions.indexOf(local.start); | ||
350 | - int end = method.instructions.indexOf(local.end); | ||
351 | - if (localVariableNode == null || start < pos && end > pos) | ||
352 | - { | ||
353 | - localVariableNode = local; | ||
354 | - } | ||
355 | - } | ||
356 | - | ||
357 | - return localVariableNode; | ||
358 | - } | ||
359 | - | ||
360 | - /** | ||
361 | - * Fetches or generates the local variable table for the specified method. | ||
362 | - * Since Mojang strip the local variable table as part of the obfuscation | ||
363 | - * process, we need to generate the local variable table when running | ||
364 | - * obfuscated. We cache the generated tables so that we only need to do the | ||
365 | - * relatively expensive calculation once per method we encounter. | ||
366 | - * | ||
367 | - * @param classNode Containing class | ||
368 | - * @param method Method | ||
369 | - */ | ||
370 | - public static List<LocalVariableNode> getLocalVariableTable(ClassNode classNode, MethodNode method) | ||
371 | - { | ||
372 | - if (method.localVariables.isEmpty()) | ||
373 | - { | ||
374 | - String signature = String.format("%s.%s%s", classNode.name, method.name, method.desc); | ||
375 | - | ||
376 | - List<LocalVariableNode> localVars = ByteCodeUtilities.calculatedLocalVariables.get(signature); | ||
377 | - if (localVars != null) | ||
378 | - { | ||
379 | - return localVars; | ||
380 | - } | ||
381 | - | ||
382 | - localVars = ByteCodeUtilities.generateLocalVariableTable(classNode, method); | ||
383 | - ByteCodeUtilities.calculatedLocalVariables.put(signature, localVars); | ||
384 | - return localVars; | ||
385 | - } | ||
386 | - | ||
387 | - return method.localVariables; | ||
388 | - } | ||
389 | - | ||
390 | - /** | ||
391 | - * Use ASM Analyzer to generate the local variable table for the specified | ||
392 | - * method. | ||
393 | - * | ||
394 | - * @param classNode Containing class | ||
395 | - * @param method Method | ||
396 | - */ | ||
397 | - public static List<LocalVariableNode> generateLocalVariableTable(ClassNode classNode, MethodNode method) | ||
398 | - { | ||
399 | - List<Type> interfaces = null; | ||
400 | - if (classNode.interfaces != null) | ||
401 | - { | ||
402 | - interfaces = new ArrayList<Type>(); | ||
403 | - for (String iface : classNode.interfaces) | ||
404 | - { | ||
405 | - interfaces.add(Type.getObjectType(iface)); | ||
406 | - } | ||
407 | - } | ||
408 | - | ||
409 | - Type objectType = null; | ||
410 | - if (classNode.superName != null) | ||
411 | - { | ||
412 | - objectType = Type.getObjectType(classNode.superName); | ||
413 | - } | ||
414 | - | ||
415 | - // Use Analyzer to generate the bytecode frames | ||
416 | - Analyzer<BasicValue> analyzer = new Analyzer<BasicValue>(new SimpleVerifier(Type.getObjectType(classNode.name), | ||
417 | - objectType, interfaces, false)); | ||
418 | - try | ||
419 | - { | ||
420 | - analyzer.analyze(classNode.name, method); | ||
421 | - } | ||
422 | - catch (AnalyzerException ex) | ||
423 | - { | ||
424 | - ex.printStackTrace(); | ||
425 | - } | ||
426 | - | ||
427 | - // Get frames from the Analyzer | ||
428 | - Frame<BasicValue>[] frames = analyzer.getFrames(); | ||
429 | - | ||
430 | - // Record the original size of hte method | ||
431 | - int methodSize = method.instructions.size(); | ||
432 | - | ||
433 | - // List of LocalVariableNodes to return | ||
434 | - List<LocalVariableNode> localVariables = new ArrayList<LocalVariableNode>(); | ||
435 | - | ||
436 | - LocalVariableNode[] localNodes = new LocalVariableNode[method.maxLocals]; // LocalVariableNodes for current frame | ||
437 | - BasicValue[] locals = new BasicValue[method.maxLocals]; // locals in previous frame, used to work out what changes between frames | ||
438 | - LabelNode[] labels = new LabelNode[methodSize]; // Labels to add to the method, for the markers | ||
439 | - | ||
440 | - // Traverse the frames and work out when locals begin and end | ||
441 | - for (int i = 0; i < methodSize; i++) | ||
442 | - { | ||
443 | - Frame<BasicValue> f = frames[i]; | ||
444 | - if (f == null) continue; | ||
445 | - LabelNode label = null; | ||
446 | - | ||
447 | - for (int j = 0; j < f.getLocals(); j++) | ||
448 | - { | ||
449 | - BasicValue local = f.getLocal(j); | ||
450 | - if (local == null && locals[j] == null) continue; | ||
451 | - if (local != null && local.equals(locals[j])) continue; | ||
452 | - | ||
453 | - if (label == null) | ||
454 | - { | ||
455 | - label = new LabelNode(); | ||
456 | - labels[i] = label; | ||
457 | - } | ||
458 | - | ||
459 | - if (local == null && locals[j] != null) | ||
460 | - { | ||
461 | - localVariables.add(localNodes[j]); | ||
462 | - localNodes[j].end = label; | ||
463 | - localNodes[j] = null; | ||
464 | - } | ||
465 | - else if (local != null) | ||
466 | - { | ||
467 | - if (locals[j] != null) | ||
468 | - { | ||
469 | - localVariables.add(localNodes[j]); | ||
470 | - localNodes[j].end = label; | ||
471 | - localNodes[j] = null; | ||
472 | - } | ||
473 | - | ||
474 | - String desc = (local.getType() != null) ? local.getType().getDescriptor() : null; | ||
475 | - localNodes[j] = new LocalVariableNode("var" + j, desc, null, label, null, j); | ||
476 | - } | ||
477 | - | ||
478 | - locals[j] = local; | ||
479 | - } | ||
480 | - } | ||
481 | - | ||
482 | - // Reached the end of the method so flush all current locals and mark the end | ||
483 | - LabelNode label = null; | ||
484 | - for (int k = 0; k < localNodes.length; k++) | ||
485 | - { | ||
486 | - if (localNodes[k] != null) | ||
487 | - { | ||
488 | - if (label == null) | ||
489 | - { | ||
490 | - label = new LabelNode(); | ||
491 | - method.instructions.add(label); | ||
492 | - } | ||
493 | - | ||
494 | - localNodes[k].end = label; | ||
495 | - localVariables.add(localNodes[k]); | ||
496 | - } | ||
497 | - } | ||
498 | - | ||
499 | - // Insert generated labels into the method body | ||
500 | - for (int n = methodSize - 1; n >= 0; n--) | ||
501 | - { | ||
502 | - if (labels[n] != null) | ||
503 | - { | ||
504 | - method.instructions.insert(method.instructions.get(n), labels[n]); | ||
505 | - } | ||
506 | - } | ||
507 | - | ||
508 | - return localVariables; | ||
509 | - } | ||
510 | - | ||
511 | - /** | ||
512 | - * Get the source code name for the specified type. | ||
513 | - * | ||
514 | - * @param type Type to generate a friendly name for | ||
515 | - * @return String representation of the specified type, eg "int" for an | ||
516 | - * integer primitive or "String" for java.lang.String | ||
517 | - */ | ||
518 | - public static String getTypeName(Type type) | ||
519 | - { | ||
520 | - switch (type.getSort()) | ||
521 | - { | ||
522 | - case Type.BOOLEAN: return "boolean"; | ||
523 | - case Type.CHAR: return "char"; | ||
524 | - case Type.BYTE: return "byte"; | ||
525 | - case Type.SHORT: return "short"; | ||
526 | - case Type.INT: return "int"; | ||
527 | - case Type.FLOAT: return "float"; | ||
528 | - case Type.LONG: return "long"; | ||
529 | - case Type.DOUBLE: return "double"; | ||
530 | - case Type.ARRAY: return ByteCodeUtilities.getTypeName(type.getElementType()) + "[]"; | ||
531 | - case Type.OBJECT: | ||
532 | - String typeName = type.getClassName(); | ||
533 | - typeName = typeName.substring(typeName.lastIndexOf('.') + 1); | ||
534 | - return typeName; | ||
535 | - default: | ||
536 | - return "Object"; | ||
537 | - } | ||
538 | - | ||
539 | - } | ||
540 | - | 32 | + |
541 | /** | 33 | /** |
542 | * Finds a method in the target class, uses names specified in the | 34 | * Finds a method in the target class, uses names specified in the |
543 | * {@link Obfuscated} annotation if present. | 35 | * {@link Obfuscated} annotation if present. |
@@ -555,10 +47,10 @@ public abstract class ByteCodeUtilities | @@ -555,10 +47,10 @@ public abstract class ByteCodeUtilities | ||
555 | } | 47 | } |
556 | } | 48 | } |
557 | 49 | ||
558 | - AnnotationNode obfuscatedAnnotation = ByteCodeUtilities.getVisibleAnnotation(searchFor, Obfuscated.class); | 50 | + AnnotationNode obfuscatedAnnotation = Annotations.getVisible(searchFor, Obfuscated.class); |
559 | if (obfuscatedAnnotation != null) | 51 | if (obfuscatedAnnotation != null) |
560 | { | 52 | { |
561 | - for (String obfuscatedName : ByteCodeUtilities.<List<String>>getAnnotationValue(obfuscatedAnnotation)) | 53 | + for (String obfuscatedName : Annotations.<String>getValue(obfuscatedAnnotation, "value", true)) |
562 | { | 54 | { |
563 | for (MethodNode target : targetClass.methods) | 55 | for (MethodNode target : targetClass.methods) |
564 | { | 56 | { |
@@ -590,10 +82,10 @@ public abstract class ByteCodeUtilities | @@ -590,10 +82,10 @@ public abstract class ByteCodeUtilities | ||
590 | } | 82 | } |
591 | } | 83 | } |
592 | 84 | ||
593 | - AnnotationNode obfuscatedAnnotation = ByteCodeUtilities.getVisibleAnnotation(searchFor, Obfuscated.class); | 85 | + AnnotationNode obfuscatedAnnotation = Annotations.getVisible(searchFor, Obfuscated.class); |
594 | if (obfuscatedAnnotation != null) | 86 | if (obfuscatedAnnotation != null) |
595 | { | 87 | { |
596 | - for (String obfuscatedName : ByteCodeUtilities.<List<String>>getAnnotationValue(obfuscatedAnnotation)) | 88 | + for (String obfuscatedName : Annotations.<String>getValue(obfuscatedAnnotation, "value", true)) |
597 | { | 89 | { |
598 | for (FieldNode target : targetClass.fields) | 90 | for (FieldNode target : targetClass.fields) |
599 | { | 91 | { |
@@ -708,107 +200,6 @@ public abstract class ByteCodeUtilities | @@ -708,107 +200,6 @@ public abstract class ByteCodeUtilities | ||
708 | } | 200 | } |
709 | 201 | ||
710 | /** | 202 | /** |
711 | - * Get an annotation of the specified class from the supplied field node | ||
712 | - */ | ||
713 | - public static AnnotationNode getVisibleAnnotation(FieldNode field, Class<? extends Annotation> annotationClass) | ||
714 | - { | ||
715 | - return ByteCodeUtilities.getAnnotation(field.visibleAnnotations, Type.getDescriptor(annotationClass)); | ||
716 | - } | ||
717 | - | ||
718 | - /** | ||
719 | - * Get an annotation of the specified class from the supplied field node | ||
720 | - */ | ||
721 | - public static AnnotationNode getInvisibleAnnotation(FieldNode field, Class<? extends Annotation> annotationClass) | ||
722 | - { | ||
723 | - return ByteCodeUtilities.getAnnotation(field.invisibleAnnotations, Type.getDescriptor(annotationClass)); | ||
724 | - } | ||
725 | - | ||
726 | - /** | ||
727 | - * Get an annotation of the specified class from the supplied method node | ||
728 | - */ | ||
729 | - public static AnnotationNode getVisibleAnnotation(MethodNode method, Class<? extends Annotation> annotationClass) | ||
730 | - { | ||
731 | - return ByteCodeUtilities.getAnnotation(method.visibleAnnotations, Type.getDescriptor(annotationClass)); | ||
732 | - } | ||
733 | - | ||
734 | - /** | ||
735 | - * Get an annotation of the specified class from the supplied method node | ||
736 | - */ | ||
737 | - public static AnnotationNode getInvisibleAnnotation(MethodNode method, Class<? extends Annotation> annotationClass) | ||
738 | - { | ||
739 | - return ByteCodeUtilities.getAnnotation(method.invisibleAnnotations, Type.getDescriptor(annotationClass)); | ||
740 | - } | ||
741 | - | ||
742 | - /** | ||
743 | - * Get an annotation of the specified class from the supplied class node | ||
744 | - */ | ||
745 | - public static AnnotationNode getVisibleAnnotation(ClassNode classNode, Class<? extends Annotation> annotationClass) | ||
746 | - { | ||
747 | - return ByteCodeUtilities.getAnnotation(classNode.visibleAnnotations, Type.getDescriptor(annotationClass)); | ||
748 | - } | ||
749 | - | ||
750 | - /** | ||
751 | - * Get an annotation of the specified class from the supplied class node | ||
752 | - */ | ||
753 | - public static AnnotationNode getInvisibleAnnotation(ClassNode classNode, Class<? extends Annotation> annotationClass) | ||
754 | - { | ||
755 | - return ByteCodeUtilities.getAnnotation(classNode.invisibleAnnotations, Type.getDescriptor(annotationClass)); | ||
756 | - } | ||
757 | - | ||
758 | - /** | ||
759 | - * Get an annotation of the specified class from the supplied list of | ||
760 | - * annotations, returns null if no matching annotation was found | ||
761 | - */ | ||
762 | - public static AnnotationNode getAnnotation(List<AnnotationNode> annotations, String annotationType) | ||
763 | - { | ||
764 | - if (annotations != null) | ||
765 | - { | ||
766 | - for (AnnotationNode annotation : annotations) | ||
767 | - { | ||
768 | - if (annotationType.equals(annotation.desc)) | ||
769 | - { | ||
770 | - return annotation; | ||
771 | - } | ||
772 | - } | ||
773 | - } | ||
774 | - | ||
775 | - return null; | ||
776 | - } | ||
777 | - | ||
778 | - /** | ||
779 | - * Get the value of an annotation node (the value at key "value") | ||
780 | - * | ||
781 | - * @param annotation Annotation node to inspect | ||
782 | - */ | ||
783 | - public static <T> T getAnnotationValue(AnnotationNode annotation) | ||
784 | - { | ||
785 | - return ByteCodeUtilities.getAnnotationValue(annotation, "value"); | ||
786 | - } | ||
787 | - | ||
788 | - /** | ||
789 | - * Get the value of an annotation node | ||
790 | - * | ||
791 | - * @param annotation | ||
792 | - * @param key | ||
793 | - */ | ||
794 | - @SuppressWarnings("unchecked") | ||
795 | - public static <T> T getAnnotationValue(AnnotationNode annotation, String key) | ||
796 | - { | ||
797 | - if (annotation == null || annotation.values == null) | ||
798 | - { | ||
799 | - return null; | ||
800 | - } | ||
801 | - | ||
802 | - boolean getNextValue = false; | ||
803 | - for (Object value : annotation.values) | ||
804 | - { | ||
805 | - if (getNextValue) return (T)value; | ||
806 | - if (value.equals(key)) getNextValue = true; | ||
807 | - } | ||
808 | - return null; | ||
809 | - } | ||
810 | - | ||
811 | - /** | ||
812 | * @param returnType | 203 | * @param returnType |
813 | * @param args | 204 | * @param args |
814 | */ | 205 | */ |
src/main/java/com/mumfrey/liteloader/transformers/CallbackInjectionTransformer.java
@@ -10,17 +10,17 @@ import java.util.Iterator; | @@ -10,17 +10,17 @@ import java.util.Iterator; | ||
10 | import java.util.Map; | 10 | import java.util.Map; |
11 | import java.util.Map.Entry; | 11 | import java.util.Map.Entry; |
12 | 12 | ||
13 | -import org.objectweb.asm.Opcodes; | ||
14 | -import org.objectweb.asm.Type; | ||
15 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
16 | -import org.objectweb.asm.tree.ClassNode; | ||
17 | -import org.objectweb.asm.tree.InsnList; | ||
18 | -import org.objectweb.asm.tree.InsnNode; | ||
19 | -import org.objectweb.asm.tree.IntInsnNode; | ||
20 | -import org.objectweb.asm.tree.LdcInsnNode; | ||
21 | -import org.objectweb.asm.tree.MethodInsnNode; | ||
22 | -import org.objectweb.asm.tree.MethodNode; | ||
23 | -import org.objectweb.asm.tree.VarInsnNode; | 13 | +import org.spongepowered.asm.lib.Opcodes; |
14 | +import org.spongepowered.asm.lib.Type; | ||
15 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; | ||
16 | +import org.spongepowered.asm.lib.tree.ClassNode; | ||
17 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
18 | +import org.spongepowered.asm.lib.tree.InsnNode; | ||
19 | +import org.spongepowered.asm.lib.tree.IntInsnNode; | ||
20 | +import org.spongepowered.asm.lib.tree.LdcInsnNode; | ||
21 | +import org.spongepowered.asm.lib.tree.MethodInsnNode; | ||
22 | +import org.spongepowered.asm.lib.tree.MethodNode; | ||
23 | +import org.spongepowered.asm.lib.tree.VarInsnNode; | ||
24 | 24 | ||
25 | import com.mumfrey.liteloader.core.runtime.Obf; | 25 | import com.mumfrey.liteloader.core.runtime.Obf; |
26 | import com.mumfrey.liteloader.transformers.Callback.CallbackType; | 26 | import com.mumfrey.liteloader.transformers.Callback.CallbackType; |
src/main/java/com/mumfrey/liteloader/transformers/ClassOverlayTransformer.java
@@ -13,20 +13,20 @@ | @@ -13,20 +13,20 @@ | ||
13 | //import java.util.Map; | 13 | //import java.util.Map; |
14 | //import java.util.Set; | 14 | //import java.util.Set; |
15 | // | 15 | // |
16 | -//import org.objectweb.asm.ClassReader; | ||
17 | -//import org.objectweb.asm.ClassWriter; | ||
18 | -//import org.objectweb.asm.Opcodes; | ||
19 | -//import org.objectweb.asm.Type; | ||
20 | -//import org.objectweb.asm.commons.RemappingClassAdapter; | ||
21 | -//import org.objectweb.asm.commons.SimpleRemapper; | ||
22 | -//import org.objectweb.asm.tree.AbstractInsnNode; | ||
23 | -//import org.objectweb.asm.tree.AnnotationNode; | ||
24 | -//import org.objectweb.asm.tree.ClassNode; | ||
25 | -//import org.objectweb.asm.tree.FieldInsnNode; | ||
26 | -//import org.objectweb.asm.tree.FieldNode; | ||
27 | -//import org.objectweb.asm.tree.LineNumberNode; | ||
28 | -//import org.objectweb.asm.tree.MethodInsnNode; | ||
29 | -//import org.objectweb.asm.tree.MethodNode; | 16 | +//import org.spongepowered.asm.lib.ClassReader; |
17 | +//import org.spongepowered.asm.lib.ClassWriter; | ||
18 | +//import org.spongepowered.asm.lib.Opcodes; | ||
19 | +//import org.spongepowered.asm.lib.Type; | ||
20 | +//import org.spongepowered.asm.lib.commons.RemappingClassAdapter; | ||
21 | +//import org.spongepowered.asm.lib.commons.SimpleRemapper; | ||
22 | +//import org.spongepowered.asm.lib.tree.AbstractInsnNode; | ||
23 | +//import org.spongepowered.asm.lib.tree.AnnotationNode; | ||
24 | +//import org.spongepowered.asm.lib.tree.ClassNode; | ||
25 | +//import org.spongepowered.asm.lib.tree.FieldInsnNode; | ||
26 | +//import org.spongepowered.asm.lib.tree.FieldNode; | ||
27 | +//import org.spongepowered.asm.lib.tree.LineNumberNode; | ||
28 | +//import org.spongepowered.asm.lib.tree.MethodInsnNode; | ||
29 | +//import org.spongepowered.asm.lib.tree.MethodNode; | ||
30 | // | 30 | // |
31 | //import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 31 | //import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
32 | // | 32 | // |
src/main/java/com/mumfrey/liteloader/transformers/ClassTransformer.java
@@ -5,9 +5,9 @@ | @@ -5,9 +5,9 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.transformers; | 6 | package com.mumfrey.liteloader.transformers; |
7 | 7 | ||
8 | -import org.objectweb.asm.ClassReader; | ||
9 | -import org.objectweb.asm.ClassWriter; | ||
10 | -import org.objectweb.asm.tree.ClassNode; | 8 | +import org.spongepowered.asm.lib.ClassReader; |
9 | +import org.spongepowered.asm.lib.ClassWriter; | ||
10 | +import org.spongepowered.asm.lib.tree.ClassNode; | ||
11 | 11 | ||
12 | import net.minecraft.launchwrapper.IClassTransformer; | 12 | import net.minecraft.launchwrapper.IClassTransformer; |
13 | 13 |
src/main/java/com/mumfrey/liteloader/transformers/IsolatedClassWriter.java
@@ -5,8 +5,8 @@ | @@ -5,8 +5,8 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.transformers; | 6 | package com.mumfrey.liteloader.transformers; |
7 | 7 | ||
8 | -import org.objectweb.asm.ClassReader; | ||
9 | -import org.objectweb.asm.ClassWriter; | 8 | +import org.spongepowered.asm.lib.ClassReader; |
9 | +import org.spongepowered.asm.lib.ClassWriter; | ||
10 | 10 | ||
11 | /** | 11 | /** |
12 | * ClassWriter isolated from ASM so that it exists in the LaunchClassLoader | 12 | * ClassWriter isolated from ASM so that it exists in the LaunchClassLoader |
src/main/java/com/mumfrey/liteloader/transformers/event/AccessorTransformer.java
@@ -12,19 +12,11 @@ import java.util.List; | @@ -12,19 +12,11 @@ import java.util.List; | ||
12 | import java.util.regex.Matcher; | 12 | import java.util.regex.Matcher; |
13 | import java.util.regex.Pattern; | 13 | import java.util.regex.Pattern; |
14 | 14 | ||
15 | -import org.objectweb.asm.Opcodes; | ||
16 | -import org.objectweb.asm.Type; | ||
17 | -import org.objectweb.asm.tree.AnnotationNode; | ||
18 | -import org.objectweb.asm.tree.ClassNode; | ||
19 | -import org.objectweb.asm.tree.FieldInsnNode; | ||
20 | -import org.objectweb.asm.tree.FieldNode; | ||
21 | -import org.objectweb.asm.tree.InsnList; | ||
22 | -import org.objectweb.asm.tree.InsnNode; | ||
23 | -import org.objectweb.asm.tree.LdcInsnNode; | ||
24 | -import org.objectweb.asm.tree.MethodInsnNode; | ||
25 | -import org.objectweb.asm.tree.MethodNode; | ||
26 | -import org.objectweb.asm.tree.TypeInsnNode; | ||
27 | -import org.objectweb.asm.tree.VarInsnNode; | 15 | +import org.spongepowered.asm.lib.Opcodes; |
16 | +import org.spongepowered.asm.lib.Type; | ||
17 | +import org.spongepowered.asm.lib.tree.*; | ||
18 | +import org.spongepowered.asm.util.Annotations; | ||
19 | +import org.spongepowered.asm.util.Bytecode; | ||
28 | 20 | ||
29 | import com.mumfrey.liteloader.core.runtime.Obf; | 21 | import com.mumfrey.liteloader.core.runtime.Obf; |
30 | import com.mumfrey.liteloader.transformers.ByteCodeUtilities; | 22 | import com.mumfrey.liteloader.transformers.ByteCodeUtilities; |
@@ -83,7 +75,7 @@ abstract class AccessorTransformer extends ClassTransformer | @@ -83,7 +75,7 @@ abstract class AccessorTransformer extends ClassTransformer | ||
83 | * @throws IOException Thrown if an problem occurs when loading the | 75 | * @throws IOException Thrown if an problem occurs when loading the |
84 | * interface bytecode | 76 | * interface bytecode |
85 | */ | 77 | */ |
86 | - protected AccessorInjection(String iface) throws IOException | 78 | + protected AccessorInjection(String iface) throws IOException, ClassNotFoundException |
87 | { | 79 | { |
88 | this(iface, null); | 80 | this(iface, null); |
89 | } | 81 | } |
@@ -95,8 +87,9 @@ abstract class AccessorTransformer extends ClassTransformer | @@ -95,8 +87,9 @@ abstract class AccessorTransformer extends ClassTransformer | ||
95 | * @param obfProvider Obfuscation provider for this context | 87 | * @param obfProvider Obfuscation provider for this context |
96 | * @throws IOException Thrown if an problem occurs when loading the | 88 | * @throws IOException Thrown if an problem occurs when loading the |
97 | * interface bytecode | 89 | * interface bytecode |
90 | + * @throws ClassNotFoundException | ||
98 | */ | 91 | */ |
99 | - protected AccessorInjection(String iface, ObfProvider obfProvider) throws IOException | 92 | + protected AccessorInjection(String iface, ObfProvider obfProvider) throws IOException, ClassNotFoundException |
100 | { | 93 | { |
101 | ClassNode ifaceNode = ByteCodeUtilities.loadClass(iface, false); | 94 | ClassNode ifaceNode = ByteCodeUtilities.loadClass(iface, false); |
102 | 95 | ||
@@ -173,12 +166,12 @@ abstract class AccessorTransformer extends ClassTransformer | @@ -173,12 +166,12 @@ abstract class AccessorTransformer extends ClassTransformer | ||
173 | @SuppressWarnings("unchecked") | 166 | @SuppressWarnings("unchecked") |
174 | private Class<? extends Obf> setupTable(ClassNode ifaceNode) | 167 | private Class<? extends Obf> setupTable(ClassNode ifaceNode) |
175 | { | 168 | { |
176 | - AnnotationNode annotation = ByteCodeUtilities.getInvisibleAnnotation(ifaceNode, ObfTableClass.class); | 169 | + AnnotationNode annotation = Annotations.getInvisible(ifaceNode, ObfTableClass.class); |
177 | if (annotation != null) | 170 | if (annotation != null) |
178 | { | 171 | { |
179 | try | 172 | try |
180 | { | 173 | { |
181 | - Type obfTableType = ByteCodeUtilities.getAnnotationValue(annotation); | 174 | + Type obfTableType = Annotations.<Type>getValue(annotation); |
182 | return (Class<? extends Obf>)Class.forName(obfTableType.getClassName(), true, Launch.classLoader); | 175 | return (Class<? extends Obf>)Class.forName(obfTableType.getClassName(), true, Launch.classLoader); |
183 | } | 176 | } |
184 | catch (ClassNotFoundException ex) | 177 | catch (ClassNotFoundException ex) |
@@ -196,14 +189,14 @@ abstract class AccessorTransformer extends ClassTransformer | @@ -196,14 +189,14 @@ abstract class AccessorTransformer extends ClassTransformer | ||
196 | */ | 189 | */ |
197 | private Obf setupTarget(ClassNode ifaceNode) | 190 | private Obf setupTarget(ClassNode ifaceNode) |
198 | { | 191 | { |
199 | - AnnotationNode annotation = ByteCodeUtilities.getInvisibleAnnotation(ifaceNode, Accessor.class); | 192 | + AnnotationNode annotation = Annotations.getInvisible(ifaceNode, Accessor.class); |
200 | if (annotation == null) | 193 | if (annotation == null) |
201 | { | 194 | { |
202 | throw new RuntimeException("Accessor interfaces must be annotated with an @Accessor annotation specifying the target class"); | 195 | throw new RuntimeException("Accessor interfaces must be annotated with an @Accessor annotation specifying the target class"); |
203 | } | 196 | } |
204 | 197 | ||
205 | - List<String> targetClass = ByteCodeUtilities.<List<String>>getAnnotationValue(annotation); | ||
206 | - if (targetClass == null || targetClass.isEmpty()) | 198 | + List<String> targetClass = Annotations.<String>getValue(annotation, "value", true); |
199 | + if (targetClass.isEmpty()) | ||
207 | { | 200 | { |
208 | throw new RuntimeException("Invalid @Accessor annotation, the annotation must specify a target class"); | 201 | throw new RuntimeException("Invalid @Accessor annotation, the annotation must specify a target class"); |
209 | } | 202 | } |
@@ -261,17 +254,17 @@ abstract class AccessorTransformer extends ClassTransformer | @@ -261,17 +254,17 @@ abstract class AccessorTransformer extends ClassTransformer | ||
261 | LiteLoaderLogger.debug("[AccessorTransformer] Attempting to add %s to %s", method.name, classNode.name); | 254 | LiteLoaderLogger.debug("[AccessorTransformer] Attempting to add %s to %s", method.name, classNode.name); |
262 | 255 | ||
263 | List<String> targetId = null; | 256 | List<String> targetId = null; |
264 | - AnnotationNode accessor = ByteCodeUtilities.getInvisibleAnnotation(method, Accessor.class); | ||
265 | - AnnotationNode invoker = ByteCodeUtilities.getInvisibleAnnotation(method, Invoker.class); | 257 | + AnnotationNode accessor = Annotations.getInvisible(method, Accessor.class); |
258 | + AnnotationNode invoker = Annotations.getInvisible(method, Invoker.class); | ||
266 | if (accessor != null) | 259 | if (accessor != null) |
267 | { | 260 | { |
268 | - targetId = ByteCodeUtilities.<List<String>>getAnnotationValue(accessor); | 261 | + targetId = Annotations.<String>getValue(accessor, "value", true); |
269 | Obf target = this.getObf(targetId); | 262 | Obf target = this.getObf(targetId); |
270 | if (this.injectAccessor(classNode, method, target)) return; | 263 | if (this.injectAccessor(classNode, method, target)) return; |
271 | } | 264 | } |
272 | else if (invoker != null) | 265 | else if (invoker != null) |
273 | { | 266 | { |
274 | - targetId = ByteCodeUtilities.<List<String>>getAnnotationValue(invoker); | 267 | + targetId = Annotations.<String>getValue(invoker, "value", true); |
275 | Obf target = this.getObf(targetId); | 268 | Obf target = this.getObf(targetId); |
276 | if (this.injectInvoker(classNode, method, target)) return; | 269 | if (this.injectInvoker(classNode, method, target)) return; |
277 | } | 270 | } |
@@ -355,7 +348,7 @@ abstract class AccessorTransformer extends ClassTransformer | @@ -355,7 +348,7 @@ abstract class AccessorTransformer extends ClassTransformer | ||
355 | boolean isStatic = (field.access & Opcodes.ACC_STATIC) != 0; | 348 | boolean isStatic = (field.access & Opcodes.ACC_STATIC) != 0; |
356 | 349 | ||
357 | method.instructions.clear(); | 350 | method.instructions.clear(); |
358 | - method.maxLocals = ByteCodeUtilities.getFirstNonArgLocalIndex(method); | 351 | + method.maxLocals = Bytecode.getFirstNonArgLocalIndex(method); |
359 | method.maxStack = fieldType.getSize(); | 352 | method.maxStack = fieldType.getSize(); |
360 | 353 | ||
361 | if (isStatic) | 354 | if (isStatic) |
@@ -394,7 +387,7 @@ abstract class AccessorTransformer extends ClassTransformer | @@ -394,7 +387,7 @@ abstract class AccessorTransformer extends ClassTransformer | ||
394 | boolean isStatic = (field.access & Opcodes.ACC_STATIC) != 0; | 387 | boolean isStatic = (field.access & Opcodes.ACC_STATIC) != 0; |
395 | 388 | ||
396 | method.instructions.clear(); | 389 | method.instructions.clear(); |
397 | - method.maxLocals = ByteCodeUtilities.getFirstNonArgLocalIndex(method); | 390 | + method.maxLocals = Bytecode.getFirstNonArgLocalIndex(method); |
398 | method.maxStack = fieldType.getSize(); | 391 | method.maxStack = fieldType.getSize(); |
399 | 392 | ||
400 | if (isStatic) | 393 | if (isStatic) |
@@ -426,17 +419,17 @@ abstract class AccessorTransformer extends ClassTransformer | @@ -426,17 +419,17 @@ abstract class AccessorTransformer extends ClassTransformer | ||
426 | boolean isStatic = (targetMethod.access & Opcodes.ACC_STATIC) != 0; | 419 | boolean isStatic = (targetMethod.access & Opcodes.ACC_STATIC) != 0; |
427 | 420 | ||
428 | method.instructions.clear(); | 421 | method.instructions.clear(); |
429 | - method.maxStack = (method.maxLocals = ByteCodeUtilities.getFirstNonArgLocalIndex(method)) + 1; | 422 | + method.maxStack = (method.maxLocals = Bytecode.getFirstNonArgLocalIndex(method)) + 1; |
430 | 423 | ||
431 | if (isStatic) | 424 | if (isStatic) |
432 | { | 425 | { |
433 | - ByteCodeUtilities.loadArgs(args, method.instructions, 0); | 426 | + Bytecode.loadArgs(args, method.instructions, 0); |
434 | method.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, classNode.name, targetMethod.name, targetMethod.desc, false)); | 427 | method.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, classNode.name, targetMethod.name, targetMethod.desc, false)); |
435 | } | 428 | } |
436 | else | 429 | else |
437 | { | 430 | { |
438 | method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); | 431 | method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); |
439 | - ByteCodeUtilities.loadArgs(args, method.instructions, 1); | 432 | + Bytecode.loadArgs(args, method.instructions, 1); |
440 | method.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, classNode.name, targetMethod.name, targetMethod.desc, false)); | 433 | method.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, classNode.name, targetMethod.name, targetMethod.desc, false)); |
441 | } | 434 | } |
442 | 435 |
src/main/java/com/mumfrey/liteloader/transformers/event/Event.java
@@ -14,25 +14,13 @@ import java.util.Map; | @@ -14,25 +14,13 @@ import java.util.Map; | ||
14 | import java.util.Map.Entry; | 14 | import java.util.Map.Entry; |
15 | import java.util.Set; | 15 | import java.util.Set; |
16 | 16 | ||
17 | -import org.objectweb.asm.Label; | ||
18 | -import org.objectweb.asm.Opcodes; | ||
19 | -import org.objectweb.asm.Type; | ||
20 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
21 | -import org.objectweb.asm.tree.ClassNode; | ||
22 | -import org.objectweb.asm.tree.InsnList; | ||
23 | -import org.objectweb.asm.tree.InsnNode; | ||
24 | -import org.objectweb.asm.tree.JumpInsnNode; | ||
25 | -import org.objectweb.asm.tree.LabelNode; | ||
26 | -import org.objectweb.asm.tree.LdcInsnNode; | ||
27 | -import org.objectweb.asm.tree.LineNumberNode; | ||
28 | -import org.objectweb.asm.tree.MethodInsnNode; | ||
29 | -import org.objectweb.asm.tree.MethodNode; | ||
30 | -import org.objectweb.asm.tree.TryCatchBlockNode; | ||
31 | -import org.objectweb.asm.tree.TypeInsnNode; | ||
32 | -import org.objectweb.asm.tree.VarInsnNode; | 17 | +import org.spongepowered.asm.lib.Label; |
18 | +import org.spongepowered.asm.lib.Opcodes; | ||
19 | +import org.spongepowered.asm.lib.Type; | ||
20 | +import org.spongepowered.asm.lib.tree.*; | ||
21 | +import org.spongepowered.asm.util.Bytecode; | ||
33 | 22 | ||
34 | import com.mumfrey.liteloader.core.runtime.Obf; | 23 | import com.mumfrey.liteloader.core.runtime.Obf; |
35 | -import com.mumfrey.liteloader.transformers.ByteCodeUtilities; | ||
36 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 24 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
37 | 25 | ||
38 | /** | 26 | /** |
@@ -376,7 +364,7 @@ public class Event implements Comparable<Event> | @@ -376,7 +364,7 @@ public class Event implements Comparable<Event> | ||
376 | this.validate(injectionPoint, cancellable, globalEventID); | 364 | this.validate(injectionPoint, cancellable, globalEventID); |
377 | 365 | ||
378 | Type[] arguments = Type.getArgumentTypes(this.method.desc); | 366 | Type[] arguments = Type.getArgumentTypes(this.method.desc); |
379 | - int initialFrameSize = ByteCodeUtilities.getFirstNonArgLocalIndex(arguments, !this.methodIsStatic); | 367 | + int initialFrameSize = Bytecode.getFirstNonArgLocalIndex(arguments, !this.methodIsStatic); |
380 | 368 | ||
381 | boolean doCaptureLocals = captureLocals && locals != null && locals.length > initialFrameSize; | 369 | boolean doCaptureLocals = captureLocals && locals != null && locals.length > initialFrameSize; |
382 | String eventDescriptor = this.generateEventDescriptor(doCaptureLocals, locals, arguments, initialFrameSize); | 370 | String eventDescriptor = this.generateEventDescriptor(doCaptureLocals, locals, arguments, initialFrameSize); |
@@ -413,10 +401,10 @@ public class Event implements Comparable<Event> | @@ -413,10 +401,10 @@ public class Event implements Comparable<Event> | ||
413 | 401 | ||
414 | // Call the event handler method in the proxy | 402 | // Call the event handler method in the proxy |
415 | insns.add(new VarInsnNode(Opcodes.ALOAD, marshallVar)); | 403 | insns.add(new VarInsnNode(Opcodes.ALOAD, marshallVar)); |
416 | - ByteCodeUtilities.loadArgs(arguments, insns, this.methodIsStatic ? 0 : 1); | 404 | + Bytecode.loadArgs(arguments, insns, this.methodIsStatic ? 0 : 1); |
417 | if (doCaptureLocals) | 405 | if (doCaptureLocals) |
418 | { | 406 | { |
419 | - ByteCodeUtilities.loadLocals(locals, insns, initialFrameSize); | 407 | + Bytecode.loadArgs(locals, insns, initialFrameSize); |
420 | } | 408 | } |
421 | insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Event.getActiveProxyRef(), handler.name, handler.desc, false)); | 409 | insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Event.getActiveProxyRef(), handler.name, handler.desc, false)); |
422 | 410 | ||
@@ -646,7 +634,7 @@ public class Event implements Comparable<Event> | @@ -646,7 +634,7 @@ public class Event implements Comparable<Event> | ||
646 | insns.add(lineNumberLabel); | 634 | insns.add(lineNumberLabel); |
647 | insns.add(new LineNumberNode(++lineNumber, lineNumberLabel)); | 635 | insns.add(new LineNumberNode(++lineNumber, lineNumberLabel)); |
648 | 636 | ||
649 | - ByteCodeUtilities.loadArgs(args, insns, 0); | 637 | + Bytecode.loadArgs(args, insns, 0); |
650 | insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, listener.ownerRef, listener.getOrInflectName(event.name), | 638 | insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, listener.ownerRef, listener.getOrInflectName(event.name), |
651 | handlerMethod.desc, false)); | 639 | handlerMethod.desc, false)); |
652 | } | 640 | } |
src/main/java/com/mumfrey/liteloader/transformers/event/EventInfo.java
@@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.transformers.event; | 6 | package com.mumfrey.liteloader.transformers.event; |
7 | 7 | ||
8 | -import org.objectweb.asm.Type; | 8 | +import org.spongepowered.asm.lib.Type; |
9 | 9 | ||
10 | import com.mumfrey.liteloader.core.event.Cancellable; | 10 | import com.mumfrey.liteloader.core.event.Cancellable; |
11 | import com.mumfrey.liteloader.core.event.EventCancellationException; | 11 | import com.mumfrey.liteloader.core.event.EventCancellationException; |
src/main/java/com/mumfrey/liteloader/transformers/event/EventInjectionTransformer.java
@@ -5,6 +5,8 @@ | @@ -5,6 +5,8 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.transformers.event; | 6 | package com.mumfrey.liteloader.transformers.event; |
7 | 7 | ||
8 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
9 | + | ||
8 | import com.mumfrey.liteloader.transformers.ObfProvider; | 10 | import com.mumfrey.liteloader.transformers.ObfProvider; |
9 | 11 | ||
10 | import net.minecraft.launchwrapper.IClassTransformer; | 12 | import net.minecraft.launchwrapper.IClassTransformer; |
src/main/java/com/mumfrey/liteloader/transformers/event/EventProxyTransformer.java
@@ -5,10 +5,10 @@ | @@ -5,10 +5,10 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.transformers.event; | 6 | package com.mumfrey.liteloader.transformers.event; |
7 | 7 | ||
8 | -import org.objectweb.asm.Opcodes; | ||
9 | -import org.objectweb.asm.tree.ClassNode; | ||
10 | -import org.objectweb.asm.tree.InsnNode; | ||
11 | -import org.objectweb.asm.tree.MethodNode; | 8 | +import org.spongepowered.asm.lib.Opcodes; |
9 | +import org.spongepowered.asm.lib.tree.ClassNode; | ||
10 | +import org.spongepowered.asm.lib.tree.InsnNode; | ||
11 | +import org.spongepowered.asm.lib.tree.MethodNode; | ||
12 | 12 | ||
13 | import com.mumfrey.liteloader.core.runtime.Obf; | 13 | import com.mumfrey.liteloader.core.runtime.Obf; |
14 | import com.mumfrey.liteloader.transformers.ClassTransformer; | 14 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
src/main/java/com/mumfrey/liteloader/transformers/event/EventTransformer.java
@@ -17,17 +17,17 @@ import java.util.Set; | @@ -17,17 +17,17 @@ import java.util.Set; | ||
17 | import java.util.TreeSet; | 17 | import java.util.TreeSet; |
18 | 18 | ||
19 | import org.apache.commons.io.FileUtils; | 19 | import org.apache.commons.io.FileUtils; |
20 | -import org.objectweb.asm.ClassWriter; | ||
21 | -import org.objectweb.asm.Type; | ||
22 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
23 | -import org.objectweb.asm.tree.ClassNode; | ||
24 | -import org.objectweb.asm.tree.LocalVariableNode; | ||
25 | -import org.objectweb.asm.tree.MethodNode; | ||
26 | -import org.objectweb.asm.util.CheckClassAdapter; | 20 | +import org.spongepowered.asm.lib.ClassWriter; |
21 | +import org.spongepowered.asm.lib.Type; | ||
22 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; | ||
23 | +import org.spongepowered.asm.lib.tree.ClassNode; | ||
24 | +import org.spongepowered.asm.lib.tree.LocalVariableNode; | ||
25 | +import org.spongepowered.asm.lib.tree.MethodNode; | ||
26 | +import org.spongepowered.asm.lib.util.CheckClassAdapter; | ||
27 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
27 | 28 | ||
28 | import com.google.common.collect.Maps; | 29 | import com.google.common.collect.Maps; |
29 | import com.mumfrey.liteloader.core.runtime.Obf; | 30 | import com.mumfrey.liteloader.core.runtime.Obf; |
30 | -import com.mumfrey.liteloader.transformers.ByteCodeUtilities; | ||
31 | import com.mumfrey.liteloader.transformers.ClassTransformer; | 31 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
32 | import com.mumfrey.liteloader.transformers.ObfProvider; | 32 | import com.mumfrey.liteloader.transformers.ObfProvider; |
33 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 33 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
@@ -151,16 +151,6 @@ public final class EventTransformer extends ClassTransformer | @@ -151,16 +151,6 @@ public final class EventTransformer extends ClassTransformer | ||
151 | return this.captureLocals; | 151 | return this.captureLocals; |
152 | } | 152 | } |
153 | 153 | ||
154 | - public void checkCaptureLocals(InjectionPoint injectionPoint) | ||
155 | - { | ||
156 | - if (injectionPoint.captureLocals != this.captureLocals) | ||
157 | - { | ||
158 | - throw new RuntimeException("Overlapping injection points defined with incompatible settings. Attempting to handle " | ||
159 | - + injectionPoint + " with capture locals [" + injectionPoint.captureLocals + "] but already defined injection point with [" | ||
160 | - + this.captureLocals + "]"); | ||
161 | - } | ||
162 | - } | ||
163 | - | ||
164 | public void add(Event event) | 154 | public void add(Event event) |
165 | { | 155 | { |
166 | this.events.add(event); | 156 | this.events.add(event); |
@@ -328,43 +318,16 @@ public final class EventTransformer extends ClassTransformer | @@ -328,43 +318,16 @@ public final class EventTransformer extends ClassTransformer | ||
328 | event.attach(method); | 318 | event.attach(method); |
329 | InjectionPoint injectionPoint = eventEntry.getValue(); | 319 | InjectionPoint injectionPoint = eventEntry.getValue(); |
330 | nodes.clear(); | 320 | nodes.clear(); |
331 | - if (injectionPoint.find(method.desc, insns, nodes, event)) | 321 | + if (injectionPoint.find(method.desc, insns, nodes)) |
332 | { | 322 | { |
333 | for (AbstractInsnNode node : nodes) | 323 | for (AbstractInsnNode node : nodes) |
334 | { | 324 | { |
335 | Injection injection = injectionPoints.get(node); | 325 | Injection injection = injectionPoints.get(node); |
336 | if (injection == null) | 326 | if (injection == null) |
337 | { | 327 | { |
338 | - injection = new Injection(node, injectionPoint.captureLocals()); | 328 | + injection = new Injection(node, false); |
339 | injectionPoints.put(node, injection); | 329 | injectionPoints.put(node, injection); |
340 | } | 330 | } |
341 | - else | ||
342 | - { | ||
343 | - injection.checkCaptureLocals(injectionPoint); | ||
344 | - } | ||
345 | - | ||
346 | - if (injectionPoint.captureLocals() && !injection.hasLocals()) | ||
347 | - { | ||
348 | - LocalVariableNode[] locals = ByteCodeUtilities.getLocalsAt(classNode, method, node); | ||
349 | - injection.setLocals(locals); | ||
350 | - if (injectionPoint.logLocals()) | ||
351 | - { | ||
352 | - int startPos = ByteCodeUtilities.getFirstNonArgLocalIndex(method); | ||
353 | - | ||
354 | - LiteLoaderLogger.debug(ClassTransformer.HORIZONTAL_RULE); | ||
355 | - LiteLoaderLogger.debug("Logging local variables for " + injectionPoint); | ||
356 | - for (int i = startPos; i < locals.length; i++) | ||
357 | - { | ||
358 | - LocalVariableNode local = locals[i]; | ||
359 | - if (local != null) | ||
360 | - { | ||
361 | - LiteLoaderLogger.debug(" Local[%d] %s %s", i, ByteCodeUtilities.getTypeName(Type.getType(local.desc)), | ||
362 | - local.name); | ||
363 | - } | ||
364 | - } | ||
365 | - LiteLoaderLogger.debug(ClassTransformer.HORIZONTAL_RULE); | ||
366 | - } | ||
367 | - } | ||
368 | 331 | ||
369 | injection.add(event); | 332 | injection.add(event); |
370 | } | 333 | } |
src/main/java/com/mumfrey/liteloader/transformers/event/InjectionPoint.java deleted
100644 โ 0
1 | -/* | ||
2 | - * This file is part of LiteLoader. | ||
3 | - * Copyright (C) 2012-16 Adam Mummery-Smith | ||
4 | - * All Rights Reserved. | ||
5 | - */ | ||
6 | -package com.mumfrey.liteloader.transformers.event; | ||
7 | - | ||
8 | -import java.util.ArrayList; | ||
9 | -import java.util.Collection; | ||
10 | -import java.util.LinkedHashSet; | ||
11 | -import java.util.List; | ||
12 | - | ||
13 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
14 | -import org.objectweb.asm.tree.InsnList; | ||
15 | - | ||
16 | -import com.google.common.base.Joiner; | ||
17 | - | ||
18 | -/** | ||
19 | - * Base class for injection point discovery classes. Each subclass describes a | ||
20 | - * strategy for locating code injection points within a method, with the | ||
21 | - * {@link #find} method populating a collection with insn nodes from the method | ||
22 | - * which satisfy its strategy. | ||
23 | - * | ||
24 | - * <p>This base class also contains composite strategy factory methods such as | ||
25 | - * {@code and} and {@code or} which allow strategies to be combined using | ||
26 | - * intersection (and) or union (or) relationships to allow multiple strategies | ||
27 | - * to be easily combined.</p> | ||
28 | - * | ||
29 | - * <p>You are free to create your own injection point subclasses, but take note | ||
30 | - * that it is allowed for a single InjectionPoint instance to be used for | ||
31 | - * multiple injections and thus implementing classes MUST NOT cache the insn | ||
32 | - * list, event, or nodes instance passed to the {@code find} method, as each | ||
33 | - * call to {@code find} must be considered a separate functional contract and | ||
34 | - * the InjectionPoint's lifespan is not linked to the discovery lifespan, | ||
35 | - * therefore it is important that the InjectionPoint implementation is fully | ||
36 | - * STATELESS.</p> | ||
37 | - * | ||
38 | - * @author Adam Mummery-Smith | ||
39 | - */ | ||
40 | -public abstract class InjectionPoint | ||
41 | -{ | ||
42 | - /** | ||
43 | - * Capture locals as well as args | ||
44 | - */ | ||
45 | - protected boolean captureLocals; | ||
46 | - | ||
47 | - protected boolean logLocals; | ||
48 | - | ||
49 | - /** | ||
50 | - * Find injection points in the supplied insn list | ||
51 | - * | ||
52 | - * @param desc Method descriptor, supplied to allow return types and | ||
53 | - * arguments etc. to be determined | ||
54 | - * @param insns Insn list to search in, the strategy MUST ONLY add nodes | ||
55 | - * from this list to the {@code nodes} collection | ||
56 | - * @param nodes Collection of nodes to populate. Injectors should NOT make | ||
57 | - * any assumptions about the state of this collection and should only | ||
58 | - * call add() | ||
59 | - * @param event Event being injected here, supplied to allow alteration of | ||
60 | - * behaviour for specific event configurations (eg. cancellable) | ||
61 | - * @return true if one or more injection points were found | ||
62 | - */ | ||
63 | - public abstract boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event); | ||
64 | - | ||
65 | - /** | ||
66 | - * Set whether this injection point should capture local variables as well | ||
67 | - * as method arguments. | ||
68 | - * | ||
69 | - * @param captureLocals | ||
70 | - * @return this, for fluent interface | ||
71 | - */ | ||
72 | - public InjectionPoint setCaptureLocals(boolean captureLocals) | ||
73 | - { | ||
74 | - this.captureLocals = captureLocals; | ||
75 | - return this; | ||
76 | - } | ||
77 | - | ||
78 | - /** | ||
79 | - * Get whether capture locals is enabled | ||
80 | - */ | ||
81 | - public boolean captureLocals() | ||
82 | - { | ||
83 | - return this.captureLocals; | ||
84 | - } | ||
85 | - | ||
86 | - /** | ||
87 | - * Since it's virtually impossible to know what locals are available at a | ||
88 | - * given injection point by reading the source, this method causes the | ||
89 | - * injection point to dump the locals to the debug log at injection time. | ||
90 | - * | ||
91 | - * @param logLocals | ||
92 | - * @return this, for fluent interface | ||
93 | - */ | ||
94 | - public InjectionPoint setLogLocals(boolean logLocals) | ||
95 | - { | ||
96 | - this.logLocals = logLocals; | ||
97 | - return this; | ||
98 | - } | ||
99 | - | ||
100 | - /** | ||
101 | - * Get whether log locals is enabled | ||
102 | - */ | ||
103 | - public boolean logLocals() | ||
104 | - { | ||
105 | - return this.logLocals; | ||
106 | - } | ||
107 | - | ||
108 | - @Override | ||
109 | - public String toString() | ||
110 | - { | ||
111 | - return "InjectionPoint(" + this.getClass().getSimpleName() + ")"; | ||
112 | - } | ||
113 | - | ||
114 | - /** | ||
115 | - * Composite injection point | ||
116 | - * | ||
117 | - * @author Adam Mummery-Smith | ||
118 | - */ | ||
119 | - abstract static class CompositeInjectionPoint extends InjectionPoint | ||
120 | - { | ||
121 | - protected final InjectionPoint[] components; | ||
122 | - | ||
123 | - protected CompositeInjectionPoint(InjectionPoint... components) | ||
124 | - { | ||
125 | - if (components == null || components.length < 2) | ||
126 | - { | ||
127 | - throw new IllegalArgumentException("Must supply two or more component injection points for composite point!"); | ||
128 | - } | ||
129 | - | ||
130 | - this.components = components; | ||
131 | - | ||
132 | - for (InjectionPoint component : this.components) | ||
133 | - { | ||
134 | - this.captureLocals |= component.captureLocals; | ||
135 | - this.logLocals |= component.logLocals; | ||
136 | - } | ||
137 | - } | ||
138 | - | ||
139 | - @Override | ||
140 | - public String toString() | ||
141 | - { | ||
142 | - return "CompositeInjectionPoint(" + this.getClass().getSimpleName() + ")[" + Joiner.on(',').join(this.components) + "]"; | ||
143 | - } | ||
144 | - } | ||
145 | - | ||
146 | - static final class Intersection extends InjectionPoint.CompositeInjectionPoint | ||
147 | - { | ||
148 | - public Intersection(InjectionPoint... points) | ||
149 | - { | ||
150 | - super(points); | ||
151 | - } | ||
152 | - | ||
153 | - @Override | ||
154 | - public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | ||
155 | - { | ||
156 | - boolean found = false; | ||
157 | - | ||
158 | - @SuppressWarnings("unchecked") | ||
159 | - ArrayList<AbstractInsnNode>[] allNodes = new ArrayList[this.components.length]; | ||
160 | - | ||
161 | - for (int i = 0; i < this.components.length; i++) | ||
162 | - { | ||
163 | - allNodes[i] = new ArrayList<AbstractInsnNode>(); | ||
164 | - this.components[i].find(desc, insns, allNodes[i], event); | ||
165 | - } | ||
166 | - | ||
167 | - ArrayList<AbstractInsnNode> alpha = allNodes[0]; | ||
168 | - for (int nodeIndex = 0; nodeIndex < alpha.size(); nodeIndex++) | ||
169 | - { | ||
170 | - AbstractInsnNode node = alpha.get(nodeIndex); | ||
171 | - boolean in = true; | ||
172 | - | ||
173 | - for (int b = 1; b < allNodes.length; b++) | ||
174 | - { | ||
175 | - if (!allNodes[b].contains(node)) | ||
176 | - { | ||
177 | - break; | ||
178 | - } | ||
179 | - } | ||
180 | - | ||
181 | - if (!in) continue; | ||
182 | - | ||
183 | - nodes.add(node); | ||
184 | - found = true; | ||
185 | - } | ||
186 | - | ||
187 | - return found; | ||
188 | - } | ||
189 | - } | ||
190 | - | ||
191 | - static final class Union extends InjectionPoint.CompositeInjectionPoint | ||
192 | - { | ||
193 | - public Union(InjectionPoint... points) | ||
194 | - { | ||
195 | - super(points); | ||
196 | - } | ||
197 | - | ||
198 | - @Override | ||
199 | - public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | ||
200 | - { | ||
201 | - LinkedHashSet<AbstractInsnNode> allNodes = new LinkedHashSet<AbstractInsnNode>(); | ||
202 | - | ||
203 | - for (int i = 0; i < this.components.length; i++) | ||
204 | - { | ||
205 | - this.components[i].find(desc, insns, allNodes, event); | ||
206 | - } | ||
207 | - | ||
208 | - nodes.addAll(allNodes); | ||
209 | - | ||
210 | - return allNodes.size() > 0; | ||
211 | - } | ||
212 | - } | ||
213 | - | ||
214 | - static final class Shift extends InjectionPoint | ||
215 | - { | ||
216 | - private final InjectionPoint input; | ||
217 | - private final int shift; | ||
218 | - | ||
219 | - public Shift(InjectionPoint input, int shift) | ||
220 | - { | ||
221 | - if (input == null) | ||
222 | - { | ||
223 | - throw new IllegalArgumentException("Must supply an input injection point for SHIFT"); | ||
224 | - } | ||
225 | - | ||
226 | - this.input = input; | ||
227 | - this.shift = shift; | ||
228 | - } | ||
229 | - | ||
230 | - @Override | ||
231 | - public InjectionPoint setCaptureLocals(boolean captureLocals) | ||
232 | - { | ||
233 | - return this.input.setCaptureLocals(captureLocals); | ||
234 | - } | ||
235 | - | ||
236 | - @Override | ||
237 | - public boolean captureLocals() | ||
238 | - { | ||
239 | - return this.input.captureLocals(); | ||
240 | - } | ||
241 | - | ||
242 | - @Override | ||
243 | - public InjectionPoint setLogLocals(boolean logLocals) | ||
244 | - { | ||
245 | - return this.input.setLogLocals(logLocals); | ||
246 | - } | ||
247 | - | ||
248 | - @Override | ||
249 | - public boolean logLocals() | ||
250 | - { | ||
251 | - return this.input.logLocals(); | ||
252 | - } | ||
253 | - | ||
254 | - @Override | ||
255 | - public String toString() | ||
256 | - { | ||
257 | - return "InjectionPoint(" + this.getClass().getSimpleName() + ")[" + this.input + "]"; | ||
258 | - } | ||
259 | - | ||
260 | - @Override | ||
261 | - public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | ||
262 | - { | ||
263 | - List<AbstractInsnNode> list = (nodes instanceof List) ? (List<AbstractInsnNode>)nodes : new ArrayList<AbstractInsnNode>(nodes); | ||
264 | - | ||
265 | - this.input.find(desc, insns, nodes, event); | ||
266 | - | ||
267 | - for (int i = 0; i < list.size(); i++) | ||
268 | - { | ||
269 | - list.set(i, insns.get(insns.indexOf(list.get(i)) + this.shift)); | ||
270 | - } | ||
271 | - | ||
272 | - if (nodes != list) | ||
273 | - { | ||
274 | - nodes.clear(); | ||
275 | - nodes.addAll(list); | ||
276 | - } | ||
277 | - | ||
278 | - return nodes.size() > 0; | ||
279 | - } | ||
280 | - } | ||
281 | - | ||
282 | - /** | ||
283 | - * Returns a composite injection point which returns the intersection of | ||
284 | - * nodes from all component injection points | ||
285 | - * | ||
286 | - * @param operands | ||
287 | - */ | ||
288 | - public static InjectionPoint and(InjectionPoint... operands) | ||
289 | - { | ||
290 | - return new InjectionPoint.Intersection(operands); | ||
291 | - } | ||
292 | - | ||
293 | - /** | ||
294 | - * Returns a composite injection point which returns the union of nodes from | ||
295 | - * all component injection points. | ||
296 | - * | ||
297 | - * @param operands | ||
298 | - */ | ||
299 | - public static InjectionPoint or(InjectionPoint... operands) | ||
300 | - { | ||
301 | - return new InjectionPoint.Union(operands); | ||
302 | - } | ||
303 | - | ||
304 | - /** | ||
305 | - * Returns an injection point which returns all insns immediately following | ||
306 | - * insns from the supplied injection point. | ||
307 | - * | ||
308 | - * @param point | ||
309 | - */ | ||
310 | - public static InjectionPoint after(InjectionPoint point) | ||
311 | - { | ||
312 | - return new InjectionPoint.Shift(point, 1); | ||
313 | - } | ||
314 | - | ||
315 | - /** | ||
316 | - * Returns an injection point which returns all insns immediately prior to | ||
317 | - * insns from the supplied injection point. | ||
318 | - * | ||
319 | - * @param point | ||
320 | - */ | ||
321 | - public static InjectionPoint before(InjectionPoint point) | ||
322 | - { | ||
323 | - return new InjectionPoint.Shift(point, -1); | ||
324 | - } | ||
325 | - | ||
326 | - /** | ||
327 | - * Returns an injection point which returns all insns offset by the | ||
328 | - * specified "count" from insns from the supplied injection point. | ||
329 | - * | ||
330 | - * @param point | ||
331 | - */ | ||
332 | - public static InjectionPoint shift(InjectionPoint point, int count) | ||
333 | - { | ||
334 | - return new InjectionPoint.Shift(point, count); | ||
335 | - } | ||
336 | -} |
src/main/java/com/mumfrey/liteloader/transformers/event/Jump.java
@@ -5,13 +5,13 @@ | @@ -5,13 +5,13 @@ | ||
5 | */ | 5 | */ |
6 | //package com.mumfrey.liteloader.transformers.event; | 6 | //package com.mumfrey.liteloader.transformers.event; |
7 | // | 7 | // |
8 | -//import org.objectweb.asm.Opcodes; | ||
9 | -//import org.objectweb.asm.tree.AbstractInsnNode; | ||
10 | -//import org.objectweb.asm.tree.InsnList; | ||
11 | -//import org.objectweb.asm.tree.InsnNode; | ||
12 | -//import org.objectweb.asm.tree.JumpInsnNode; | ||
13 | -//import org.objectweb.asm.tree.MethodInsnNode; | ||
14 | -//import org.objectweb.asm.tree.VarInsnNode; | 8 | +//import org.spongepowered.asm.lib.Opcodes; |
9 | +//import org.spongepowered.asm.lib.tree.AbstractInsnNode; | ||
10 | +//import org.spongepowered.asm.lib.tree.InsnList; | ||
11 | +//import org.spongepowered.asm.lib.tree.InsnNode; | ||
12 | +//import org.spongepowered.asm.lib.tree.JumpInsnNode; | ||
13 | +//import org.spongepowered.asm.lib.tree.MethodInsnNode; | ||
14 | +//import org.spongepowered.asm.lib.tree.VarInsnNode; | ||
15 | // | 15 | // |
16 | //public class Jump extends Event | 16 | //public class Jump extends Event |
17 | //{ | 17 | //{ |
src/main/java/com/mumfrey/liteloader/transformers/event/ReadOnlyInsnList.java
@@ -7,8 +7,8 @@ package com.mumfrey.liteloader.transformers.event; | @@ -7,8 +7,8 @@ package com.mumfrey.liteloader.transformers.event; | ||
7 | 7 | ||
8 | import java.util.ListIterator; | 8 | import java.util.ListIterator; |
9 | 9 | ||
10 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
11 | -import org.objectweb.asm.tree.InsnList; | 10 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; |
11 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
12 | 12 | ||
13 | /** | 13 | /** |
14 | * Read-only wrapper for InsnList | 14 | * Read-only wrapper for InsnList |
src/main/java/com/mumfrey/liteloader/transformers/event/ReturnEventInfo.java
@@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.transformers.event; | 6 | package com.mumfrey.liteloader.transformers.event; |
7 | 7 | ||
8 | -import org.objectweb.asm.Type; | 8 | +import org.spongepowered.asm.lib.Type; |
9 | 9 | ||
10 | import com.mumfrey.liteloader.core.event.EventCancellationException; | 10 | import com.mumfrey.liteloader.core.event.EventCancellationException; |
11 | 11 |
src/main/java/com/mumfrey/liteloader/transformers/event/inject/BeforeFieldAccess.java
@@ -5,8 +5,8 @@ | @@ -5,8 +5,8 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.transformers.event.inject; | 6 | package com.mumfrey.liteloader.transformers.event.inject; |
7 | 7 | ||
8 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
9 | -import org.objectweb.asm.tree.FieldInsnNode; | 8 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; |
9 | +import org.spongepowered.asm.lib.tree.FieldInsnNode; | ||
10 | 10 | ||
11 | import com.mumfrey.liteloader.core.runtime.Obf; | 11 | import com.mumfrey.liteloader.core.runtime.Obf; |
12 | import com.mumfrey.liteloader.transformers.event.MethodInfo; | 12 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
src/main/java/com/mumfrey/liteloader/transformers/event/inject/BeforeInvoke.java
@@ -8,14 +8,13 @@ package com.mumfrey.liteloader.transformers.event.inject; | @@ -8,14 +8,13 @@ package com.mumfrey.liteloader.transformers.event.inject; | ||
8 | import java.util.Collection; | 8 | import java.util.Collection; |
9 | import java.util.ListIterator; | 9 | import java.util.ListIterator; |
10 | 10 | ||
11 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
12 | -import org.objectweb.asm.tree.FieldInsnNode; | ||
13 | -import org.objectweb.asm.tree.InsnList; | ||
14 | -import org.objectweb.asm.tree.MethodInsnNode; | 11 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; |
12 | +import org.spongepowered.asm.lib.tree.FieldInsnNode; | ||
13 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
14 | +import org.spongepowered.asm.lib.tree.MethodInsnNode; | ||
15 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
15 | 16 | ||
16 | import com.mumfrey.liteloader.transformers.ClassTransformer; | 17 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
17 | -import com.mumfrey.liteloader.transformers.event.Event; | ||
18 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | ||
19 | import com.mumfrey.liteloader.transformers.event.MethodInfo; | 18 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
20 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 19 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
21 | 20 | ||
@@ -281,15 +280,8 @@ public class BeforeInvoke extends InjectionPoint | @@ -281,15 +280,8 @@ public class BeforeInvoke extends InjectionPoint | ||
281 | return this; | 280 | return this; |
282 | } | 281 | } |
283 | 282 | ||
284 | - /* (non-Javadoc) | ||
285 | - * @see com.mumfrey.liteloader.transformers.event.InjectionStrategy | ||
286 | - * #findInjectionPoint(java.lang.String, | ||
287 | - * org.objectweb.asm.tree.InsnList, | ||
288 | - * com.mumfrey.liteloader.transformers.event.Event, | ||
289 | - * java.util.Collection) | ||
290 | - */ | ||
291 | @Override | 283 | @Override |
292 | - public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | 284 | + public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes) |
293 | { | 285 | { |
294 | int ordinal = 0; | 286 | int ordinal = 0; |
295 | boolean found = false; | 287 | boolean found = false; |
src/main/java/com/mumfrey/liteloader/transformers/event/inject/BeforeNew.java
@@ -8,14 +8,13 @@ package com.mumfrey.liteloader.transformers.event.inject; | @@ -8,14 +8,13 @@ package com.mumfrey.liteloader.transformers.event.inject; | ||
8 | import java.util.Collection; | 8 | import java.util.Collection; |
9 | import java.util.ListIterator; | 9 | import java.util.ListIterator; |
10 | 10 | ||
11 | -import org.objectweb.asm.Opcodes; | ||
12 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
13 | -import org.objectweb.asm.tree.InsnList; | ||
14 | -import org.objectweb.asm.tree.TypeInsnNode; | 11 | +import org.spongepowered.asm.lib.Opcodes; |
12 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; | ||
13 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
14 | +import org.spongepowered.asm.lib.tree.TypeInsnNode; | ||
15 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
15 | 16 | ||
16 | import com.mumfrey.liteloader.core.runtime.Obf; | 17 | import com.mumfrey.liteloader.core.runtime.Obf; |
17 | -import com.mumfrey.liteloader.transformers.event.Event; | ||
18 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | ||
19 | 18 | ||
20 | public class BeforeNew extends InjectionPoint | 19 | public class BeforeNew extends InjectionPoint |
21 | { | 20 | { |
@@ -50,7 +49,7 @@ public class BeforeNew extends InjectionPoint | @@ -50,7 +49,7 @@ public class BeforeNew extends InjectionPoint | ||
50 | } | 49 | } |
51 | 50 | ||
52 | @Override | 51 | @Override |
53 | - public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | 52 | + public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes) |
54 | { | 53 | { |
55 | boolean found = false; | 54 | boolean found = false; |
56 | int ordinal = 0; | 55 | int ordinal = 0; |
src/main/java/com/mumfrey/liteloader/transformers/event/inject/BeforeReturn.java
@@ -8,14 +8,12 @@ package com.mumfrey.liteloader.transformers.event.inject; | @@ -8,14 +8,12 @@ package com.mumfrey.liteloader.transformers.event.inject; | ||
8 | import java.util.Collection; | 8 | import java.util.Collection; |
9 | import java.util.ListIterator; | 9 | import java.util.ListIterator; |
10 | 10 | ||
11 | -import org.objectweb.asm.Opcodes; | ||
12 | -import org.objectweb.asm.Type; | ||
13 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
14 | -import org.objectweb.asm.tree.InsnList; | ||
15 | -import org.objectweb.asm.tree.InsnNode; | ||
16 | - | ||
17 | -import com.mumfrey.liteloader.transformers.event.Event; | ||
18 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | 11 | +import org.spongepowered.asm.lib.Opcodes; |
12 | +import org.spongepowered.asm.lib.Type; | ||
13 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; | ||
14 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
15 | +import org.spongepowered.asm.lib.tree.InsnNode; | ||
16 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
19 | 17 | ||
20 | /** | 18 | /** |
21 | * An injection point which searches for RETURN opcodes in the supplied method | 19 | * An injection point which searches for RETURN opcodes in the supplied method |
@@ -38,7 +36,7 @@ public class BeforeReturn extends InjectionPoint | @@ -38,7 +36,7 @@ public class BeforeReturn extends InjectionPoint | ||
38 | } | 36 | } |
39 | 37 | ||
40 | @Override | 38 | @Override |
41 | - public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | 39 | + public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes) |
42 | { | 40 | { |
43 | boolean found = false; | 41 | boolean found = false; |
44 | int returnOpcode = Type.getReturnType(desc).getOpcode(Opcodes.IRETURN); | 42 | int returnOpcode = Type.getReturnType(desc).getOpcode(Opcodes.IRETURN); |
src/main/java/com/mumfrey/liteloader/transformers/event/inject/BeforeStringInvoke.java
@@ -7,11 +7,10 @@ package com.mumfrey.liteloader.transformers.event.inject; | @@ -7,11 +7,10 @@ package com.mumfrey.liteloader.transformers.event.inject; | ||
7 | 7 | ||
8 | import java.util.Collection; | 8 | import java.util.Collection; |
9 | 9 | ||
10 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
11 | -import org.objectweb.asm.tree.InsnList; | ||
12 | -import org.objectweb.asm.tree.LdcInsnNode; | 10 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; |
11 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
12 | +import org.spongepowered.asm.lib.tree.LdcInsnNode; | ||
13 | 13 | ||
14 | -import com.mumfrey.liteloader.transformers.event.Event; | ||
15 | import com.mumfrey.liteloader.transformers.event.MethodInfo; | 14 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
16 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 15 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
17 | 16 | ||
@@ -49,11 +48,11 @@ public class BeforeStringInvoke extends BeforeInvoke | @@ -49,11 +48,11 @@ public class BeforeStringInvoke extends BeforeInvoke | ||
49 | } | 48 | } |
50 | 49 | ||
51 | @Override | 50 | @Override |
52 | - public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | 51 | + public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes) |
53 | { | 52 | { |
54 | this.foundLdc = false; | 53 | this.foundLdc = false; |
55 | 54 | ||
56 | - return super.find(desc, insns, nodes, event); | 55 | + return super.find(desc, insns, nodes); |
57 | } | 56 | } |
58 | 57 | ||
59 | @Override | 58 | @Override |
src/main/java/com/mumfrey/liteloader/transformers/event/inject/JumpInsnPoint.java
@@ -8,12 +8,10 @@ package com.mumfrey.liteloader.transformers.event.inject; | @@ -8,12 +8,10 @@ package com.mumfrey.liteloader.transformers.event.inject; | ||
8 | import java.util.Collection; | 8 | import java.util.Collection; |
9 | import java.util.ListIterator; | 9 | import java.util.ListIterator; |
10 | 10 | ||
11 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
12 | -import org.objectweb.asm.tree.InsnList; | ||
13 | -import org.objectweb.asm.tree.JumpInsnNode; | ||
14 | - | ||
15 | -import com.mumfrey.liteloader.transformers.event.Event; | ||
16 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | 11 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; |
12 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
13 | +import org.spongepowered.asm.lib.tree.JumpInsnNode; | ||
14 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
17 | 15 | ||
18 | /** | 16 | /** |
19 | * An injection point which searches for JUMP opcodes (if, try/catch, continue, | 17 | * An injection point which searches for JUMP opcodes (if, try/catch, continue, |
@@ -47,7 +45,7 @@ public class JumpInsnPoint extends InjectionPoint | @@ -47,7 +45,7 @@ public class JumpInsnPoint extends InjectionPoint | ||
47 | } | 45 | } |
48 | 46 | ||
49 | @Override | 47 | @Override |
50 | - public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | 48 | + public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes) |
51 | { | 49 | { |
52 | boolean found = false; | 50 | boolean found = false; |
53 | int ordinal = 0; | 51 | int ordinal = 0; |
src/main/java/com/mumfrey/liteloader/transformers/event/inject/MethodHead.java
@@ -7,11 +7,9 @@ package com.mumfrey.liteloader.transformers.event.inject; | @@ -7,11 +7,9 @@ package com.mumfrey.liteloader.transformers.event.inject; | ||
7 | 7 | ||
8 | import java.util.Collection; | 8 | import java.util.Collection; |
9 | 9 | ||
10 | -import org.objectweb.asm.tree.AbstractInsnNode; | ||
11 | -import org.objectweb.asm.tree.InsnList; | ||
12 | - | ||
13 | -import com.mumfrey.liteloader.transformers.event.Event; | ||
14 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | 10 | +import org.spongepowered.asm.lib.tree.AbstractInsnNode; |
11 | +import org.spongepowered.asm.lib.tree.InsnList; | ||
12 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
15 | 13 | ||
16 | /** | 14 | /** |
17 | * An injection point which locates the first instruction in a method body | 15 | * An injection point which locates the first instruction in a method body |
@@ -25,7 +23,7 @@ public class MethodHead extends InjectionPoint | @@ -25,7 +23,7 @@ public class MethodHead extends InjectionPoint | ||
25 | } | 23 | } |
26 | 24 | ||
27 | @Override | 25 | @Override |
28 | - public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | 26 | + public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes) |
29 | { | 27 | { |
30 | nodes.add(insns.getFirst()); | 28 | nodes.add(insns.getFirst()); |
31 | return true; | 29 | return true; |
src/main/java/com/mumfrey/liteloader/transformers/event/json/JsonEvent.java
@@ -9,9 +9,10 @@ import java.io.Serializable; | @@ -9,9 +9,10 @@ import java.io.Serializable; | ||
9 | import java.util.ArrayList; | 9 | import java.util.ArrayList; |
10 | import java.util.List; | 10 | import java.util.List; |
11 | 11 | ||
12 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
13 | + | ||
12 | import com.google.gson.annotations.SerializedName; | 14 | import com.google.gson.annotations.SerializedName; |
13 | import com.mumfrey.liteloader.transformers.event.Event; | 15 | import com.mumfrey.liteloader.transformers.event.Event; |
14 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | ||
15 | import com.mumfrey.liteloader.transformers.event.MethodInfo; | 16 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
16 | 17 | ||
17 | /** | 18 | /** |
src/main/java/com/mumfrey/liteloader/transformers/event/json/JsonInjection.java
@@ -8,8 +8,9 @@ package com.mumfrey.liteloader.transformers.event.json; | @@ -8,8 +8,9 @@ package com.mumfrey.liteloader.transformers.event.json; | ||
8 | import java.io.Serializable; | 8 | import java.io.Serializable; |
9 | import java.lang.reflect.Constructor; | 9 | import java.lang.reflect.Constructor; |
10 | 10 | ||
11 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
12 | + | ||
11 | import com.google.gson.annotations.SerializedName; | 13 | import com.google.gson.annotations.SerializedName; |
12 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | ||
13 | import com.mumfrey.liteloader.transformers.event.MethodInfo; | 14 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
14 | import com.mumfrey.liteloader.transformers.event.inject.BeforeInvoke; | 15 | import com.mumfrey.liteloader.transformers.event.inject.BeforeInvoke; |
15 | import com.mumfrey.liteloader.transformers.event.inject.BeforeReturn; | 16 | import com.mumfrey.liteloader.transformers.event.inject.BeforeReturn; |
src/main/java/com/mumfrey/liteloader/transformers/event/json/ModEventInjectionTransformer.java
@@ -5,11 +5,12 @@ | @@ -5,11 +5,12 @@ | ||
5 | */ | 5 | */ |
6 | package com.mumfrey.liteloader.transformers.event.json; | 6 | package com.mumfrey.liteloader.transformers.event.json; |
7 | 7 | ||
8 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | ||
9 | + | ||
8 | import com.mumfrey.liteloader.transformers.ClassTransformer; | 10 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
9 | import com.mumfrey.liteloader.transformers.ObfProvider; | 11 | import com.mumfrey.liteloader.transformers.ObfProvider; |
10 | import com.mumfrey.liteloader.transformers.event.Event; | 12 | import com.mumfrey.liteloader.transformers.event.Event; |
11 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; | 13 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; |
12 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | ||
13 | import com.mumfrey.liteloader.transformers.event.MethodInfo; | 14 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
14 | import com.mumfrey.liteloader.transformers.event.json.ModEvents.ModEventDefinition; | 15 | import com.mumfrey.liteloader.transformers.event.json.ModEvents.ModEventDefinition; |
15 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 16 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |