List of usage examples for org.objectweb.asm.tree AbstractInsnNode getOpcode
public int getOpcode()
From source file:net.malisis.core.asm.AsmUtils.java
License:Open Source License
public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) { if (node1 == null || node2 == null || node1.getOpcode() != node2.getOpcode()) return false; switch (node2.getType()) { case VAR_INSN: return varInsnEqual((VarInsnNode) node1, (VarInsnNode) node2); case TYPE_INSN: return typeInsnEqual((TypeInsnNode) node1, (TypeInsnNode) node2); case FIELD_INSN: return fieldInsnEqual((FieldInsnNode) node1, (FieldInsnNode) node2); case METHOD_INSN: return methodInsnEqual((MethodInsnNode) node1, (MethodInsnNode) node2); case LDC_INSN: return ldcInsnEqual((LdcInsnNode) node1, (LdcInsnNode) node2); case IINC_INSN: return iincInsnEqual((IincInsnNode) node1, (IincInsnNode) node2); case INT_INSN: return intInsnEqual((IntInsnNode) node1, (IntInsnNode) node2); default:/* w w w . j a v a 2 s . c o m*/ return true; } }
From source file:net.minecraftforge.fml.common.asm.transformers.AccessTransformer.java
License:Open Source License
private void replaceInvokeSpecial(ClassNode clazz, List<MethodNode> toReplace) { for (MethodNode method : clazz.methods) { for (Iterator<AbstractInsnNode> it = method.instructions.iterator(); it.hasNext();) { AbstractInsnNode insn = it.next(); if (insn.getOpcode() == INVOKESPECIAL) { MethodInsnNode mInsn = (MethodInsnNode) insn; for (MethodNode n : toReplace) { if (n.name.equals(mInsn.name) && n.desc.equals(mInsn.desc)) { mInsn.setOpcode(INVOKEVIRTUAL); break; }/*w ww . j ava 2 s .co m*/ } } } } }
From source file:net.minecrell.ice.launch.transformers.AccessTransformer.java
License:Open Source License
@Override public byte[] transform(String name, String transformedName, byte[] bytes) { if (bytes == null || !modifiers.containsKey(transformedName)) { return bytes; }/*from w ww.j ava2s .c om*/ ClassNode classNode = new ClassNode(); ClassReader reader = new ClassReader(bytes); reader.accept(classNode, 0); for (Modifier m : modifiers.get(transformedName)) { if (m.isClass) { // Class classNode.access = m.transform(classNode.access); } else if (m.desc == null) { // Field for (FieldNode fieldNode : classNode.fields) { if (m.wildcard || fieldNode.name.equals(m.name)) { fieldNode.access = m.transform(fieldNode.access); if (!m.wildcard) break; } } } else { List<MethodNode> overridable = null; for (MethodNode methodNode : classNode.methods) { if (m.wildcard || (methodNode.name.equals(m.name) && methodNode.desc.equals(m.desc))) { boolean wasPrivate = (methodNode.access & ACC_PRIVATE) != 0; methodNode.access = m.transform(methodNode.access); // Constructors always use INVOKESPECIAL // if we changed from private to something else we need to replace all INVOKESPECIAL calls to this method with INVOKEVIRTUAL // so that overridden methods will be called. Only need to scan this class, because obviously the method was private. if (!methodNode.name.equals("<init>") && wasPrivate && (methodNode.access & ACC_PRIVATE) == 0) { if (overridable == null) { overridable = new ArrayList<>(3); } overridable.add(methodNode); } if (!m.wildcard) break; } } if (overridable != null) { for (MethodNode methodNode : classNode.methods) { for (Iterator<AbstractInsnNode> itr = methodNode.instructions.iterator(); itr.hasNext();) { AbstractInsnNode insn = itr.next(); if (insn.getOpcode() == INVOKESPECIAL) { MethodInsnNode mInsn = (MethodInsnNode) insn; for (MethodNode replace : overridable) { if (replace.name.equals(mInsn.name) && replace.desc.equals(mInsn.desc)) { mInsn.setOpcode(INVOKEVIRTUAL); break; } } } } } } } } ClassWriter writer = new ClassWriter(0); classNode.accept(writer); return writer.toByteArray(); }
From source file:net.minecrell.quartz.launch.transformers.AccessTransformer.java
License:MIT License
@Override protected void transform(String name, String transformedName, ClassNode classNode) { List<MethodNode> overridable = null; for (Map.Entry<String, AccessMapping> entry : mappings.getAccessMappings().row(transformedName) .entrySet()) {//from w ww.j a v a 2 s .co m String target = entry.getKey(); AccessMapping accessMapping = entry.getValue(); if (target.isEmpty()) { // Class mapping accessMapping.transform(classNode); } else if (target.indexOf('(') >= 0) { int len = target.length(); // Method mapping for (MethodNode methodNode : classNode.methods) { // Fast check before we look more intensively if (methodNode.name.length() + methodNode.desc.length() != len || !(target.startsWith(methodNode.name) && target.endsWith(methodNode.desc))) continue; boolean wasPrivate = Access.PRIVATE.is(methodNode.access); accessMapping.transform(methodNode); // Constructors always use INVOKESPECIAL // If we changed from private to something else we need to replace all INVOKESPECIAL calls to this method with INVOKEVIRTUAL // So that overridden methods will be called. Only need to scan this class, because obviously the method was private. if (wasPrivate && accessMapping.getAccess() != Access.PRIVATE && !methodNode.name.equals("<init>")) { if (overridable == null) { overridable = new ArrayList<>(3); } overridable.add(methodNode); } break; } } else { // Field mapping for (FieldNode fieldNode : classNode.fields) { if (target.equals(fieldNode.name)) { accessMapping.transform(fieldNode); break; } } } } if (overridable != null) { for (MethodNode methodNode : classNode.methods) { for (Iterator<AbstractInsnNode> itr = methodNode.instructions.iterator(); itr.hasNext();) { AbstractInsnNode insn = itr.next(); if (insn.getOpcode() == INVOKESPECIAL) { MethodInsnNode mInsn = (MethodInsnNode) insn; for (MethodNode replace : overridable) { if (replace.name.equals(mInsn.name) && replace.desc.equals(mInsn.desc)) { mInsn.setOpcode(INVOKEVIRTUAL); break; } } } } } } }
From source file:net.minecrell.quartz.mappings.transformer.AccessTransformer.java
License:Open Source License
@Override public ClassNode transform(String name, String transformedName, ClassNode classNode) { List<MethodNode> overridable = null; for (Map.Entry<String, AccessTransform> entry : this.mapper.getAccessTransforms().row(transformedName) .entrySet()) {//from w w w . ja va 2 s . c om String target = entry.getKey(); AccessTransform access = entry.getValue(); if (target.isEmpty()) { // Class mapping classNode.access = access.transform(classNode.access); } else if (target.indexOf('(') >= 0) { int len = target.length(); // Method mapping for (MethodNode methodNode : classNode.methods) { // Fast check before we look more intensively if (methodNode.name.length() + methodNode.desc.length() != len || !(target.startsWith(methodNode.name) && target.endsWith(methodNode.desc))) continue; boolean wasPrivate = AccessModifier.PRIVATE.is(methodNode.access); methodNode.access = access.transform(methodNode.access); // Constructors always use INVOKESPECIAL // If we changed from private to something else we need to replace all INVOKESPECIAL calls to this method with INVOKEVIRTUAL // So that overridden methods will be called. Only need to scan this class, because obviously the method was private. if (wasPrivate && access.getAccess() != AccessModifier.PRIVATE && !methodNode.name.equals("<init>")) { if (overridable == null) { overridable = new ArrayList<>(3); } overridable.add(methodNode); } break; } } else { // Field mapping for (FieldNode fieldNode : classNode.fields) { if (target.equals(fieldNode.name)) { fieldNode.access = access.transform(fieldNode.access); break; } } } } if (overridable != null) { for (MethodNode methodNode : classNode.methods) { for (Iterator<AbstractInsnNode> itr = methodNode.instructions.iterator(); itr.hasNext();) { AbstractInsnNode insn = itr.next(); if (insn.getOpcode() == INVOKESPECIAL) { MethodInsnNode mInsn = (MethodInsnNode) insn; for (MethodNode replace : overridable) { if (replace.name.equals(mInsn.name) && replace.desc.equals(mInsn.desc)) { mInsn.setOpcode(INVOKEVIRTUAL); break; } } } } } } return classNode; }
From source file:net.roryclaasen.asm.rorysmodcore.transformer.EntityPlayerTransformer.java
License:Apache License
public byte[] patchOnUpdate(String name, byte[] bytes, boolean obfuscated) { RMLog.info("[EntityPlayer] [onUpdate] Patching", true); String targetMethodName = ""; if (obfuscated == true) targetMethodName = "h"; else//from www .j a v a 2 s . c o m targetMethodName = "onUpdate"; ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(bytes); classReader.accept(classNode, 0); Iterator<MethodNode> methods = classNode.methods.iterator(); while (methods.hasNext()) { MethodNode method = methods.next(); int invok_index = -1; if ((method.name.equals(targetMethodName) && method.desc.equals("()V"))) { AbstractInsnNode currentNode = null; AbstractInsnNode targetNode = null; Iterator<AbstractInsnNode> iter = method.instructions.iterator(); int index = -1; int GETFIELD_COUNT = 0; while (iter.hasNext()) { index++; currentNode = iter.next(); if (currentNode.getOpcode() == Opcodes.GETFIELD) { GETFIELD_COUNT++; if (GETFIELD_COUNT == 13) { targetNode = currentNode; invok_index = index; break; } } } if (targetNode == null || invok_index == -1) { RMLog.info("[EntityPlayer] Did not find all necessary target nodes! ABANDON CLASS!", true); return bytes; } /* * mv.visitLineNumber(305, l19); * mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); * mv.visitVarInsn(ALOAD, 0); * -- mv.visitFieldInsn(GETFIELD, "net/minecraft/entity/player/EntityPlayer", "worldObj", "Lnet/minecraft/world/World;"); * mv.visitFieldInsn(GETFIELD, "net/minecraft/world/World", "isRemote", "Z"); * Label l21 = new Label(); * mv.visitJumpInsn(IFNE, l21); */ @SuppressWarnings("unused") AbstractInsnNode p1, p2, p3; p1 = method.instructions.get(invok_index - 1); // mv.visitVarInsn(ALOAD, 0); p2 = method.instructions.get(invok_index); // mv.visitFieldInsn(GETFIELD, "net/minecraft/entity/player/EntityPlayer", "worldObj", "Lnet/minecraft/world/World;"); p3 = method.instructions.get(invok_index + 1); // mv.visitFieldInsn(GETFIELD, "net/minecraft/world/World", "isRemote", "Z"); //method.instructions.remove(p1); //method.instructions.remove(p2); //method.instructions.remove(p3); MethodInsnNode m1 = new MethodInsnNode(Opcodes.INVOKESTATIC, "net/roryclaasen/asm/rorysmodcore/transformer/StaticClass", "shouldWakeUp", "(Lnet/minecraft/entity/player/EntityPlayer;)Z", false); method.instructions.set(p2, m1); method.instructions.remove(p3); break; } } ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); classNode.accept(writer); return writer.toByteArray(); }
From source file:net.roryclaasen.asm.rorysmodcore.transformer.WorldServerTransformer.java
License:Apache License
public byte[] patchTick(String name, byte[] bytes, boolean obfuscated) { RMLog.info("[WorldServer] [tick] Patching", true); String targetMethodName = ""; if (obfuscated == true) targetMethodName = "b"; else//from w w w . j a v a 2 s . c o m targetMethodName = "tick"; ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(bytes); classReader.accept(classNode, 0); Iterator<MethodNode> methods = classNode.methods.iterator(); while (methods.hasNext()) { MethodNode method = methods.next(); int invok_index = -1; if ((method.name.equals(targetMethodName) && method.desc.equals("()V"))) { AbstractInsnNode currentNode = null; AbstractInsnNode targetNode = null; Iterator<AbstractInsnNode> iter = method.instructions.iterator(); int index = -1; int INVOKEVIRTUAL_COUNT = 0; while (iter.hasNext()) { index++; currentNode = iter.next(); if (currentNode.getOpcode() == Opcodes.INVOKEVIRTUAL) { INVOKEVIRTUAL_COUNT++; if (INVOKEVIRTUAL_COUNT == 9) { targetNode = currentNode; invok_index = index; break; } } } if (targetNode == null || invok_index == -1) { RMLog.info("[WorldServer] Did not find all necessary target nodes! ABANDON CLASS!", true); return bytes; } AbstractInsnNode p1 = method.instructions.get(invok_index); MethodInsnNode a1 = new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/world/WorldServer", "resetRainAndThunder", "()V", false); method.instructions.set(p1, a1); break; } } ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); classNode.accept(writer); return writer.toByteArray(); }
From source file:net.roryclaasen.asm.rorysmodcore.transformer.WorldServerTransformer.java
License:Apache License
public byte[] patchWakeAllPlayers(String name, byte[] bytes, boolean obfuscated) { RMLog.info("[WorldServer] [wakeAllPlayers] Patching", true); String targetMethodName = ""; if (obfuscated == true) targetMethodName = "d"; else/*from ww w .ja v a2 s . co m*/ targetMethodName = "wakeAllPlayers"; ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(bytes); classReader.accept(classNode, 0); Iterator<MethodNode> methods = classNode.methods.iterator(); while (methods.hasNext()) { MethodNode method = methods.next(); int invok_index = -1; if ((method.name.equals(targetMethodName) && method.desc.equals("()V"))) { AbstractInsnNode currentNode = null; AbstractInsnNode targetNode = null; Iterator<AbstractInsnNode> iter = method.instructions.iterator(); int index = -1; while (iter.hasNext()) { index++; currentNode = iter.next(); if (currentNode.getOpcode() == Opcodes.INVOKEVIRTUAL) { invok_index = index; targetNode = currentNode; break; } } if (targetNode == null || invok_index == -1) { RMLog.info("[WorldServer] Did not find all necessary target nodes! ABANDON CLASS!", true); return bytes; } AbstractInsnNode p1 = method.instructions.get(invok_index); MethodInsnNode p2 = new MethodInsnNode(Opcodes.INVOKESTATIC, "net/roryclaasen/asm/rorysmodcore/transformer/StaticClass", "shouldWakeUp", "()Z", false); method.instructions.set(p1, p2); method.instructions.remove(method.instructions.get(invok_index - 1)); break; } } ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); classNode.accept(writer); return writer.toByteArray(); }
From source file:nova.core.wrapper.mc.forge.v17.asm.lib.ASMHelper.java
License:Open Source License
public static boolean isReturn(AbstractInsnNode node) { switch (node.getOpcode()) { case RET:/*w w w.j a v a 2s. c o m*/ case RETURN: case ARETURN: case DRETURN: case FRETURN: case IRETURN: case LRETURN: return true; default: return false; } }
From source file:nova.core.wrapper.mc.forge.v17.asm.lib.InsnListPrinter.java
License:Open Source License
private void _visitInsn(AbstractInsnNode insn) { switch (insn.getType()) { case 0:/*from ww w .j a v a 2s. co m*/ visitInsn(insn.getOpcode()); break; case 1: IntInsnNode iinsn = (IntInsnNode) insn; visitIntInsn(iinsn.getOpcode(), iinsn.operand); break; case 2: VarInsnNode vinsn = (VarInsnNode) insn; visitVarInsn(vinsn.getOpcode(), vinsn.var); break; case 3: TypeInsnNode tinsn = (TypeInsnNode) insn; visitTypeInsn(tinsn.getOpcode(), tinsn.desc); break; case 4: FieldInsnNode finsn = (FieldInsnNode) insn; visitFieldInsn(finsn.getOpcode(), finsn.owner, finsn.name, finsn.desc); break; case 5: MethodInsnNode minsn = (MethodInsnNode) insn; visitMethodInsn(minsn.getOpcode(), minsn.owner, minsn.name, minsn.desc); break; case 6: InvokeDynamicInsnNode idinsn = (InvokeDynamicInsnNode) insn; visitInvokeDynamicInsn(idinsn.name, idinsn.desc, idinsn.bsm, idinsn.bsmArgs); break; case 7: JumpInsnNode jinsn = (JumpInsnNode) insn; visitJumpInsn(jinsn.getOpcode(), jinsn.label.getLabel()); break; case 8: LabelNode linsn = (LabelNode) insn; visitLabel(linsn.getLabel()); break; case 9: LdcInsnNode ldcinsn = (LdcInsnNode) insn; visitLdcInsn(ldcinsn.cst); break; case 10: IincInsnNode iiinsn = (IincInsnNode) insn; visitIincInsn(iiinsn.var, iiinsn.incr); break; case 11: TableSwitchInsnNode tsinsn = (TableSwitchInsnNode) insn; Label[] tslables = new Label[tsinsn.labels.size()]; for (int i = 0; i < tslables.length; i++) { tslables[i] = tsinsn.labels.get(i).getLabel(); } visitTableSwitchInsn(tsinsn.min, tsinsn.max, tsinsn.dflt.getLabel(), tslables); break; case 12: LookupSwitchInsnNode lsinsn = (LookupSwitchInsnNode) insn; Label[] lslables = new Label[lsinsn.labels.size()]; for (int i = 0; i < lslables.length; i++) { lslables[i] = lsinsn.labels.get(i).getLabel(); } int[] lskeys = new int[lsinsn.keys.size()]; for (int i = 0; i < lskeys.length; i++) { lskeys[i] = lsinsn.keys.get(i); } visitLookupSwitchInsn(lsinsn.dflt.getLabel(), lskeys, lslables); break; case 13: MultiANewArrayInsnNode ainsn = (MultiANewArrayInsnNode) insn; visitMultiANewArrayInsn(ainsn.desc, ainsn.dims); break; case 14: FrameNode fnode = (FrameNode) insn; switch (fnode.type) { case -1: case 0: visitFrame(fnode.type, fnode.local.size(), fnode.local.toArray(), fnode.stack.size(), fnode.stack.toArray()); break; case 1: visitFrame(fnode.type, fnode.local.size(), fnode.local.toArray(), 0, null); break; case 2: visitFrame(fnode.type, fnode.local.size(), null, 0, null); break; case 3: visitFrame(fnode.type, 0, null, 0, null); break; case 4: visitFrame(fnode.type, 0, null, 1, fnode.stack.toArray()); } break; case 15: LineNumberNode lnode = (LineNumberNode) insn; visitLineNumber(lnode.line, lnode.start.getLabel()); break; } }