Example usage for org.objectweb.asm.tree MethodNode MethodNode

List of usage examples for org.objectweb.asm.tree MethodNode MethodNode

Introduction

In this page you can find the example usage for org.objectweb.asm.tree MethodNode MethodNode.

Prototype

public MethodNode(final int access, final String name, final String descriptor, final String signature,
        final String[] exceptions) 

Source Link

Document

Constructs a new MethodNode .

Usage

From source file:gemlite.maven.plugin.support.mapper.MapperToolProcessor.java

License:Apache License

private void addMapperKeySimple(ClassNode mapper, FieldNode key) {
    if (DomainMojoHelper.log().isDebugEnabled())
        DomainMojoHelper.log().debug("Add mapperKey(IDataSource)K method, key field:" + key.name);
    String fullDesc = AsmHelper.toFullName(key.desc);
    MethodNode mn = new MethodNode(ACC_PUBLIC, "mapperKey",
            "(Lgemlite/core/internal/domain/IDataSource;)" + fullDesc, null, null);
    InsnList insn = mn.instructions;//  w  w  w . j  ava  2s .  c  o  m
    insn.add(new VarInsnNode(ALOAD, 1));
    insn.add(new LdcInsnNode(key.name));

    Item1 mti = MapperToolRegistry.getDataSItem(key.desc);
    insn.add(AsmHelper.newMethodInsnNode(INVOKEINTERFACE, "gemlite/core/internal/domain/IDataSource",
            mti.getMethod, "(Ljava/lang/String;)" + key.desc, true));
    AsmHelper.addTypeConvert(insn, key.desc);
    insn.add(new InsnNode(ARETURN));
    mapper.methods.add(mn);
    if (DomainMojoHelper.log().isDebugEnabled())
        DomainMojoHelper.log().debug("Add mapperKey(IDataSource)K method, key field:" + key.name);
}

From source file:gemlite.maven.plugin.support.mapper.MapperToolProcessor.java

License:Apache License

private void addFieldNames(ClassNode domain, ClassNode mapper, ClassNode kcn, FieldNode kfn) {
    // ???fieldNames
    MethodNode mn = new MethodNode(ACC_STATIC, "<clinit>", "()V", null, null);
    InsnList insn = mn.instructions;// w ww .  j av  a 2 s  . co  m
    // new valueFieldNames
    insn.add(new TypeInsnNode(NEW, "java/util/ArrayList"));
    insn.add(new InsnNode(DUP));
    insn.add(AsmHelper.newMethodInsnNode(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", false));
    insn.add(new FieldInsnNode(PUTSTATIC, mapper.name, "valueFieldNames", "Ljava/util/List;"));
    // new keyFieldNames
    insn.add(new TypeInsnNode(NEW, "java/util/ArrayList"));
    insn.add(new InsnNode(DUP));
    insn.add(AsmHelper.newMethodInsnNode(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", false));
    insn.add(new FieldInsnNode(PUTSTATIC, mapper.name, "keyFieldNames", "Ljava/util/List;"));
    // value fields
    for (Object o : domain.fields) {
        FieldNode fn = (FieldNode) o;
        if (!DomainMojoHelper.isValidField(fn))
            continue;

        insn.add(new FieldInsnNode(GETSTATIC, mapper.name, "valueFieldNames", "Ljava/util/List;"));
        insn.add(new LdcInsnNode(fn.name));
        insn.add(AsmHelper.newMethodInsnNode(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z",
                true));
        insn.add(new InsnNode(POP));
    }
    // key fields
    if (kcn != null) {
        for (Object o : kcn.fields) {
            FieldNode fn = (FieldNode) o;
            insn.add(new FieldInsnNode(GETSTATIC, mapper.name, "keyFieldNames", "Ljava/util/List;"));
            insn.add(new LdcInsnNode(fn.name));
            insn.add(AsmHelper.newMethodInsnNode(INVOKEINTERFACE, "java/util/List", "add",
                    "(Ljava/lang/Object;)Z", true));
            insn.add(new InsnNode(POP));
        }
    } else {
        insn.add(new FieldInsnNode(GETSTATIC, mapper.name, "keyFieldNames", "Ljava/util/List;"));
        insn.add(new LdcInsnNode(kfn.name));
        insn.add(AsmHelper.newMethodInsnNode(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z",
                true));
        insn.add(new InsnNode(POP));
    }

    insn.add(new InsnNode(RETURN));
    mapper.methods.add(mn);

    // fieldNames ????
    FieldNode fnFieldNames = new FieldNode(ACC_PRIVATE + ACC_FINAL + ACC_STATIC, "valueFieldNames",
            "Ljava/util/List;", "Ljava/util/List<Ljava/lang/String;>;", null);
    mapper.fields.add(fnFieldNames);
    fnFieldNames = new FieldNode(ACC_PRIVATE + ACC_FINAL + ACC_STATIC, "keyFieldNames", "Ljava/util/List;",
            "Ljava/util/List<Ljava/lang/String;>;", null);
    mapper.fields.add(fnFieldNames);

    // getFieldNames
    mn = new MethodNode(ACC_PUBLIC, "getValueFieldNames", "()Ljava/util/List;",
            "()Ljava/util/List<Ljava/lang/String;>;", null);
    insn = mn.instructions;
    insn.add(new FieldInsnNode(GETSTATIC, mapper.name, "valueFieldNames", "Ljava/util/List;"));
    insn.add(new InsnNode(ARETURN));
    mapper.methods.add(mn);
    // getKeyFieldNames
    mn = new MethodNode(ACC_PUBLIC, "getKeyFieldNames", "()Ljava/util/List;",
            "()Ljava/util/List<Ljava/lang/String;>;", null);
    insn = mn.instructions;
    insn.add(new FieldInsnNode(GETSTATIC, mapper.name, "keyFieldNames", "Ljava/util/List;"));
    insn.add(new InsnNode(ARETURN));
    mapper.methods.add(mn);
}

From source file:gemlite.maven.plugin.support.mapper.MapperToolProcessor.java

License:Apache License

private void addKeyValueTypeMethod(ClassNode domain, ClassNode mapper, String keyClassDesc) {
    keyClassDesc = AsmHelper.toFullName(keyClassDesc);
    MethodNode mn = new MethodNode(ACC_PUBLIC, "getKeyClass", "()Ljava/lang/Class;",
            "()Ljava/lang/Class<" + keyClassDesc + ">;", null);
    InsnList insn = mn.instructions;//from ww w .  ja va  2s .  c om
    insn.add(new LdcInsnNode(Type.getType(keyClassDesc)));
    insn.add(new InsnNode(ARETURN));
    mapper.methods.add(mn);

    String valueClassDesc = "L" + domain.name + ";";
    mn = new MethodNode(ACC_PUBLIC, "getValueClass", "()Ljava/lang/Class;",
            "()Ljava/lang/Class<" + valueClassDesc + ">;", null);
    insn = mn.instructions;
    insn.add(new LdcInsnNode(Type.getType(valueClassDesc)));
    insn.add(new InsnNode(ARETURN));
    mapper.methods.add(mn);
}

From source file:io.awacs.plugin.springmvc.ServiceWrapper.java

License:Apache License

private MethodNode copyMethod(MethodNode src) {
    //copy exceptions
    String[] exceptions = new String[src.exceptions.size()];
    for (int i = 0; i < src.exceptions.size(); i++) {
        exceptions[i] = src.exceptions.get(i).toString();
    }/*from  ww w . ja va 2 s .com*/
    //copy method annotations
    List<AnnotationNode> methodAnns = new ArrayList<>(src.visibleAnnotations.size());
    methodAnns.addAll(src.visibleAnnotations);
    //copy parameter annotations
    List[] parameterAnns = new List[src.visibleParameterAnnotations.length];
    System.arraycopy(src.visibleParameterAnnotations, 0, parameterAnns, 0,
            src.visibleParameterAnnotations.length);
    MethodNode proxy = new MethodNode(src.access, src.name + "_proxy",
            getDescAfterAppendParam(src.desc, "Ljavax/servlet/http/HttpServletRequest;"), src.signature,
            exceptions);
    proxy.visibleAnnotations = methodAnns;
    proxy.visibleParameterAnnotations = parameterAnns;
    return proxy;
}

From source file:io.awacs.plugin.stacktrace.ClassTransformer.java

License:Apache License

public void visit(ClassNode cn) {
    cn.check(Opcodes.ASM5);//  w  w  w. ja  v a 2s. c  o  m
    //??
    List<MethodNode> appended = new ArrayList<>(cn.methods.size());
    //??
    for (Object mn : cn.methods) {
        MethodNode src = (MethodNode) mn;
        //
        if (!filterMethod(cn, src)) {
            continue;
        }
        boolean terminated = isTerminatedMethod(src);

        if (terminated) {
            //copy exceptions
            String[] exceptions = null;
            if (src.exceptions != null) {
                exceptions = new String[src.exceptions.size()];
                for (int i = 0; i < src.exceptions.size(); i++) {
                    exceptions[i] = src.exceptions.get(i).toString();
                }
            }
            //declare method
            MethodNode proxy = new MethodNode(src.access, src.name, src.desc, src.signature, exceptions);
            appended.add(proxy);
            //copy method annotations
            List<AnnotationNode> methodAnns = null;
            if (src.visibleAnnotations != null) {
                methodAnns = new ArrayList<>(src.visibleAnnotations.size());
                methodAnns.addAll(src.visibleAnnotations);
            }
            proxy.visibleAnnotations = methodAnns;
            //copy parameter annotations
            List[] parameterAnns = null;
            if (src.visibleParameterAnnotations != null) {
                parameterAnns = new List[src.visibleParameterAnnotations.length];
                System.arraycopy(src.visibleParameterAnnotations, 0, parameterAnns, 0,
                        src.visibleParameterAnnotations.length);
            }
            proxy.visibleParameterAnnotations = parameterAnns;
            //clear origin method's annotation and change name
            int _slash = cn.name.lastIndexOf('/');
            //??
            src.name = src.name + "_origin_" + cn.name.substring(_slash + 1);
            src.access = src.access & ~Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE;
            src.visibleAnnotations = null;
            src.visibleLocalVariableAnnotations = null;
            transformTerminatedMethod(src, proxy, cn);
        } else {
            transformPlainMethod(src, cn);
        }
    }
    cn.methods.addAll(appended);
}

From source file:me.qmx.jitescript.MethodDefinition.java

License:Apache License

public MethodNode getMethodNode() {
    MethodNode method = new MethodNode(getModifiers(), getMethodName(), getSignature(), null, null);
    method.visibleAnnotations = new ArrayList<VisibleAnnotation>();
    method.instructions.add(getMethodBody().getInstructionList());
    for (TryCatchBlockNode tryCatchBlockNode : getMethodBody().getTryCatchBlockList()) {
        method.tryCatchBlocks.add(tryCatchBlockNode);
    }/*from www  . j  a  v  a 2 s .  c  o m*/
    for (LocalVariableNode localVariableNode : getMethodBody().getLocalVariableList()) {
        method.localVariables.add(localVariableNode);
    }
    for (VisibleAnnotation annotation : methodBody.getAnnotations()) {
        method.visibleAnnotations.add(annotation.getNode());
    }
    return method;
}

From source file:net.cazzar.corelib.asm.MethodTransformer.java

License:Open Source License

/**
 * Replace the said method with the instructions
 *
 * @param node           the Class being worked on
 * @param access         the Opcode access to the class
 * @param name           the name of the function
 * @param desc           the method description
 * @param insns          the instructions of the class
 * @param tryCatchBlocks a//from   www .j  av a2s. c  o m
 */
public final void replaceMethod(ClassNode node, int access, String name, String desc, InsnList insns,
        TryCatchBlockNode... tryCatchBlocks) {
    InsnList instructions = transformInsns(insns);

    String srgName = getMapping(name);
    List<MethodDescription> methodNames = Lists.newArrayList(new MethodDescription(name, desc),
            new MethodDescription(srgName, desc), McpMappings.instance().getMethod(srgName));

    MethodNode method = new MethodNode(access, srgName, desc, null, null);
    Collections.addAll(method.tryCatchBlocks, tryCatchBlocks);
    method.instructions.add(instructions);

    for (Iterator<MethodNode> i = node.methods.iterator(); i.hasNext();) {
        MethodNode m = i.next();
        for (MethodDescription match : methodNames) {
            if (match == null) {
                continue;
            }
            if (m.name.equals(match.getName()) && m.desc.equals(match.getDesc())) {
                logger.debug("Removed {}{} for {}.{}{}", m.name, m.desc, node.name, name, desc);
                i.remove();
                break;
            }
        }
    }

    node.methods.add(method);
}

From source file:net.cazzar.corelib.asm.MethodTransformer.java

License:Open Source License

/**
 * Append the instructions to the method
 *
 * @param node               the Class being worked on
 * @param access             the Opcode access to the class
 * @param name               the name of the function
 * @param desc               the method description
 * @param insnList           the instructions to append
 * @param tryCatchBlockNodes a/*from   w ww  .  j  a v  a2  s.  c o m*/
 */

public final void appendToMethod(ClassNode node, int access, String name, String desc, InsnList insnList,
        TryCatchBlockNode... tryCatchBlockNodes) {
    InsnList insns = transformInsns(insnList);
    String srgName = getMapping(name);
    List<MethodDescription> methodNames = Lists.newArrayList(new MethodDescription(name, desc),
            new MethodDescription(srgName, desc), McpMappings.instance().getMethod(srgName));

    MethodNode mtd = new MethodNode(access, srgName, desc, null, null);
    Collections.addAll(mtd.tryCatchBlocks, tryCatchBlockNodes);
    for (MethodNode methodNode : node.methods) {
        for (MethodDescription match : methodNames) {
            if (match == null)
                continue;
            if (methodNode.name.equals(match.getName()) && methodNode.desc.equals(match.getDesc())) {
                AbstractInsnNode lastInsn = methodNode.instructions.getLast();
                while (lastInsn instanceof LabelNode || lastInsn instanceof LineNumberNode)
                    lastInsn = lastInsn.getPrevious();

                if (isReturn(lastInsn))
                    methodNode.instructions.insertBefore(lastInsn, insns);
                else
                    methodNode.instructions.add(insns);
            }
        }
    }
}

From source file:net.cazzar.corelib.asm.MethodTransformer.java

License:Open Source License

/**
 * Prepend the instructions to the method
 *
 * @param node               the Class being worked on
 * @param access             the Opcode access to the class
 * @param name               the name of the function
 * @param desc               the method description
 * @param insnList           the instructions to append
 * @param tryCatchBlockNodes a//from w w w . j ava  2  s.c  o  m
 */

public final void prependToMethod(ClassNode node, int access, String name, String desc, InsnList insnList,
        TryCatchBlockNode... tryCatchBlockNodes) {
    InsnList insns = transformInsns(insnList);
    String srgName = getMapping(name);
    List<MethodDescription> methodNames = Lists.newArrayList(new MethodDescription(name, desc),
            new MethodDescription(srgName, desc), McpMappings.instance().getMethod(srgName));

    MethodNode mtd = new MethodNode(access, srgName, desc, null, null);
    Collections.addAll(mtd.tryCatchBlocks, tryCatchBlockNodes);
    for (MethodNode methodNode : node.methods) {
        for (MethodDescription match : methodNames) {
            if (match == null)
                continue;
            if (methodNode.name.equals(match.getName()) && methodNode.desc.equals(match.getDesc())) {
                methodNode.instructions.insertBefore(methodNode.instructions.getFirst(), insns);
            }
        }
    }
}

From source file:net.cazzar.corelib.asm.transformers.PositionedSoundRecord.java

License:Open Source License

@SuppressWarnings("OverlyLongMethod")
@Override//ww  w .  j  av  a2 s.com
public void transform(ClassNode node, String transformedName) {
    MethodNode mtd = new MethodNode(ACC_PUBLIC, "hashCode", "()I", null, new String[0]);
    //        mtd.name = "hashCode";
    //        mtd.desc = "()I";

    InsnList insns = new InsnList();
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F"));
    insns.add(new InsnNode(FCONST_0));
    insns.add(new InsnNode(FCMPL));
    LabelNode l1 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l1));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
    LabelNode l2 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(GOTO, l2));
    insns.add(l1);
    insns.add(new FrameNode(F_SAME, 0, null, 0, null));
    insns.add(new InsnNode(ICONST_0));
    insns.add(l2);
    insns.add(new VarInsnNode(ISTORE, 1));
    insns.add(new IntInsnNode(BIPUSH, 31));
    insns.add(new VarInsnNode(ILOAD, 1));
    insns.add(new InsnNode(IMUL));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F"));
    insns.add(new InsnNode(FCONST_0));
    insns.add(new InsnNode(FCMPL));
    LabelNode l5 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l5));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
    LabelNode l6 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(GOTO, l6));
    insns.add(l5);
    insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
    insns.add(new InsnNode(ICONST_0));
    insns.add(l6);
    insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
            2, new Object[] { INTEGER, INTEGER }));
    insns.add(new InsnNode(IADD));
    insns.add(new VarInsnNode(ISTORE, 1));
    insns.add(new IntInsnNode(BIPUSH, 31));
    insns.add(new VarInsnNode(ILOAD, 1));
    insns.add(new InsnNode(IMUL));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F"));
    insns.add(new InsnNode(FCONST_0));
    insns.add(new InsnNode(FCMPL));
    LabelNode l8 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l8));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
    LabelNode l9 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(GOTO, l9));
    insns.add(l8);
    insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
    insns.add(new InsnNode(ICONST_0));
    insns.add(l9);
    insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
            2, new Object[] { INTEGER, INTEGER }));
    insns.add(new InsnNode(IADD));
    insns.add(new VarInsnNode(ISTORE, 1));
    insns.add(new IntInsnNode(BIPUSH, 31));
    insns.add(new VarInsnNode(ILOAD, 1));
    insns.add(new InsnNode(IMUL));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F"));
    insns.add(new InsnNode(FCONST_0));
    insns.add(new InsnNode(FCMPL));
    LabelNode l11 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l11));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
    LabelNode l12 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(GOTO, l12));
    insns.add(l11);
    insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
    insns.add(new InsnNode(ICONST_0));
    insns.add(l12);
    insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
            2, new Object[] { INTEGER, INTEGER }));
    insns.add(new InsnNode(IADD));
    insns.add(new VarInsnNode(ISTORE, 1));
    insns.add(new IntInsnNode(BIPUSH, 31));
    insns.add(new VarInsnNode(ILOAD, 1));
    insns.add(new InsnNode(IMUL));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F"));
    insns.add(new InsnNode(FCONST_0));
    insns.add(new InsnNode(FCMPL));
    LabelNode l14 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l14));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "floatToIntBits", "(F)I", false));
    LabelNode l15 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(GOTO, l15));
    insns.add(l14);
    insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
    insns.add(new InsnNode(ICONST_0));
    insns.add(l15);
    insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
            2, new Object[] { INTEGER, INTEGER }));
    insns.add(new InsnNode(IADD));
    insns.add(new VarInsnNode(ISTORE, 1));
    insns.add(new IntInsnNode(BIPUSH, 31));
    insns.add(new VarInsnNode(ILOAD, 1));
    insns.add(new InsnNode(IMUL));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "repeat", "Z"));
    LabelNode l17 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l17));
    insns.add(new InsnNode(ICONST_1));
    LabelNode l18 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(GOTO, l18));
    insns.add(l17);
    insns.add(new FrameNode(F_SAME1, 0, null, 1, new Object[] { INTEGER }));
    insns.add(new InsnNode(ICONST_0));
    insns.add(l18);
    insns.add(new FrameNode(F_FULL, 2, new Object[] { "net/minecraft/client/audio/PositionedSound", INTEGER },
            2, new Object[] { INTEGER, INTEGER }));
    insns.add(new InsnNode(IADD));
    insns.add(new VarInsnNode(ISTORE, 1));
    insns.add(new IntInsnNode(BIPUSH, 31));
    insns.add(new VarInsnNode(ILOAD, 1));
    insns.add(new InsnNode(IMUL));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147665_h", "I"));
    insns.add(new InsnNode(IADD));
    insns.add(new VarInsnNode(ISTORE, 1));
    insns.add(new IntInsnNode(BIPUSH, 31));
    insns.add(new VarInsnNode(ILOAD, 1));
    insns.add(new InsnNode(IMUL));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147666_i",
            "Lnet/minecraft/client/audio/ISound$AttenuationType;"));
    insns.add(new MethodInsnNode(INVOKEVIRTUAL, "net/minecraft/client/audio/ISound$AttenuationType", "hashCode",
            "()I", false));
    insns.add(new InsnNode(IADD));
    insns.add(new VarInsnNode(ISTORE, 1));
    insns.add(new VarInsnNode(ILOAD, 1));
    insns.add(new InsnNode(IRETURN));
    mtd.instructions.add(transformInsns(insns));

    node.methods.add(mtd);

    mtd = new MethodNode(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, new String[0]);

    insns = new InsnList();
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new VarInsnNode(ALOAD, 1));
    l1 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IF_ACMPNE, l1));
    insns.add(new InsnNode(ICONST_1));
    insns.add(new InsnNode(IRETURN));
    insns.add(l1);
    insns.add(new FrameNode(F_SAME, 0, null, 0, null));
    insns.add(new VarInsnNode(ALOAD, 1));
    insns.add(new TypeInsnNode(INSTANCEOF, "net/minecraft/client/audio/PositionedSound"));
    l2 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFNE, l2));
    insns.add(new InsnNode(ICONST_0));
    insns.add(new InsnNode(IRETURN));
    insns.add(l2);
    insns.add(new FrameNode(F_SAME, 0, null, 0, null));
    insns.add(new VarInsnNode(ALOAD, 1));
    insns.add(new TypeInsnNode(CHECKCAST, "net/minecraft/client/audio/PositionedSound"));
    insns.add(new VarInsnNode(ASTORE, 2));
    insns.add(new VarInsnNode(ALOAD, 2));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F"));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147663_c", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
    LabelNode l4 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l4));
    insns.add(new InsnNode(ICONST_0));
    insns.add(new InsnNode(IRETURN));
    insns.add(
            new FrameNode(F_APPEND, 1, new Object[] { "net/minecraft/client/audio/PositionedSound" }, 0, null));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147665_h", "I"));
    insns.add(new VarInsnNode(ALOAD, 2));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147665_h", "I"));
    l5 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IF_ICMPEQ, l5));
    insns.add(new InsnNode(ICONST_0));
    insns.add(new InsnNode(IRETURN));
    insns.add(l5);
    insns.add(new FrameNode(F_SAME, 0, null, 0, null));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F"));
    insns.add(new VarInsnNode(ALOAD, 2));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "volume", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
    LabelNode l7 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l7));
    insns.add(new InsnNode(ICONST_0));
    insns.add(new InsnNode(IRETURN));
    insns.add(l7);
    insns.add(new FrameNode(F_SAME, 0, null, 0, null));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F"));
    insns.add(new VarInsnNode(ALOAD, 2));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "xPosF", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
    l7 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l7));
    insns.add(new InsnNode(ICONST_0));
    insns.add(new InsnNode(IRETURN));
    insns.add(l7);
    insns.add(new FrameNode(F_SAME, 0, null, 0, null));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F"));
    insns.add(new VarInsnNode(ALOAD, 2));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "yPosF", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
    l7 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l7));
    insns.add(new InsnNode(ICONST_0));
    insns.add(new InsnNode(IRETURN));
    insns.add(l7);
    insns.add(new FrameNode(F_SAME, 0, null, 0, null));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F"));
    insns.add(new VarInsnNode(ALOAD, 2));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "zPosF", "F"));
    insns.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Float", "compare", "(FF)I", false));
    l7 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IFEQ, l7));
    insns.add(new InsnNode(ICONST_0));
    insns.add(new InsnNode(IRETURN));
    insns.add(l7);

    //        insns.add(new FrameNode(F_SAME, 0, null, 0, null));
    //        insns.add(new VarInsnNode(ALOAD, 0));
    //        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147664_a", "Lnet/minecraft/util/ResourceLocation;"));
    //        insns.add(new VarInsnNode(ALOAD, 2));
    //        insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147664_a", "Lnet/minecraft/util/ResourceLocation;"));
    //        insns.add(new MethodInsnNode(INVOKEVIRTUAL, "net/minecraft/util/ResourceLocation", "equals", "(Ljava/lang/Object;)Z"));
    //        l7 = new LabelNode(new Label());
    //        insns.add(new JumpInsnNode(IFNE, l7));
    //        insns.add(new InsnNode(ICONST_0));
    //        insns.add(new InsnNode(IRETURN));
    //        insns.add(l7 );

    insns.add(new FrameNode(F_SAME, 0, null, 0, null));
    insns.add(new VarInsnNode(ALOAD, 0));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147666_i",
            "Lnet/minecraft/client/audio/ISound$AttenuationType;"));
    insns.add(new VarInsnNode(ALOAD, 2));
    insns.add(new FieldInsnNode(GETFIELD, "net/minecraft/client/audio/PositionedSound", "field_147666_i",
            "Lnet/minecraft/client/audio/ISound$AttenuationType;"));
    l7 = new LabelNode(new Label());
    insns.add(new JumpInsnNode(IF_ACMPEQ, l7));
    insns.add(new InsnNode(ICONST_0));
    insns.add(new InsnNode(IRETURN));
    insns.add(l7);
    insns.add(new InsnNode(ICONST_1));
    insns.add(new InsnNode(IRETURN));

    mtd.instructions.add(transformInsns(insns));
}