Java Code Examples for org.objectweb.asm.Opcodes#INVOKEVIRTUAL

The following examples show how to use org.objectweb.asm.Opcodes#INVOKEVIRTUAL . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: AllocationMethodAdapter.java    From allocation-instrumenter with Apache License 2.0 6 votes vote down vote up
private void buildRecorderFromObject(
    int opcode, String owner, String name, String signature, boolean itf) {
  super.visitMethodInsn(opcode, owner, name, signature, itf);
  // -> stack: ... newobj
  super.visitInsn(Opcodes.DUP);
  // -> stack: ... newobj newobj
  super.visitInsn(Opcodes.DUP);
  // -> stack: ... newobj newobj newobj
  // We could be instantiating this class or a subclass, so we
  // have to get the class the hard way.
  super.visitMethodInsn(
      Opcodes.INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
  // -> stack: ... newobj newobj Class
  super.visitInsn(Opcodes.SWAP);
  // -> stack: ... newobj Class newobj
  super.visitMethodInsn(
      Opcodes.INVOKESTATIC, recorderClass, recorderMethod, CLASS_RECORDER_SIG, false);
  // -> stack: ... newobj
}
 
Example 2
Source File: BigIntegerMutator.java    From pitest with Apache License 2.0 6 votes vote down vote up
@Override
public void visitMethodInsn(int opcode, String owner, String name, String descriptor,
    boolean isInterface) {
  if (!owner.equals(expectedOwner) || opcode != Opcodes.INVOKEVIRTUAL) {
    this.mv.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
    return;
  }

  Replacement replacement = REPLACEMENTS.get(name);
  if (replacement != null && replacement.descriptor.equals(descriptor)) {
    MutationIdentifier identifier = context.registerMutation(factory, replacement.toString());
    if (context.shouldMutate(identifier)) {
      this.mv.visitMethodInsn(
          opcode,
          owner,
          replacement.destinationName,
          replacement.descriptor,
          false);
      return;
    }
  }

  this.mv.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
}
 
Example 3
Source File: InterfaceDesugaring.java    From bazel with Apache License 2.0 6 votes vote down vote up
static String normalizeInterfaceMethodName(String name, boolean isLambda, int opcode) {
  if (isLambda) {
    // Rename lambda method to reflect the new owner.  Not doing so confuses LambdaDesugaring
    // if it's run over this class again. LambdaDesugaring has already renamed the method from
    // its original name to include the interface name at this point.
    return name + DependencyCollector.INTERFACE_COMPANION_SUFFIX;
  }

  switch (opcode) {
    case Opcodes.INVOKESPECIAL:
      // Rename static methods holding default method implementations since their descriptor
      // differs from the original method (due to explicit receiver parameter). This avoids
      // possible clashes with static interface methods or generated stubs for default methods
      // that could otherwise have the same name and descriptor by coincidence.
      return name + DEFAULT_COMPANION_METHOD_SUFFIX;
    case Opcodes.INVOKESTATIC: // moved but with same name
      return name + "$$STATIC$$"; // TODO(b/117453106): Stop renaming static interface methods
    case Opcodes.INVOKEINTERFACE: // not moved
    case Opcodes.INVOKEVIRTUAL: // tolerate being called for non-interface methods
      return name;
    default:
      throw new IllegalArgumentException("Unexpected opcode calling " + name + ": " + opcode);
  }
}
 
Example 4
Source File: AllocationMethodAdapter.java    From allocation-instrumenter with Apache License 2.0 5 votes vote down vote up
private void pushClassNameOnStack() {
  super.visitInsn(Opcodes.DUP);
  // -> stack: ... class class
  super.visitMethodInsn(
      Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false);
  // -> stack: ... class classNameDotted
}
 
Example 5
Source File: Transformer.java    From Kettle with GNU General Public License v3.0 5 votes vote down vote up
/**
 * Convert code from using Class.X methods to our remapped versions
 */
public static byte[] transform(byte[] code) {
    ClassReader reader = new ClassReader(code); // Turn from bytes into visitor
    ClassNode node = new ClassNode();
    reader.accept(node, 0); // Visit using ClassNode

    for (MethodNode method : node.methods) { // Taken from SpecialSource
        ListIterator<AbstractInsnNode> insnIterator = method.instructions.iterator();
        while (insnIterator.hasNext()) {
            AbstractInsnNode insn = insnIterator.next();
            if (!(insn instanceof MethodInsnNode)) {
                continue;
            }
            MethodInsnNode mi = (MethodInsnNode) insn;
            switch (mi.getOpcode()) {
                case Opcodes.INVOKEVIRTUAL:
                    remapVirtual(mi);
                    break;
                case Opcodes.INVOKESTATIC:
                    remapForName(mi);
                    break;
            }
        }
    }

    ClassWriter writer = new ClassWriter(0);
    node.accept(writer);
    return writer.toByteArray();
}
 
Example 6
Source File: AccessorGeneratorMethodProxy.java    From Mixin with MIT License 5 votes vote down vote up
@Override
public MethodNode generate() {
    int size = Bytecode.getArgsSize(this.argTypes) + this.returnType.getSize() + (this.targetIsStatic ? 0 : 1);
    MethodNode method = this.createMethod(size, size);
    if (!this.targetIsStatic) {
        method.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
    }
    Bytecode.loadArgs(this.argTypes, method.instructions, this.targetIsStatic ? 0 : 1);
    boolean isPrivate = Bytecode.hasFlag(this.targetMethod, Opcodes.ACC_PRIVATE);
    int opcode = this.targetIsStatic ? Opcodes.INVOKESTATIC : (isPrivate ? Opcodes.INVOKESPECIAL : Opcodes.INVOKEVIRTUAL);
    method.instructions.add(new MethodInsnNode(opcode, this.info.getClassNode().name, this.targetMethod.name, this.targetMethod.desc, false));
    method.instructions.add(new InsnNode(this.returnType.getOpcode(Opcodes.IRETURN)));
    return method;
}
 
Example 7
Source File: VirtualInvocationExpr.java    From maple-ir with GNU General Public License v3.0 5 votes vote down vote up
private static int resolveASMOpcode(CallType t) {
	switch (t) {
	case SPECIAL:
		return Opcodes.INVOKESPECIAL;
	case VIRTUAL:
		return Opcodes.INVOKEVIRTUAL;
	case INTERFACE:
		return Opcodes.INVOKEINTERFACE;
	default:
		throw new IllegalArgumentException(t.toString());
	}
}
 
Example 8
Source File: GenerationPass.java    From maple-ir with GNU General Public License v3.0 5 votes vote down vote up
protected void _call(int op, String owner, String name, String desc) {
	save_stack(false);
	int argLen = Type.getArgumentTypes(desc).length + (op == INVOKESTATIC ? 0 : 1);
	Expr[] args = new Expr[argLen];
	for (int i = args.length - 1; i >= 0; i--) {
		args[i] = pop();
	}
	InvocationExpr callExpr;
	switch(op) {
		case Opcodes.INVOKEVIRTUAL:
		case Opcodes.INVOKEINTERFACE:
		case Opcodes.INVOKESPECIAL:
			callExpr = new VirtualInvocationExpr(VirtualInvocationExpr.resolveCallType(op), args, owner, name, desc);
			break;
		case Opcodes.INVOKESTATIC:
			callExpr = new StaticInvocationExpr(args, owner, name, desc);
			break;
		default:
			throw new IllegalArgumentException("invalid call opcode " + op);
	}
	if(callExpr.getType() == Type.VOID_TYPE) {
		addStmt(new PopStmt(callExpr));
	} else {
		int index = currentStack.height();
		Type type = assign_stack(index, callExpr);
		push(load_stack(index, type));
	}
}
 
Example 9
Source File: CheckMethodAdapter.java    From JReFrameworker with MIT License 5 votes vote down vote up
private void doVisitMethodInsn(
    final int opcode,
    final String owner,
    final String name,
    final String descriptor,
    final boolean isInterface) {
  checkVisitCodeCalled();
  checkVisitMaxsNotCalled();
  checkOpcodeMethod(opcode, Method.VISIT_METHOD_INSN);
  if (opcode != Opcodes.INVOKESPECIAL || !"<init>".equals(name)) {
    checkMethodIdentifier(version, name, "name");
  }
  checkInternalName(version, owner, "owner");
  checkMethodDescriptor(version, descriptor);
  if (opcode == Opcodes.INVOKEVIRTUAL && isInterface) {
    throw new IllegalArgumentException("INVOKEVIRTUAL can't be used with interfaces");
  }
  if (opcode == Opcodes.INVOKEINTERFACE && !isInterface) {
    throw new IllegalArgumentException("INVOKEINTERFACE can't be used with classes");
  }
  if (opcode == Opcodes.INVOKESPECIAL && isInterface && (version & 0xFFFF) < Opcodes.V1_8) {
    throw new IllegalArgumentException(
        "INVOKESPECIAL can't be used with interfaces prior to Java 8");
  }

  // Calling super.visitMethodInsn requires to call the correct version depending on this.api
  // (otherwise infinite loops can occur). To simplify and to make it easier to automatically
  // remove the backward compatibility code, we inline the code of the overridden method here.
  if (mv != null) {
    mv.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
  }
  ++insnCount;
}
 
Example 10
Source File: AsmUtils.java    From grappa with Apache License 2.0 5 votes vote down vote up
public static boolean isCallOnContextAware(final AbstractInsnNode insn)
{
    Objects.requireNonNull(insn, "insn");
    if (insn.getOpcode() != Opcodes.INVOKEVIRTUAL
        && insn.getOpcode() != Opcodes.INVOKEINTERFACE)
        return false;
    final MethodInsnNode mi = (MethodInsnNode) insn;
    return isAssignableTo(mi.owner, ContextAware.class);
}
 
Example 11
Source File: EclipseRewriter.java    From spring-javaformat with Apache License 2.0 5 votes vote down vote up
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
	if (opcode == Opcodes.INVOKESPECIAL && UPDATED_METHODS.contains(name)) {
		opcode = Opcodes.INVOKEVIRTUAL;
	}
	super.visitMethodInsn(opcode, owner, name, desc, itf);
}
 
Example 12
Source File: ContinuableMethodNode.java    From tascalate-javaflow with Apache License 2.0 5 votes vote down vote up
private boolean needsFrameGuard(int opcode, String owner, String name, String desc) {
    if (owner.startsWith("java/") || owner.startsWith("javax/")) {
        //System.out.println("SKIP:: " + owner + "." + name + desc);
        return false;
    }

    // Always create save-point before Continuation methods (like suspend)
    if (CONTINUATION_CLASS_INTERNAL_NAME.equals(owner)) {
        return CONTINUATION_CLASS_CONTINUABLE_METHODS.contains(name);
    }

    // No need to create save-point before constructors -- it's forbidden to suspend in constructors anyway
    if (opcode == Opcodes.INVOKESPECIAL && "<init>".equals(name)) {
        return false;
    }

    if (opcode == Opcodes.INVOKEINTERFACE ||
        opcode == Opcodes.INVOKESPECIAL   ||
        opcode == Opcodes.INVOKESTATIC    ||
        opcode == Opcodes.INVOKEVIRTUAL) {
        ContinuableClassInfo classInfo;
        try {
            classInfo = cciResolver.resolve(owner);
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
        return null != classInfo && classInfo.isContinuableMethod(opcode, name, desc, desc);
    }
    return false;
}
 
Example 13
Source File: LambdaClassFixer.java    From bazel with Apache License 2.0 5 votes vote down vote up
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
  if (opcode == Opcodes.INVOKESPECIAL && name.startsWith("lambda$")) {
    opcode = itf ? Opcodes.INVOKEINTERFACE : Opcodes.INVOKEVIRTUAL;
  }

  super.visitMethodInsn(opcode, owner, name, desc, itf);
}
 
Example 14
Source File: CheckMethodAdapter.java    From Concurnas with MIT License 5 votes vote down vote up
@Override
public void visitMethodInsn(
    final int opcodeAndSource,
    final String owner,
    final String name,
    final String descriptor,
    final boolean isInterface) {
  if (api < Opcodes.ASM5 && (opcodeAndSource & Opcodes.SOURCE_DEPRECATED) == 0) {
    // Redirect the call to the deprecated version of this method.
    super.visitMethodInsn(opcodeAndSource, owner, name, descriptor, isInterface);
    return;
  }
  int opcode = opcodeAndSource & ~Opcodes.SOURCE_MASK;

  checkVisitCodeCalled();
  checkVisitMaxsNotCalled();
  checkOpcodeMethod(opcode, Method.VISIT_METHOD_INSN);
  if (opcode != Opcodes.INVOKESPECIAL || !"<init>".equals(name)) {
    checkMethodIdentifier(version, name, "name");
  }
  checkInternalName(version, owner, "owner");
  checkMethodDescriptor(version, descriptor);
  if (opcode == Opcodes.INVOKEVIRTUAL && isInterface) {
    throw new IllegalArgumentException("INVOKEVIRTUAL can't be used with interfaces");
  }
  if (opcode == Opcodes.INVOKEINTERFACE && !isInterface) {
    throw new IllegalArgumentException("INVOKEINTERFACE can't be used with classes");
  }
  if (opcode == Opcodes.INVOKESPECIAL && isInterface && (version & 0xFFFF) < Opcodes.V1_8) {
    throw new IllegalArgumentException(
        "INVOKESPECIAL can't be used with interfaces prior to Java 8");
  }
  super.visitMethodInsn(opcodeAndSource, owner, name, descriptor, isInterface);
  ++insnCount;
}
 
Example 15
Source File: MethodsMirror.java    From CodenameOne with GNU General Public License v2.0 5 votes vote down vote up
/**
 * Returns true if the mirror contains a method that mirrors
 * <code>methodName</code>. The mirror method should be static, have the
 * same name, and have the exact same arguments excepting an argument of
 * type
 */
public boolean hasMethod(final String owner, final String methodName, final String methodDescriptor, final int opcode) {
	Type[] types = Type.getArgumentTypes(methodDescriptor);

	if (opcode == Opcodes.INVOKEVIRTUAL || opcode == Opcodes.INVOKEINTERFACE) {
		Type[] newTypes = new Type[types.length + 1];
		newTypes[0] = Type.getType("L" + owner + ";");
		System.arraycopy(types, 0, newTypes, 1, types.length);
		types = newTypes;
	}

outer_loop:
	for (Method m : class_.getDeclaredMethods()) {
		final Type[] methodTypes = Type.getArgumentTypes(m);
		if (!m.getName().equals(methodName)
				|| methodTypes.length != types.length) {
			continue;
		}

		for (int i = 0; i < types.length; ++i) {
			if (!types[i].equals(methodTypes[i])) {
				continue outer_loop;
			}
		}

		return true;
	}

	return false;
}
 
Example 16
Source File: MethodGenerator.java    From yql-plus with Apache License 2.0 5 votes vote down vote up
@Override
public GambitCreator.Invocable createInvocable() {
    int op = Opcodes.INVOKEVIRTUAL;
    if (Modifier.isStatic(modifiers)) {
        op = Opcodes.INVOKESTATIC;
    }
    return ExactInvocation.exactInvoke(op, name, unit.getType(), getReturnType(), getArgumentTypes());
}
 
Example 17
Source File: ItemTransformer.java    From SkyblockAddons with MIT License 5 votes vote down vote up
@Override
public void transform(ClassNode classNode, String name) {
    for (MethodNode methodNode : classNode.methods) { // Loop through all methods inside of the class.

        String methodName = methodNode.name;
        if (nameMatches(methodName, "showDurabilityBar")) { // always deobfuscated

            // Objective:
            // Find: return stack.isItemDamaged();
            // Replace With: return ItemHook.isItemDamaged(stack);

            Iterator<AbstractInsnNode> iterator = methodNode.instructions.iterator();
            while (iterator.hasNext()) {
                AbstractInsnNode abstractNode = iterator.next();
                if (abstractNode instanceof MethodInsnNode && abstractNode.getOpcode() == Opcodes.INVOKEVIRTUAL) {
                    MethodInsnNode methodInsnNode = (MethodInsnNode)abstractNode;
                    if (methodInsnNode.owner.equals(TransformerClass.ItemStack.getNameRaw()) && TransformerMethod.isItemDamaged.matches(methodInsnNode)) {
                        methodNode.instructions.insertBefore(abstractNode, new MethodInsnNode(Opcodes.INVOKESTATIC, "codes/biscuit/skyblockaddons/asm/hooks/ItemHook",
                                "isItemDamaged", "("+ TransformerClass.ItemStack.getName()+")Z", false)); // ItemHook.isItemDamaged(stack);

                        iterator.remove(); // Remove the old line.
                        break;
                    }
                }
            }
        }
        if (nameMatches(methodName, "getDurabilityForDisplay")) { // always deobfuscated

            // Objective:
            // Find: Method head.
            // Insert:   ReturnValue returnValue = new ReturnValue();
            //           ItemHook.getDurabilityForDisplay(stack, returnValue);
            //           if (returnValue.isCancelled()) {
            //               return returnValue.getValue();
            //           }

            methodNode.instructions.insertBefore(methodNode.instructions.getFirst(), insertDurabilityHook());
        }
    }
}
 
Example 18
Source File: CustomInvoke.java    From CodenameOne with GNU General Public License v2.0 4 votes vote down vote up
public boolean appendExpression(StringBuilder b) {
    // special case for clone on an array which isn't a real method invocation
    if(name.equals("clone") && owner.indexOf('[') > -1) {
        if (targetObjectLiteral != null) {
            b.append("cloneArray(").append(targetObjectLiteral).append(")");
        } else {
            b.append("cloneArray(POP_OBJ(1))");
        }
        return true;
    }
    
    StringBuilder bld = new StringBuilder();
    if(origOpcode == Opcodes.INVOKEINTERFACE || origOpcode == Opcodes.INVOKEVIRTUAL) {
        //b.append("    ");
        bld.append("virtual_");
    }
    
    if(origOpcode == Opcodes.INVOKESTATIC) {
        // find the actual class of the static method to workaround javac not defining it correctly
        ByteCodeClass bc = Parser.getClassObject(owner.replace('/', '_').replace('$', '_'));
        owner = findActualOwner(bc);
    }

    bld.append(owner.replace('/', '_').replace('$', '_'));
    bld.append("_");
    if(name.equals("<init>")) {
        bld.append("__INIT__");
    } else {
        if(name.equals("<clinit>")) {
            bld.append("__CLINIT__");
        } else {
            bld.append(name);
        }
    }
    bld.append("__");
    ArrayList<String> args = new ArrayList<String>();
    String returnVal = BytecodeMethod.appendMethodSignatureSuffixFromDesc(desc, bld, args);
    int numLiteralArgs = this.getNumLiteralArgs();
    if (numLiteralArgs > 0) {
        b.append("/* CustomInvoke */");
    }
    boolean noPop = false;
    b.append(bld);
    
    b.append("(threadStateData");
    
    
    
    if(origOpcode != Opcodes.INVOKESTATIC) {
        if (targetObjectLiteral == null) {
            //b.append(", SP[-");
            //b.append(args.size() + 1 - numLiteralArgs);
            //b.append("].data.o");
            return false;
        } else {
            b.append(", ").append(targetObjectLiteral);
            numLiteralArgs++;
        }
    }
    //int offset = args.size();
    //int numArgs = offset;
    int argIndex=0;
    for(String a : args) {
        
        b.append(", ");
        if (literalArgs != null && literalArgs[argIndex] != null) {
            b.append(literalArgs[argIndex]);
        } else {
            return false;
            //b.append("SP[-");
            //b.append(offset);
            //b.append("].data.");
            //b.append(a);
            //offset--;
        }
        argIndex++;
    }
    if (returnVal == null) {
        return false;
    }
    
    b.append(")");
    
    return true;
    
}
 
Example 19
Source File: ClassParserUsingASM.java    From spotbugs with GNU Lesser General Public License v2.1 4 votes vote down vote up
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
    identityState = IdentityMethodState.NOT;
    methodCallCount++;
    if (isAccessMethod && this.accessOwner == null) {
        this.accessOwner = owner;
        this.accessName = name;
        this.accessDesc = desc;
        this.accessIsStatic = opcode == Opcodes.INVOKESTATIC;
        this.accessForField = false;
    }
    if (stubState == StubState.LOADED_STUB && opcode == Opcodes.INVOKESPECIAL
            && "java/lang/RuntimeException".equals(owner) && "<init>".equals(name)) {
        stubState = StubState.INITIALIZE_RUNTIME;
    } else {
        stubState = StubState.INITIAL;
    }
    if (owner.startsWith("java/util/concurrent")) {
        mBuilder.setUsesConcurrency();
    }
    if (opcode == Opcodes.INVOKEINTERFACE) {
        return;
    }

    if (owner.charAt(0) == '[' && owner.charAt(owner.length() - 1) != ';') {
        // primitive array
        return;
    }
    if (opcode == Opcodes.INVOKESTATIC && "java/lang/System".equals(owner) && "exit".equals(name)
            && !sawReturn) {
        sawSystemExit = true;
    }
    justSawInitializationOfUnsupportedOperationException = opcode == Opcodes.INVOKESPECIAL
            && "java/lang/UnsupportedOperationException".equals(owner) && "<init>".equals(name);

    if (isBridge && bridgedMethodSignature == null) {
        switch (opcode) {
        case Opcodes.INVOKEVIRTUAL:
        case Opcodes.INVOKESPECIAL:
        case Opcodes.INVOKESTATIC:
        case Opcodes.INVOKEINTERFACE:
            if (desc != null && name.equals(methodName)) {
                bridgedMethodSignature = desc;
            }
            break;
        default:
            break;
        }
    }

    // System.out.println("Call from " +
    // ClassParserUsingASM.this.slashedClassName +
    // " to " + owner + " : " + desc);
    if (desc == null || desc.indexOf('[') == -1 && desc.indexOf('L') == -1) {
        return;
    }
    if (ClassParserUsingASM.this.slashedClassName.equals(owner)) {
        return;
    }
    ClassDescriptor classDescriptor = DescriptorFactory.instance().getClassDescriptor(owner);
    calledClassSet.add(classDescriptor);

}
 
Example 20
Source File: TileEntityEnderChestRendererTransformer.java    From SkyblockAddons with MIT License 4 votes vote down vote up
@Override
public void transform(ClassNode classNode, String name) {
    for (MethodNode methodNode : classNode.methods) {
        if (TransformerMethod.renderTileEntityAt.matches(methodNode)) {

            // Objective:
            // Find: this.bindTexture(ENDER_CHEST_TEXTURE);
            // Replacement: TileEntityEnderChestRendererHook.bindTexture(this, (ResourceLocation)ENDER_CHEST_TEXTURE);

            // Objective:
            // Find: this.field_147521_c.renderAll();
            // Insert 2 lines before: TileEntityEnderChestRendererHook.setEnderchestColor();

            int bindTextureCount = 0;

            Iterator<AbstractInsnNode> iterator = methodNode.instructions.iterator();

            while (iterator.hasNext()) {
                AbstractInsnNode abstractNode = iterator.next();

                if (abstractNode instanceof MethodInsnNode && abstractNode.getOpcode() == Opcodes.INVOKEVIRTUAL) {
                    MethodInsnNode methodInsnNode = (MethodInsnNode)abstractNode;
                    if (methodInsnNode.owner.equals(TransformerClass.TileEntityEnderChestRenderer.getNameRaw())
                            && TransformerMethod.bindTexture.matches(methodInsnNode)) { // TileEntityEnderChestRendererHook.bindTexture(ENDER_CHEST_TEXTURE);
                        if (bindTextureCount == 1) { // Find the second statement, not the first one.
                            methodNode.instructions.insertBefore(abstractNode, new MethodInsnNode(Opcodes.INVOKESTATIC, "codes/biscuit/skyblockaddons/asm/hooks/TileEntityEnderChestRendererHook",
                                    // Add TileEntityEnderChestRendererHook.bindTexture(this, (ResourceLocation)ENDER_CHEST_TEXTURE);
                                    "bindTexture", "("+TransformerClass.TileEntityEnderChestRenderer.getName()+TransformerClass.ResourceLocation.getName()+")V", false));
                            iterator.remove(); // Remove the old method call.
                        }
                        bindTextureCount++;
                    } else if (methodInsnNode.owner.equals(TransformerClass.ModelChest.getNameRaw())
                            && TransformerMethod.renderAll.matches(methodInsnNode)) { // The two lines are to make sure its before the "this" & the "field_147521_c".
                        methodNode.instructions.insertBefore(methodNode.instructions.get(methodNode.instructions.indexOf(abstractNode)-2), insertChangeEnderchestColor());
                    }
                }
            }
            break;
        }
    }
}