private static void stringEncryptionTransformer(ClassNode classNode) { if (classNode.superName.equals("org/bukkit/plugin/java/JavaPlugin") || classNode.superName.equals("net/md_5/bungee/api/plugin/Plugin")) { for (MethodNode methodNode : classNode.methods) { InsnList nodes = methodNode.instructions; for (int i = 0; i < nodes.size(); i++) { AbstractInsnNode instruction = nodes.get(i); if (instruction instanceof LdcInsnNode) { if (instruction.getNext() instanceof MethodInsnNode) { LdcInsnNode ldc = (LdcInsnNode) instruction; MethodInsnNode methodinsnnode = (MethodInsnNode) ldc.getNext(); if (ldc.cst instanceof String) { if (methodinsnnode.name.equalsIgnoreCase("\u0972") && methodinsnnode.desc.equalsIgnoreCase("(Ljava/lang/String;)Ljava/lang/String;")) { methodNode.instructions.remove(methodinsnnode); ldc.cst = decryptionArray((String)ldc.cst); } } } } } } } }
public static InsnList toNumericalValue(String what) { Objects.requireNonNull(what); InsnList il = new InsnList(); il.add(new LdcInsnNode(what)); il.add(new MethodInsnNode( INVOKESTATIC, Type.getInternalName(Conversions.class), "toNumericalValue", Type.getMethodDescriptor( Type.getType(Number.class), Type.getType(Object.class), Type.getType(String.class)), false)); return il; }
@Override public SourceValue newOperation(final AbstractInsnNode insn) { int size; switch (insn.getOpcode()) { case LCONST_0: case LCONST_1: case DCONST_0: case DCONST_1: size = 2; break; case LDC: Object cst = ((LdcInsnNode) insn).cst; size = cst instanceof Long || cst instanceof Double ? 2 : 1; break; case GETSTATIC: size = Type.getType(((FieldInsnNode) insn).desc).getSize(); break; default: size = 1; } return new SourceValue(size, insn); }
private void updateState(LdcInsnNode insn) { if (insn.cst instanceof Type) { Type type = (Type) insn.cst; state.push(type); } else if (insn.cst instanceof String) { state.push(STRING_TYPE); } else if (insn.cst instanceof Long) { state.push(Type.LONG_TYPE); } else if (insn.cst instanceof Double) { state.push(Type.DOUBLE_TYPE); } else if (insn.cst instanceof Integer) { state.push(Type.INT_TYPE); } else { assert insn.cst instanceof Float; state.push(Type.FLOAT_TYPE); } }
private void build(LdcInsnNode insn, IRBuilder builder) { if (insn.cst instanceof Type) { Type type = (Type) insn.cst; int dest = state.push(type); builder.addConstClass(dest, application.getTypeFromDescriptor(type.getDescriptor())); } else if (insn.cst instanceof String) { int dest = state.push(STRING_TYPE); builder.addConstString(dest, application.getString((String) insn.cst)); } else if (insn.cst instanceof Long) { int dest = state.push(Type.LONG_TYPE); builder.addLongConst(dest, (Long) insn.cst); } else if (insn.cst instanceof Double) { int dest = state.push(Type.DOUBLE_TYPE); builder.addDoubleConst(dest, Double.doubleToRawLongBits((Double) insn.cst)); } else if (insn.cst instanceof Integer) { int dest = state.push(Type.INT_TYPE); builder.addIntConst(dest, (Integer) insn.cst); } else { assert insn.cst instanceof Float; int dest = state.push(Type.FLOAT_TYPE); builder.addFloatConst(dest, Float.floatToRawIntBits((Float) insn.cst)); } }
@Override public BasicValue newOperation(AbstractInsnNode insnNode) throws AnalyzerException { switch (insnNode.getOpcode()) { case ICONST_0: return new IntegerConstantBasicValue(Type.INT_TYPE, 0); case ICONST_1: return new IntegerConstantBasicValue(Type.INT_TYPE, 1); case ICONST_2: return new IntegerConstantBasicValue(Type.INT_TYPE, 2); case ICONST_3: return new IntegerConstantBasicValue(Type.INT_TYPE, 3); case ICONST_4: return new IntegerConstantBasicValue(Type.INT_TYPE, 4); case ICONST_5: return new IntegerConstantBasicValue(Type.INT_TYPE, 5); case BIPUSH: case SIPUSH: return new IntegerConstantBasicValue(Type.INT_TYPE, ((IntInsnNode)insnNode).operand); case Opcodes.LDC: { Object constant = ((LdcInsnNode)insnNode).cst; if (constant instanceof Integer) { return new IntegerConstantBasicValue(Type.INT_TYPE, (Integer)constant); } else { return super.newOperation(insnNode); } } default: return super.newOperation(insnNode); } }
private static void findID(ClassNode classNode) throws Throwable { for (MethodNode methodNode : classNode.methods) { Iterator<AbstractInsnNode> insnIterator = methodNode.instructions.iterator(); while (insnIterator.hasNext()) { AbstractInsnNode insnNode = insnIterator.next(); String str; if ((insnNode.getType() == 9)) { Object cst = ((LdcInsnNode) insnNode).cst; if (cst instanceof String) { str = ((LdcInsnNode) insnNode).cst.toString(); Matcher matcher = NONCEID_PATTERN.matcher(str); if (matcher.find()) { possiblenonces.add(str); } } } } } }
@Override protected void remap() { Optional<ClassNode> classNode = findNode(TestMappings.class.getName()); classNode.ifPresent((cn) -> { for (MethodNode method : cn.methods) { TypeNameEnforcer returnType = TypeNameEnforcer.getReturnType(method); if (returnType.getJvmStandard().equals("java/lang/String")) { method.instructions.iterator().forEachRemaining((insnNode) -> { if (insnNode instanceof LdcInsnNode) { LdcInsnNode ldcInsnNode = (LdcInsnNode) insnNode; String payload = (String) ldcInsnNode.cst; if (!payload.equals("oops")) { MethodRef methodRef = createObfMd(method); MethodRef methodRef1 = createRemappedMd("correct", method); getMappings().putMethod(methodRef, methodRef1); } } }); } } }); }
@Override public void visit(LoadConst.Str node) { // use byte strings? if (context.compilerSettings.byteStrings()) { if (context.compilerSettings.constCaching()) { il.add(loadCachedConst(node.value())); } else { il.add(newByteString(node.value())); } } else { // java.lang.String il.add(new LdcInsnNode(node.value())); } il.add(new VarInsnNode(ASTORE, slot(node.dest()))); }
public static AbstractInsnNode loadInt(int i) { switch (i) { case -1: return new InsnNode(ICONST_M1); case 0: return new InsnNode(ICONST_0); case 1: return new InsnNode(ICONST_1); case 2: return new InsnNode(ICONST_2); case 3: return new InsnNode(ICONST_3); case 4: return new InsnNode(ICONST_4); case 5: return new InsnNode(ICONST_5); default: { if (i >= Byte.MIN_VALUE && i <= Byte.MAX_VALUE) return new IntInsnNode(BIPUSH, i); else if (i >= Short.MIN_VALUE && i <= Short.MAX_VALUE) return new IntInsnNode(SIPUSH, i); else return new LdcInsnNode(i); } } }
@Override public ClassVisitor patch(String className, ClassVisitor delegate) throws Exception { return new FindingVisitor( delegate, new VarInsnNode(ALOAD, 4), new LdcInsnNode(7000L), new MethodInsnNode(INVOKEVIRTUAL, "java/lang/Thread", "join", "(J)V", false) ) { @Override public void handle(InsnList nodes, MethodVisitor visitor) { visitor.visitVarInsn(ALOAD, 4); visitor.visitFieldInsn(GETSTATIC, "org/squiddev/cctweaks/lua/Config$Computer", "computerThreadTimeout", "I"); visitor.visitInsn(I2L); visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Thread", "join", "(J)V", false); } }.onMethod("run").once().mustFind(); }
@Override public ClassVisitor patch(String className, ClassVisitor delegate) throws Exception { return new FindingVisitor( delegate, new LdcInsnNode("lua/bios.lua") ) { @Override public void handle(InsnList nodes, MethodVisitor visitor) { Label finish = new Label(), def = new Label(); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, "dan200/computercraft/core/computer/Computer", "biosPath", "Ljava/lang/String;"); visitor.visitJumpInsn(IFNULL, def); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, "dan200/computercraft/core/computer/Computer", "biosPath", "Ljava/lang/String;"); visitor.visitJumpInsn(GOTO, finish); visitor.visitLabel(def); visitor.visitLdcInsn("lua/bios.lua"); visitor.visitLabel(finish); } }.onMethod("initLua").mustFind(); }
private void convertLdcInsn(LdcInsnNode insn) { Object val = insn.cst; boolean dword = val instanceof Long || val instanceof Double; StackFrame frame = getFrame(insn); Operand[] out = frame.out(); Operand opr; if (out == null) { Value v = toSootValue(val); opr = new Operand(insn, v); frame.out(opr); } else { opr = out[0]; } if (dword) pushDual(opr); else push(opr); }
public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) { if (node1.getType() != node2.getType()) { return false; } else if (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: return true; } }
@Override public byte[] transform(String name, String transformedName, byte[] basicClass) { if (!mapping_classes.contains(transformedName)) return basicClass; ClassReader reader = new ClassReader(basicClass); ClassWriter writer = new ClassWriter(0); ClassNode node = new ClassNode(ASM5); reader.accept(node, 0); for (MethodNode method : node.methods) { int index = 0; for (Iterator<AbstractInsnNode> iterator = method.instructions.iterator(); iterator.hasNext();) { AbstractInsnNode insn = iterator.next(); if (insn instanceof LdcInsnNode) { LdcInsnNode ldc = (LdcInsnNode) insn; if (ldc.cst instanceof String) ldc.cst = map(transformedName, method.name, index++, (String) ldc.cst); } } } node.accept(writer); return writer.toByteArray(); }
static AbstractInsnNode getDefaultLdcNode(Type type) { switch (type.getSort()) { case Type.INT: return getIntNode(0); case Type.BOOLEAN: return new LdcInsnNode(false); case Type.BYTE: return new LdcInsnNode((byte) 0); case Type.SHORT: return new LdcInsnNode((short) 0); case Type.LONG: return new LdcInsnNode(0L); case Type.FLOAT: return new LdcInsnNode(0F); case Type.DOUBLE: return new LdcInsnNode(0D); case Type.CHAR: return new LdcInsnNode((char) 0); default: return new InsnNode(ACONST_NULL); } }
public static void markClinitCallback(ClassNode node, Runnable... runnables) { callback_mapping.get(node.name).addAll(Arrays.asList(runnables)); for (String i : node.interfaces) if (i.equals(CALLBACK_FLAG_DESC)) return; node.interfaces.add(CALLBACK_FLAG_DESC); MethodNode clinit = null; for (MethodNode method : node.methods) if (method.name.equals("<clinit>")) { clinit = method; break; } boolean flag = clinit == null; if (flag) node.methods.add(clinit = new MethodNode(0, "<clinit>", "()V", null, null)); InsnList list = new InsnList(); list.add(new LdcInsnNode(node.name)); list.add(new MethodInsnNode(INVOKESTATIC, "index/alchemy/core/asm/transformer/AlchemyTransformerManager", "callback", "(Ljava/lang/String;)V", false)); if (flag) list.add(new InsnNode(RETURN)); clinit.instructions.insert(list); }
public Value newOperation(final AbstractInsnNode insn) { int size; switch (insn.getOpcode()) { case LCONST_0: case LCONST_1: case DCONST_0: case DCONST_1: size = 2; break; case LDC: Object cst = ((LdcInsnNode) insn).cst; size = cst instanceof Long || cst instanceof Double ? 2 : 1; break; case GETSTATIC: size = Type.getType(((FieldInsnNode) insn).desc).getSize(); break; default: size = 1; } return new DataflowValue(size, insn); }
@Override public ConstValue newOperation(AbstractInsnNode insn) { switch (insn.getOpcode()) { case LCONST_0: case LCONST_1: case DCONST_0: case DCONST_1: return ConstValue.TWO_SLOT; case LDC: Object cst = ((LdcInsnNode) insn).cst; if (cst instanceof Type) { // constant class return ConstValue.string(((Type)cst).getInternalName()); } return cst instanceof Long || cst instanceof Double ? ConstValue.TWO_SLOT: ConstValue.ONE_SLOT; case GETSTATIC: return ConstValue.slot(Type.getType(((FieldInsnNode) insn).desc).getSize()); default: return ConstValue.ONE_SLOT; } }
private void addObfuscatedLong(ListIterator<AbstractInsnNode> iterator, long l) { boolean negative = l < 0; iterator.add( new LdcInsnNode ( negative?-l:l ) ); int val = ((rand.nextInt(10) + 1) * 2) + (negative?1:0); for(int i = 0; i < val; i++) iterator.add( new InsnNode ( LNEG ) ); }
@Override public void handle(AbstractInsnNode node) throws IncorrectNodeException { super.handle(node); LOG.debug(logNode(node)); checkType(node, LdcInsnNode.class); ExpressionStack stack = mState.getActiveStack(); DataType type; Object constant = ((LdcInsnNode)node).cst; if (constant instanceof Integer) { type = DataType.INT; } else if (constant instanceof Float) { type = DataType.FLOAT; } else if (constant instanceof Double) { type = DataType.DOUBLE; } else if (constant instanceof Long) { type = DataType.LONG; } else if (constant instanceof String) { type = DataType.getTypeFromObject("java.lang.String"); } else { constant = DataType.getType((Type) constant); //todo think is this correct? type = DataType.getTypeFromObject("java.lang.Class"); } stack.push(new PrimaryExpression(node.getOpcode(), constant, type)); }
@Override public InsnList build(MethodContext context) { Type[] argumentTypes = context.getArgumentTypes(); InsnList insnList = new InsnList(); insnList.add(new LdcInsnNode(argumentTypes.length)); insnList.add(new TypeInsnNode(Opcodes.ANEWARRAY, Type.getInternalName(java.lang.reflect.Type.class))); for (int i = 0; i < argumentTypes.length; i++) { insnList.add(new InsnNode(DUP)); insnList.add(new LdcInsnNode(i)); insnList.add(new PushBoxedType(argumentTypes[i]).build(context)); insnList.add(new InsnNode(AASTORE)); } return insnList; }
public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) { if (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: return true; } }
/*** * * * @param fn * @param inst * @param dsi */ private void writeValue(String owner, FieldNode fn, InsnList inst, PdxSItem dsi) { String desc = new StringBuffer("(Ljava/lang/String;").append(fn.desc) .append(")Lcom/gemstone/gemfire/pdx/PdxWriter;").toString(); inst.add(new VarInsnNode(ALOAD, 1)); inst.add(new LdcInsnNode(fn.name)); inst.add(new VarInsnNode(ALOAD, 0)); inst.add(new FieldInsnNode(GETFIELD, owner, fn.name, fn.desc)); // add INVOKEVIRTUAL method if (PdxConstants.TYPE_BYTECODE_BYTE_B.equals(fn.desc)) // data type ->byte inst.add(AsmHelper.newMethodInsnNode(INVOKEVIRTUAL, PdxConstants.TYPE_BYTECODE_BYTE, "byteValue", fn.desc, false)); else if (PdxConstants.TYPE_BYTECODE_BOOL_Z.equals(fn.desc)) // data type -> // boolean inst.add(AsmHelper.newMethodInsnNode(INVOKEVIRTUAL, PdxConstants.TYPE_BYTECODE_BOOL, "booleanValue", fn.desc, false)); inst.add(AsmHelper.newMethodInsnNode(INVOKEINTERFACE, PdxConstants.PDX_WRITER_VALUE, dsi.toMethod, desc, true)); inst.add(new InsnNode(POP)); }
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; 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); }
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; 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); }
private void addInvocationStartedHook(int implVarIndex, LabelNode labelNode) { if ((access & ACC_STATIC) == 0) { instructions.insertBefore(labelNode, new VarInsnNode(ALOAD, implVarIndex)); instructions.insertBefore(labelNode, new VarInsnNode(ALOAD, 0)); instructions.insertBefore(labelNode, new LdcInsnNode(name)); instructions.insertBefore(labelNode, new LdcInsnNode(desc)); instructions.insertBefore(labelNode, new MethodInsnNode(INVOKEVIRTUAL, "org/jephyr/continuation/easyflow/ContinuationImpl", "invocationStarted", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V", false)); } else { instructions.insertBefore(labelNode, new VarInsnNode(ALOAD, implVarIndex)); instructions.insertBefore(labelNode, new LdcInsnNode(Type.getType('L' + owner + ';'))); instructions.insertBefore(labelNode, new LdcInsnNode(name)); instructions.insertBefore(labelNode, new LdcInsnNode(desc)); instructions.insertBefore(labelNode, new MethodInsnNode(INVOKEVIRTUAL, "org/jephyr/continuation/easyflow/ContinuationImpl", "staticInvocationStarted", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)V", false)); } updateMaxStack(4); }
private void addGetMethodInvocation(InsnList il) { il.add(TreeInstructions.getPushInstruction(this.methodArguments.length)); il.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/Class")); int parameterClassesIndex = getFistAvailablePosition(); il.add(new VarInsnNode(Opcodes.ASTORE, parameterClassesIndex)); this.mn.maxLocals++; for (int i = 0; i < this.methodArguments.length; i++) { il.add(new VarInsnNode(Opcodes.ALOAD, parameterClassesIndex)); il.add(TreeInstructions.getPushInstruction(i)); il.add(TreeInstructions.getClassReferenceInstruction(methodArguments[i], cn.version & 0xFFFF)); il.add(new InsnNode(Opcodes.AASTORE)); } il.add(TreeInstructions.getClassConstantReference(this.classType, cn.version & 0xFFFF)); il.add(new LdcInsnNode(this.mn.name)); il.add(new VarInsnNode(Opcodes.ALOAD, parameterClassesIndex)); il.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "org/brutusin/instrumentation/utils/Helper", "getSource", "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/Object;", false)); }
private InsnList localVarValue(AbstractInsnNode insnNode, int opositeOpcode, String param) { int varIdx = -1; if (insnNode instanceof VarInsnNode) { varIdx = ((VarInsnNode) insnNode).var; } else if (insnNode instanceof IincInsnNode) { varIdx = ((IincInsnNode) insnNode).var; } else { throw new RuntimeException("Not implemented for type " + insnNode.getClass()); } InsnList instrumentation = new InsnList(); MethodNode methodNode = (MethodNode) mv; if (methodNode.localVariables.size() <= varIdx) { throw new RuntimeException("varInsnNode is pointing outside of local variables!"); } LocalVariableNode localVariableNode = getLocalVariableNode(varIdx, insnNode, methodNode); instrumentation.add(new VarInsnNode(opositeOpcode, varIdx)); instrumentation.add(new LdcInsnNode(localVariableNode.name)); instrumentation.add(new LdcInsnNode(currentLine)); instrumentation.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "org/evosuite/junit/TestRuntimeValuesDeterminer", "localVarValueChanged", "(" + param + "Ljava/lang/String;I)V")); logger.debug("Adding localVarValueChanged for var {} in line {}.", localVariableNode.name, currentLine); return instrumentation; }
/** * Insert a call to the isNull helper function * * @param opcode * @param position * @param list */ public void insertPushNull(int opcode, JumpInsnNode position, InsnList list) { int branchId = getBranchID(currentMethodNode, position); logger.info("Inserting instrumentation for NULL check at branch " + branchId + " in method " + currentMethodNode.name); MethodInsnNode nullCheck = new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(BooleanHelper.class), "isNull", Type.getMethodDescriptor(Type.INT_TYPE, new Type[] { Type.getType(Object.class), Type.INT_TYPE }), false); list.insertBefore(position, new InsnNode(Opcodes.DUP)); list.insertBefore(position, new LdcInsnNode(opcode)); list.insertBefore(position, nullCheck); //list.insertBefore(position, // new LdcInsnNode(getBranchID(currentMethodNode, position))); insertBranchIdPlaceholder(currentMethodNode, position, branchId); MethodInsnNode push = new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(BooleanHelper.class), "pushPredicate", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.INT_TYPE, Type.INT_TYPE }), false); list.insertBefore(position, push); }
/** * Insert a call to the reference equality check helper function * * @param opcode * @param position * @param list */ public void insertPushEquals(int opcode, JumpInsnNode position, InsnList list) { MethodInsnNode equalCheck = new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(BooleanHelper.class), "isEqual", Type.getMethodDescriptor(Type.INT_TYPE, new Type[] { Type.getType(Object.class), Type.getType(Object.class), Type.INT_TYPE }), false); list.insertBefore(position, new InsnNode(Opcodes.DUP2)); list.insertBefore(position, new LdcInsnNode(opcode)); list.insertBefore(position, equalCheck); //list.insertBefore(position, // new LdcInsnNode(getBranchID(currentMethodNode, position))); insertBranchIdPlaceholder(currentMethodNode, position); MethodInsnNode push = new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(BooleanHelper.class), "pushPredicate", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.INT_TYPE, Type.INT_TYPE }), false); list.insertBefore(position, push); }