private void genSwitchMethod(ClassVisitor cw, String typeName, String methodName, CB callback) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, methodName, "()Ljava/lang/String;", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, typeName, "idx", "I"); Label def = new Label(); Label[] labels = new Label[callbacks.size()]; mv.visitLabel(e.getValue()); mv.visitLdcInsn(e.getKey()); mv.visitInsn(ARETURN); mv.visitInsn(DUP); mv.visitLdcInsn("invalid idx"); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V"); mv.visitInsn(ATHROW); mv.visitMaxs(-1, -1); mv.visitEnd();
switch (t.getSort()) { case Type.BOOLEAN: super.visitFieldInsn(GETSTATIC, "java/lang/Boolean", "TYPE", "Ljava/lang/Class;"); break; case Type.BYTE: super.visitFieldInsn(GETSTATIC, "java/lang/Byte", "TYPE", "Ljava/lang/Class;"); break; case Type.CHAR: super.visitFieldInsn(GETSTATIC, "java/lang/Character", "TYPE", "Ljava/lang/Class;"); break; case Type.DOUBLE: super.visitFieldInsn(GETSTATIC, "java/lang/Double", "TYPE", "Ljava/lang/Class;"); break; case Type.FLOAT: super.visitFieldInsn(GETSTATIC, "java/lang/Float", "TYPE", "Ljava/lang/Class;"); break; case Type.INT: super.visitFieldInsn(GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;"); break; case Type.LONG: super.visitFieldInsn(GETSTATIC, "java/lang/Long", "TYPE", "Ljava/lang/Class;"); break; case Type.SHORT: super.visitFieldInsn(GETSTATIC, "java/lang/Short", "TYPE", "Ljava/lang/Class;"); break; default:
switch (value.vt) { case LOCAL: asm.visitVarInsn(getOpcode(value, ILOAD), ((Local) value)._ls_index); break; case CONSTANT: Constant cst = (Constant) value; if (cst.value.equals(Constant.Null)) { asm.visitInsn(ACONST_NULL); } else if (cst.value instanceof DexType) { asm.visitLdcInsn(Type.getType(((DexType) cst.value).desc)); case STATIC_FIELD: StaticFieldExpr sfe= (StaticFieldExpr) value; asm.visitFieldInsn(GETSTATIC,toInternal(sfe.owner),sfe.name,sfe.type); break;
public void generateCodeThatIncrementsCoberturaCounter( MethodVisitor nextMethodVisitor, Integer counterId, String className) { /*cobertura_counters.incrementAndGet(i);*/ /*cobertura_counters.*/ nextMethodVisitor.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE); /*index:*/ nextMethodVisitor.visitLdcInsn((int) counterId); nextMethodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type .getInternalName(AtomicIntegerArray.class), "incrementAndGet", "(I)I"); nextMethodVisitor.visitInsn(Opcodes.POP); }
@Override public void visitCode() { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ownerClass, "producerConfig", "Lorg/apache/kafka/clients/producer/ProducerConfig;"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/kafka/clients/producer/ProducerRecord", "topic", "()Ljava/lang/String;", false); mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACE_KAFKA, START_METHOD, START_SIGNATURE, false); statIdx = newLocal(Type.getType(Object.class)); mv.visitVarInsn(Opcodes.ASTORE, statIdx); mv.visitLabel(startFinally); mv.visitCode(); }
private void writeGenericReturnTypeFieldInitializer(MethodVisitor mv, ReturnTypeEntry returnType) { mv.visitLdcInsn(generatedType); // <class>.getDeclaredMethod(<getter-name>) mv.visitLdcInsn(returnType.getterName); mv.visitInsn(Opcodes.ICONST_0); mv.visitTypeInsn(Opcodes.ANEWARRAY, CLASS_TYPE.getInternalName()); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, CLASS_TYPE.getInternalName(), "getDeclaredMethod", GET_DECLARED_METHOD_DESCRIPTOR, false); // <method>.getGenericReturnType() mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, METHOD_TYPE.getInternalName(), "getGenericReturnType", Type.getMethodDescriptor(JAVA_LANG_REFLECT_TYPE), false); mv.visitFieldInsn(PUTSTATIC, generatedType.getInternalName(), returnType.fieldName, JAVA_REFLECT_TYPE_DESCRIPTOR); }
accept(v2, asm); insertI2x(v2.valueType, fe.type, asm); asm.visitFieldInsn(PUTSTATIC, toInternal(fe.owner), fe.name, fe.type); break; accept(v2, asm); insertI2x(v2.valueType, fe.type, asm); asm.visitFieldInsn(PUTFIELD, toInternal(fe.owner), fe.name, fe.type); break; String arrayElementType = tp1.substring(1); insertI2x(v2.valueType, arrayElementType, asm); asm.visitInsn(getOpcode(arrayElementType, IASTORE)); int index = ((Local) e2.op1)._ls_index; if (index >= 0) { asm.visitVarInsn(ASTORE, index); asm.visitVarInsn(getOpcode(v, ISTORE), nIndex); lockMap.put(key, nIndex);
case STATIC_FIELD: { FieldExpr fe = (FieldExpr) e1; asm.visitFieldInsn(GETSTATIC, toInternal(fe.owner), fe.name, fe.type); break; asm.visitFieldInsn(GETFIELD, toInternal(fe.owner), fe.name, fe.type); break; asm.visitInsn(ARRAYLENGTH); break; case NEG: asm.visitInsn(getOpcode(e1, INEG)); break;
@Override public void visitCode() { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ownerClass, "channel", "Lio/netty/channel/Channel;"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACE_MAIN, START_METHOD, START_SIGNATURE, false); statIdx = newLocal(Type.getType(Object.class)); mv.visitVarInsn(Opcodes.ASTORE, statIdx); mv.visitLabel(startFinally); mv.visitCode(); }
Value v = f.getStack(i); int insn = v.isCategory1() ? POP : POP2; mv.visitInsn(insn); if (vi.var == -1) { loadVar(mv, TOBJECT, stateVar); mv.visitFieldInsn(GETFIELD, stateClassName, vi.fieldName, vi.fieldDesc()); checkcast(mv, v); } else {
@Override public void visitCode() { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, owner, TraceSQL.PSTMT_PARAM_FIELD, "Lscouter/agent/trace/SqlParameter;"); AsmUtil.PUSH(mv, this.methodType); mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACESQL, START_METHOD, START_SIGNATURE,false); statIdx = newLocal(Type.getType(Object.class)); mv.visitVarInsn(Opcodes.ASTORE, statIdx); mv.visitLabel(startFinally); mv.visitCode(); }
private void generateConstructor(ClassWriter cw, String internalName) { cw.visitField(Modifier.PRIVATE, FIELD_NAME, Type.getDescriptor(String.class), null, null); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/String;)V", null, null); // Load 'this' mv.visitVarInsn(ALOAD, 0); // Cal super() mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(Object.class), "<init>", "()V", false); // Load 'this' mv.visitVarInsn(ALOAD, 0); // Load first method parameter (the fieldName) mv.visitVarInsn(ALOAD, 1); // Store first parameter in field FIELD_NAME mv.visitFieldInsn(PUTFIELD, internalName, FIELD_NAME, Type.getDescriptor(String.class)); mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
@Override public void visitInsn(int opcode) { if (sqlIdx >= 0 && (opcode >= IRETURN && opcode <= RETURN)) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACESQL, METHOD_INIT, SIGNATURE_INIT, false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, owner, TraceSQL.PSTMT_PARAM_FIELD, "Lscouter/agent/trace/SqlParameter;"); Label end = new Label(); mv.visitJumpInsn(IFNONNULL, end); mv.visitVarInsn(ALOAD, 0); mv.visitTypeInsn(NEW, Type.getInternalName(SqlParameter.class)); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(SqlParameter.class), "<init>", "()V",false); mv.visitFieldInsn(PUTFIELD, owner, TraceSQL.PSTMT_PARAM_FIELD, "Lscouter/agent/trace/SqlParameter;"); mv.visitLabel(end); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, owner, TraceSQL.PSTMT_PARAM_FIELD, "Lscouter/agent/trace/SqlParameter;"); mv.visitVarInsn(ALOAD, sqlIdx); if(isUstatement) { mv.visitMethodInsn(INVOKEVIRTUAL, "cubrid/jdbc/jci/UStatement", "getQuery", "()Ljava/lang/String;", false); } mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACESQL, METHOD, SIGNATURE,false); } mv.visitInsn(opcode); }
@Override public void visitCode() { int hostIdx = newLocal(Type.getType("Ljava/lang/String;")); int portIdx = newLocal(Type.INT_TYPE); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, className, "client", "Lredis/clients/jedis/Client;"); mv.visitMethodInsn(INVOKEVIRTUAL, "redis/clients/jedis/Client", "getHost", "()Ljava/lang/String;", false); mv.visitVarInsn(ASTORE, hostIdx); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, className, "client", "Lredis/clients/jedis/Client;"); mv.visitMethodInsn(INVOKEVIRTUAL, "redis/clients/jedis/Client", "getPort", "()I", false); mv.visitVarInsn(ISTORE, portIdx); mv.visitVarInsn(ALOAD, hostIdx); mv.visitVarInsn(ILOAD, portIdx); mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACEMAIN, START_METHOD, START_SIGNATURE, false); mv.visitCode(); } }
mv.visitInsn(Opcodes.ACONST_NULL); mv.visitVarInsn(Opcodes.ASTORE, 30); mv.visitVarInsn(Opcodes.ALOAD, 2); mv.visitJumpInsn(Opcodes.IFNULL, sqlIsNull); mv.visitVarInsn(Opcodes.ALOAD, 2); mv.visitVarInsn(Opcodes.ASTORE, 30); mv.visitJumpInsn(Opcodes.GOTO, endIf); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, "com/mysql/jdbc/ConnectionImpl", "host", "Ljava/lang/String;"); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, "com/mysql/jdbc/ConnectionImpl", "port", "I"); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, "com/mysql/jdbc/ConnectionImpl", "database", "Ljava/lang/String;"); mv.visitVarInsn(Opcodes.ALOAD, 30); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/taobao/profile/Profiler", "start4Mysql", "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V"); mv.visitCode();
private void generateMethods(ClassWriter cw, String internalName, List<Method> methods, Class<?> exceptionType) { for (Method method: methods) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, method.getName(), Type.getMethodDescriptor(method), null, null); mv.visitCode(); mv.visitInsn(DUP); mv.visitVarInsn(Opcodes.ASTORE, 2); mv.visitVarInsn(Opcodes.ALOAD, 2); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, internalName, FIELD_NAME, Type.getDescriptor(String.class)); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(String.class), "format", "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;", false); mv.visitMethodInsn(INVOKESPECIAL, internalException, "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); mv.visitMaxs(0, 0); mv.visitEnd();
public void visitInsn(int opcode) { if ((opcode >= IRETURN && opcode <= RETURN)) { Type tp = returnType; if (tp.getSort() == Type.ARRAY && tp.getElementType().getSort() == Type.BYTE) { mv.visitInsn(Opcodes.DUP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, this.className, KEY_ELEMENT_FIELD, "Ljava/lang/Object;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACEMAIN, START_METHOD, START_SIGNATURE, false); } } mv.visitInsn(opcode); } }
mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(PUTFIELD, typeName, "thiz", "Ljava/lang/Object;"); mv.visitFieldInsn(PUTFIELD, typeName, "args", "[Ljava/lang/Object;"); mv.visitFieldInsn(PUTFIELD, typeName, "idx", "I"); mv.visitInsn(RETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, typeName, "args", "[Ljava/lang/Object;"); mv.visitInsn(ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, typeName, "thiz", "Ljava/lang/Object;"); mv.visitInsn(ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); mv.visitFieldInsn(GETFIELD, typeName, "idx", "I");
null, null); methodVisitor.visitCode(); int localIndexOfWaitStrategy = locals.newLocal(WaitStrategy.class); methodVisitor.visitVarInsn(Opcodes.ALOAD, LOCALS_INDEX_THIS); methodVisitor.visitVarInsn(Opcodes.ILOAD, localIndexOfCapacity); methodVisitor.visitLdcInsn(primitiveMessageSize); methodVisitor.visitLdcInsn(referenceMessageSize); methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(parentType), "<init>", false); methodVisitor.visitVarInsn(Opcodes.ALOAD, LOCALS_INDEX_THIS); methodVisitor.visitVarInsn(Opcodes.ALOAD, localIndexOfWaitStrategy); methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, generatedName, "waitStrategy", Type.getDescriptor(WaitStrategy.class)); methodVisitor.visitInsn(Opcodes.RETURN); methodVisitor.visitMaxs(-1, -1); methodVisitor.visitEnd();
mv.visitCode(); String fieldName = fieldNames.get(i); mv.visitTypeInsn(Opcodes.NEW, name); mv.visitInsn(Opcodes.DUP); mv.visitLdcInsn(fieldName); mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, name, "<init>", "(Ljava/lang/String;I)V", false); mv.visitFieldInsn(Opcodes.PUTSTATIC, name, fieldName, classDef.getType()); mv.visitInsn(Opcodes.DUP); mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitFieldInsn(Opcodes.GETSTATIC, name, fieldName, classDef.getType()); mv.visitInsn(Opcodes.AASTORE); mv.visitFieldInsn(Opcodes.PUTSTATIC, name, valuesFieldName, "[" + classDef.getType()); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); mv.visitMaxs(0, 0); mv.visitEnd(); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, name, valuesFieldName, "[" + classDef.getType()); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "arraycopy",