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 | 72 | } |
| 73 | 73 | |
| 74 | 74 | dependencies { |
| 75 | - compile('org.spongepowered:mixin:0.7.3-SNAPSHOT') { | |
| 75 | + compile('org.spongepowered:mixin:0.7.4-SNAPSHOT') { | |
| 76 | 76 | exclude module: 'asm-commons' |
| 77 | 77 | exclude module: 'asm-tree' |
| 78 | 78 | exclude module: 'launchwrapper' |
| ... | ... | @@ -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 | 90 | minecraft { |
| 85 | 91 | version = project.mcVersion |
| 86 | 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 | 7 | |
| 8 | 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 | 18 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 19 | 19 | import com.mumfrey.liteloader.transformers.ClassTransformer; | ... | ... |
src/main/java/com/mumfrey/liteloader/common/mixin/MixinNetHandlerPlayServer.java
| ... | ... | @@ -5,7 +5,7 @@ |
| 5 | 5 | */ |
| 6 | 6 | package com.mumfrey.liteloader.common.mixin; |
| 7 | 7 | |
| 8 | -import org.objectweb.asm.Opcodes; | |
| 8 | +import org.spongepowered.asm.lib.Opcodes; | |
| 9 | 9 | import org.spongepowered.asm.mixin.Mixin; |
| 10 | 10 | import org.spongepowered.asm.mixin.Shadow; |
| 11 | 11 | import org.spongepowered.asm.mixin.injection.At; | ... | ... |
src/main/java/com/mumfrey/liteloader/common/transformers/LiteLoaderPacketTransformer.java
| ... | ... | @@ -5,10 +5,11 @@ |
| 5 | 5 | */ |
| 6 | 6 | package com.mumfrey.liteloader.common.transformers; |
| 7 | 7 | |
| 8 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | |
| 9 | + | |
| 8 | 10 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 9 | 11 | import com.mumfrey.liteloader.core.runtime.Packets; |
| 10 | 12 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; |
| 11 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | |
| 12 | 13 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
| 13 | 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 | 8 | import java.util.HashSet; |
| 9 | 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 | 19 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 20 | 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 | |
| 10 | 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 | 15 | import com.mumfrey.liteloader.transformers.event.EventInfo; |
| 16 | 16 | |
| 17 | 17 | import net.minecraft.crash.CrashReport; |
| ... | ... | @@ -181,7 +181,7 @@ public final class EventProxy |
| 181 | 181 | } |
| 182 | 182 | return false; |
| 183 | 183 | default: |
| 184 | - tpl.append(ByteCodeUtilities.getTypeName(type)); | |
| 184 | + tpl.append(SignaturePrinter.getTypeName(type, false)); | |
| 185 | 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 | 20 | import java.util.Set; |
| 21 | 21 | |
| 22 | 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 | 32 | import com.mumfrey.liteloader.Priority; |
| 45 | 33 | import com.mumfrey.liteloader.core.runtime.Obf; |
| ... | ... | @@ -1008,7 +996,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T |
| 1008 | 996 | |
| 1009 | 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 | 1000 | method.maxLocals = argsSize + 1; |
| 1013 | 1001 | method.maxStack = argsSize + 1; |
| 1014 | 1002 | } |
| ... | ... | @@ -1023,7 +1011,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T |
| 1023 | 1011 | boolean isOrOperation = this.logicOp.isOr(); |
| 1024 | 1012 | boolean breakOnMatch = this.logicOp.breakOnMatch(); |
| 1025 | 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 | 1016 | method.instructions.add(new InsnNode(initialValue)); |
| 1029 | 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 | 7 | |
| 8 | 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 | 14 | import com.mumfrey.liteloader.core.event.HandlerList.BakedHandlerList; |
| 15 | 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 | 9 | import java.util.ArrayList; |
| 10 | 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 | 21 | import com.mumfrey.liteloader.api.Listener; |
| 22 | 22 | import com.mumfrey.liteloader.core.runtime.Obf; | ... | ... |
src/main/java/com/mumfrey/liteloader/launch/LiteLoaderTransformer.java
| ... | ... | @@ -5,11 +5,11 @@ |
| 5 | 5 | */ |
| 6 | 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 | 14 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 15 | 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 | 16 | import java.util.TreeSet; |
| 17 | 17 | |
| 18 | 18 | import org.spongepowered.asm.launch.MixinBootstrap; |
| 19 | +import org.spongepowered.asm.service.MixinService; | |
| 19 | 20 | |
| 20 | 21 | import com.google.common.base.Preconditions; |
| 21 | 22 | import com.mumfrey.liteloader.launch.LoaderEnvironment.EnvironmentType; |
| ... | ... | @@ -374,7 +375,7 @@ public class LiteLoaderTweaker implements ITweaker |
| 374 | 375 | { |
| 375 | 376 | this.transformerManager.injectDownstreamTransformers(Launch.classLoader); |
| 376 | 377 | this.bootstrap.preBeginGame(); |
| 377 | - MixinBootstrap.addProxy(); | |
| 378 | + MixinService.getService().beginPhase(); | |
| 378 | 379 | StartupState.BEGINGAME.completed(); |
| 379 | 380 | } |
| 380 | 381 | catch (Throwable th) | ... | ... |
src/main/java/com/mumfrey/liteloader/transformers/ByteCodeUtilities.java
| ... | ... | @@ -6,33 +6,15 @@ |
| 6 | 6 | package com.mumfrey.liteloader.transformers; |
| 7 | 7 | |
| 8 | 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 | 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 | 19 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 38 | 20 | |
| ... | ... | @@ -46,498 +28,8 @@ import net.minecraft.launchwrapper.Launch; |
| 46 | 28 | */ |
| 47 | 29 | public abstract class ByteCodeUtilities |
| 48 | 30 | { |
| 49 | - private static Map<String, List<LocalVariableNode>> calculatedLocalVariables = new HashMap<String, List<LocalVariableNode>>(); | |
| 50 | - | |
| 51 | 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 | 34 | * Finds a method in the target class, uses names specified in the |
| 543 | 35 | * {@link Obfuscated} annotation if present. |
| ... | ... | @@ -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 | 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 | 55 | for (MethodNode target : targetClass.methods) |
| 564 | 56 | { |
| ... | ... | @@ -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 | 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 | 90 | for (FieldNode target : targetClass.fields) |
| 599 | 91 | { |
| ... | ... | @@ -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 | 203 | * @param returnType |
| 813 | 204 | * @param args |
| 814 | 205 | */ | ... | ... |
src/main/java/com/mumfrey/liteloader/transformers/CallbackInjectionTransformer.java
| ... | ... | @@ -10,17 +10,17 @@ import java.util.Iterator; |
| 10 | 10 | import java.util.Map; |
| 11 | 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 | 25 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 26 | 26 | import com.mumfrey.liteloader.transformers.Callback.CallbackType; | ... | ... |
src/main/java/com/mumfrey/liteloader/transformers/ClassOverlayTransformer.java
| ... | ... | @@ -13,20 +13,20 @@ |
| 13 | 13 | //import java.util.Map; |
| 14 | 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 | 31 | //import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 32 | 32 | // | ... | ... |
src/main/java/com/mumfrey/liteloader/transformers/ClassTransformer.java
| ... | ... | @@ -5,9 +5,9 @@ |
| 5 | 5 | */ |
| 6 | 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 | 12 | import net.minecraft.launchwrapper.IClassTransformer; |
| 13 | 13 | ... | ... |
src/main/java/com/mumfrey/liteloader/transformers/IsolatedClassWriter.java
| ... | ... | @@ -5,8 +5,8 @@ |
| 5 | 5 | */ |
| 6 | 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 | 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 | 12 | import java.util.regex.Matcher; |
| 13 | 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 | 21 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 30 | 22 | import com.mumfrey.liteloader.transformers.ByteCodeUtilities; |
| ... | ... | @@ -83,7 +75,7 @@ abstract class AccessorTransformer extends ClassTransformer |
| 83 | 75 | * @throws IOException Thrown if an problem occurs when loading the |
| 84 | 76 | * interface bytecode |
| 85 | 77 | */ |
| 86 | - protected AccessorInjection(String iface) throws IOException | |
| 78 | + protected AccessorInjection(String iface) throws IOException, ClassNotFoundException | |
| 87 | 79 | { |
| 88 | 80 | this(iface, null); |
| 89 | 81 | } |
| ... | ... | @@ -95,8 +87,9 @@ abstract class AccessorTransformer extends ClassTransformer |
| 95 | 87 | * @param obfProvider Obfuscation provider for this context |
| 96 | 88 | * @throws IOException Thrown if an problem occurs when loading the |
| 97 | 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 | 94 | ClassNode ifaceNode = ByteCodeUtilities.loadClass(iface, false); |
| 102 | 95 | |
| ... | ... | @@ -173,12 +166,12 @@ abstract class AccessorTransformer extends ClassTransformer |
| 173 | 166 | @SuppressWarnings("unchecked") |
| 174 | 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 | 170 | if (annotation != null) |
| 178 | 171 | { |
| 179 | 172 | try |
| 180 | 173 | { |
| 181 | - Type obfTableType = ByteCodeUtilities.getAnnotationValue(annotation); | |
| 174 | + Type obfTableType = Annotations.<Type>getValue(annotation); | |
| 182 | 175 | return (Class<? extends Obf>)Class.forName(obfTableType.getClassName(), true, Launch.classLoader); |
| 183 | 176 | } |
| 184 | 177 | catch (ClassNotFoundException ex) |
| ... | ... | @@ -196,14 +189,14 @@ abstract class AccessorTransformer extends ClassTransformer |
| 196 | 189 | */ |
| 197 | 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 | 193 | if (annotation == null) |
| 201 | 194 | { |
| 202 | 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 | 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 | 254 | LiteLoaderLogger.debug("[AccessorTransformer] Attempting to add %s to %s", method.name, classNode.name); |
| 262 | 255 | |
| 263 | 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 | 259 | if (accessor != null) |
| 267 | 260 | { |
| 268 | - targetId = ByteCodeUtilities.<List<String>>getAnnotationValue(accessor); | |
| 261 | + targetId = Annotations.<String>getValue(accessor, "value", true); | |
| 269 | 262 | Obf target = this.getObf(targetId); |
| 270 | 263 | if (this.injectAccessor(classNode, method, target)) return; |
| 271 | 264 | } |
| 272 | 265 | else if (invoker != null) |
| 273 | 266 | { |
| 274 | - targetId = ByteCodeUtilities.<List<String>>getAnnotationValue(invoker); | |
| 267 | + targetId = Annotations.<String>getValue(invoker, "value", true); | |
| 275 | 268 | Obf target = this.getObf(targetId); |
| 276 | 269 | if (this.injectInvoker(classNode, method, target)) return; |
| 277 | 270 | } |
| ... | ... | @@ -355,7 +348,7 @@ abstract class AccessorTransformer extends ClassTransformer |
| 355 | 348 | boolean isStatic = (field.access & Opcodes.ACC_STATIC) != 0; |
| 356 | 349 | |
| 357 | 350 | method.instructions.clear(); |
| 358 | - method.maxLocals = ByteCodeUtilities.getFirstNonArgLocalIndex(method); | |
| 351 | + method.maxLocals = Bytecode.getFirstNonArgLocalIndex(method); | |
| 359 | 352 | method.maxStack = fieldType.getSize(); |
| 360 | 353 | |
| 361 | 354 | if (isStatic) |
| ... | ... | @@ -394,7 +387,7 @@ abstract class AccessorTransformer extends ClassTransformer |
| 394 | 387 | boolean isStatic = (field.access & Opcodes.ACC_STATIC) != 0; |
| 395 | 388 | |
| 396 | 389 | method.instructions.clear(); |
| 397 | - method.maxLocals = ByteCodeUtilities.getFirstNonArgLocalIndex(method); | |
| 390 | + method.maxLocals = Bytecode.getFirstNonArgLocalIndex(method); | |
| 398 | 391 | method.maxStack = fieldType.getSize(); |
| 399 | 392 | |
| 400 | 393 | if (isStatic) |
| ... | ... | @@ -426,17 +419,17 @@ abstract class AccessorTransformer extends ClassTransformer |
| 426 | 419 | boolean isStatic = (targetMethod.access & Opcodes.ACC_STATIC) != 0; |
| 427 | 420 | |
| 428 | 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 | 424 | if (isStatic) |
| 432 | 425 | { |
| 433 | - ByteCodeUtilities.loadArgs(args, method.instructions, 0); | |
| 426 | + Bytecode.loadArgs(args, method.instructions, 0); | |
| 434 | 427 | method.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, classNode.name, targetMethod.name, targetMethod.desc, false)); |
| 435 | 428 | } |
| 436 | 429 | else |
| 437 | 430 | { |
| 438 | 431 | method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); |
| 439 | - ByteCodeUtilities.loadArgs(args, method.instructions, 1); | |
| 432 | + Bytecode.loadArgs(args, method.instructions, 1); | |
| 440 | 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 | 14 | import java.util.Map.Entry; |
| 15 | 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 | 23 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 35 | -import com.mumfrey.liteloader.transformers.ByteCodeUtilities; | |
| 36 | 24 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 37 | 25 | |
| 38 | 26 | /** |
| ... | ... | @@ -376,7 +364,7 @@ public class Event implements Comparable<Event> |
| 376 | 364 | this.validate(injectionPoint, cancellable, globalEventID); |
| 377 | 365 | |
| 378 | 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 | 369 | boolean doCaptureLocals = captureLocals && locals != null && locals.length > initialFrameSize; |
| 382 | 370 | String eventDescriptor = this.generateEventDescriptor(doCaptureLocals, locals, arguments, initialFrameSize); |
| ... | ... | @@ -413,10 +401,10 @@ public class Event implements Comparable<Event> |
| 413 | 401 | |
| 414 | 402 | // Call the event handler method in the proxy |
| 415 | 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 | 405 | if (doCaptureLocals) |
| 418 | 406 | { |
| 419 | - ByteCodeUtilities.loadLocals(locals, insns, initialFrameSize); | |
| 407 | + Bytecode.loadArgs(locals, insns, initialFrameSize); | |
| 420 | 408 | } |
| 421 | 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 | 634 | insns.add(lineNumberLabel); |
| 647 | 635 | insns.add(new LineNumberNode(++lineNumber, lineNumberLabel)); |
| 648 | 636 | |
| 649 | - ByteCodeUtilities.loadArgs(args, insns, 0); | |
| 637 | + Bytecode.loadArgs(args, insns, 0); | |
| 650 | 638 | insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, listener.ownerRef, listener.getOrInflectName(event.name), |
| 651 | 639 | handlerMethod.desc, false)); |
| 652 | 640 | } | ... | ... |
src/main/java/com/mumfrey/liteloader/transformers/event/EventInfo.java
| ... | ... | @@ -5,7 +5,7 @@ |
| 5 | 5 | */ |
| 6 | 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 | 10 | import com.mumfrey.liteloader.core.event.Cancellable; |
| 11 | 11 | import com.mumfrey.liteloader.core.event.EventCancellationException; | ... | ... |
src/main/java/com/mumfrey/liteloader/transformers/event/EventInjectionTransformer.java
src/main/java/com/mumfrey/liteloader/transformers/event/EventProxyTransformer.java
| ... | ... | @@ -5,10 +5,10 @@ |
| 5 | 5 | */ |
| 6 | 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 | 13 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 14 | 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 | import java.util.TreeSet; |
| 18 | 18 | |
| 19 | 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 | 29 | import com.google.common.collect.Maps; |
| 29 | 30 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 30 | -import com.mumfrey.liteloader.transformers.ByteCodeUtilities; | |
| 31 | 31 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
| 32 | 32 | import com.mumfrey.liteloader.transformers.ObfProvider; |
| 33 | 33 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| ... | ... | @@ -151,16 +151,6 @@ public final class EventTransformer extends ClassTransformer |
| 151 | 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 | 154 | public void add(Event event) |
| 165 | 155 | { |
| 166 | 156 | this.events.add(event); |
| ... | ... | @@ -328,43 +318,16 @@ public final class EventTransformer extends ClassTransformer |
| 328 | 318 | event.attach(method); |
| 329 | 319 | InjectionPoint injectionPoint = eventEntry.getValue(); |
| 330 | 320 | nodes.clear(); |
| 331 | - if (injectionPoint.find(method.desc, insns, nodes, event)) | |
| 321 | + if (injectionPoint.find(method.desc, insns, nodes)) | |
| 332 | 322 | { |
| 333 | 323 | for (AbstractInsnNode node : nodes) |
| 334 | 324 | { |
| 335 | 325 | Injection injection = injectionPoints.get(node); |
| 336 | 326 | if (injection == null) |
| 337 | 327 | { |
| 338 | - injection = new Injection(node, injectionPoint.captureLocals()); | |
| 328 | + injection = new Injection(node, false); | |
| 339 | 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 | 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 | 5 | */ |
| 6 | 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 | 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 | 7 | |
| 8 | 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 | 14 | * Read-only wrapper for InsnList | ... | ... |
src/main/java/com/mumfrey/liteloader/transformers/event/ReturnEventInfo.java
src/main/java/com/mumfrey/liteloader/transformers/event/inject/BeforeFieldAccess.java
| ... | ... | @@ -5,8 +5,8 @@ |
| 5 | 5 | */ |
| 6 | 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 | 11 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 12 | 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 | 8 | import java.util.Collection; |
| 9 | 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 | 17 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
| 17 | -import com.mumfrey.liteloader.transformers.event.Event; | |
| 18 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | |
| 19 | 18 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
| 20 | 19 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 21 | 20 | |
| ... | ... | @@ -281,15 +280,8 @@ public class BeforeInvoke extends InjectionPoint |
| 281 | 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 | 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 | 286 | int ordinal = 0; |
| 295 | 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 | 8 | import java.util.Collection; |
| 9 | 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 | 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 | 19 | public class BeforeNew extends InjectionPoint |
| 21 | 20 | { |
| ... | ... | @@ -50,7 +49,7 @@ public class BeforeNew extends InjectionPoint |
| 50 | 49 | } |
| 51 | 50 | |
| 52 | 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 | 54 | boolean found = false; |
| 56 | 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 | 8 | import java.util.Collection; |
| 9 | 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 | 19 | * An injection point which searches for RETURN opcodes in the supplied method |
| ... | ... | @@ -38,7 +36,7 @@ public class BeforeReturn extends InjectionPoint |
| 38 | 36 | } |
| 39 | 37 | |
| 40 | 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 | 41 | boolean found = false; |
| 44 | 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 | 7 | |
| 8 | 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 | 14 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
| 16 | 15 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 17 | 16 | |
| ... | ... | @@ -49,11 +48,11 @@ public class BeforeStringInvoke extends BeforeInvoke |
| 49 | 48 | } |
| 50 | 49 | |
| 51 | 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 | 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 | 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 | 8 | import java.util.Collection; |
| 9 | 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 | 17 | * An injection point which searches for JUMP opcodes (if, try/catch, continue, |
| ... | ... | @@ -47,7 +45,7 @@ public class JumpInsnPoint extends InjectionPoint |
| 47 | 45 | } |
| 48 | 46 | |
| 49 | 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 | 50 | boolean found = false; |
| 53 | 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 | 7 | |
| 8 | 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 | 15 | * An injection point which locates the first instruction in a method body |
| ... | ... | @@ -25,7 +23,7 @@ public class MethodHead extends InjectionPoint |
| 25 | 23 | } |
| 26 | 24 | |
| 27 | 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 | 28 | nodes.add(insns.getFirst()); |
| 31 | 29 | return true; | ... | ... |
src/main/java/com/mumfrey/liteloader/transformers/event/json/JsonEvent.java
| ... | ... | @@ -9,9 +9,10 @@ import java.io.Serializable; |
| 9 | 9 | import java.util.ArrayList; |
| 10 | 10 | import java.util.List; |
| 11 | 11 | |
| 12 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | |
| 13 | + | |
| 12 | 14 | import com.google.gson.annotations.SerializedName; |
| 13 | 15 | import com.mumfrey.liteloader.transformers.event.Event; |
| 14 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | |
| 15 | 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 | import java.io.Serializable; |
| 9 | 9 | import java.lang.reflect.Constructor; |
| 10 | 10 | |
| 11 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | |
| 12 | + | |
| 11 | 13 | import com.google.gson.annotations.SerializedName; |
| 12 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | |
| 13 | 14 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
| 14 | 15 | import com.mumfrey.liteloader.transformers.event.inject.BeforeInvoke; |
| 15 | 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 | 5 | */ |
| 6 | 6 | package com.mumfrey.liteloader.transformers.event.json; |
| 7 | 7 | |
| 8 | +import org.spongepowered.asm.mixin.injection.InjectionPoint; | |
| 9 | + | |
| 8 | 10 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
| 9 | 11 | import com.mumfrey.liteloader.transformers.ObfProvider; |
| 10 | 12 | import com.mumfrey.liteloader.transformers.event.Event; |
| 11 | 13 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; |
| 12 | -import com.mumfrey.liteloader.transformers.event.InjectionPoint; | |
| 13 | 14 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
| 14 | 15 | import com.mumfrey.liteloader.transformers.event.json.ModEvents.ModEventDefinition; |
| 15 | 16 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | ... | ... |