Java Code Examples for net.bytebuddy.jar.asm.MethodVisitor#visitMethodInsn()
The following examples show how to use
net.bytebuddy.jar.asm.MethodVisitor#visitMethodInsn() .
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: PersistentAttributeTransformer.java From lams with GNU General Public License v2.0 | 6 votes |
@Override public Size apply( MethodVisitor methodVisitor, Implementation.Context implementationContext, MethodDescription instrumentedMethod ) { methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); methodVisitor.visitMethodInsn( Opcodes.INVOKESPECIAL, managedCtClass.getSuperClass().asErasure().getInternalName(), EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX + persistentField.getName(), Type.getMethodDescriptor( Type.getType( persistentField.getType().asErasure().getDescriptor() ) ), false ); methodVisitor.visitInsn( Type.getType( persistentField.getType().asErasure().getDescriptor() ).getOpcode( Opcodes.IRETURN ) ); return new Size( persistentField.getType().getStackSize().getSize(), instrumentedMethod.getStackSize() ); }
Example 2
Source File: PersistentAttributeTransformer.java From lams with GNU General Public License v2.0 | 6 votes |
@Override public Size apply( MethodVisitor methodVisitor, Implementation.Context implementationContext, MethodDescription instrumentedMethod ) { methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); methodVisitor.visitVarInsn( Type.getType( persistentField.getType().asErasure().getDescriptor() ).getOpcode( Opcodes.ILOAD ), 1 ); methodVisitor.visitMethodInsn( Opcodes.INVOKESPECIAL, managedCtClass.getSuperClass().asErasure().getInternalName(), EnhancerConstants.PERSISTENT_FIELD_WRITER_PREFIX + persistentField.getName(), Type.getMethodDescriptor( Type.getType( void.class ), Type.getType( persistentField.getType().asErasure().getDescriptor() ) ), false ); methodVisitor.visitInsn( Opcodes.RETURN ); return new Size( 1 + persistentField.getType().getStackSize().getSize(), instrumentedMethod.getStackSize() ); }
Example 3
Source File: AdviceExceptionHandler.java From kanela with Apache License 2.0 | 6 votes |
/** * Produces the following bytecode: * * <pre> * } catch(Throwable throwable) { * kanela.agent.bootstrap.log.LoggerHandler.error("An error occurred while trying to apply an advisor", throwable) * } * </pre> */ private static StackManipulation getStackManipulation() { return new StackManipulation() { @Override public boolean isValid() { return true; } @Override public Size apply(MethodVisitor methodVisitor, Implementation.Context implementationContext) { val endCatchBlock = new Label(); //message methodVisitor.visitLdcInsn("An error occurred while trying to apply an advisor"); // logger, message, throwable => throwable, message, logger methodVisitor.visitInsn(Opcodes.SWAP); methodVisitor.visitMethodInsn(INVOKESTATIC, "kanela/agent/bootstrap/log/LoggerHandler", "error", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); methodVisitor.visitJumpInsn(GOTO, endCatchBlock); // ending catch block methodVisitor.visitLabel(endCatchBlock); return new StackManipulation.Size(-1, 1); } }; }
Example 4
Source File: FieldReaderAppender.java From lams with GNU General Public License v2.0 | 5 votes |
@Override protected void fieldRead(MethodVisitor methodVisitor) { methodVisitor.visitMethodInsn( Opcodes.INVOKESPECIAL, managedCtClass.getSuperClass().asErasure().getInternalName(), EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX + persistentFieldAsDefined.getName(), Type.getMethodDescriptor( Type.getType( persistentFieldAsDefined.getType().asErasure().getDescriptor() ) ), false ); }
Example 5
Source File: FieldReaderAppender.java From lams with GNU General Public License v2.0 | 5 votes |
@Override protected void fieldWrite(MethodVisitor methodVisitor) { methodVisitor.visitMethodInsn( Opcodes.INVOKESPECIAL, managedCtClass.getSuperClass().asErasure().getInternalName(), EnhancerConstants.PERSISTENT_FIELD_WRITER_PREFIX + persistentFieldAsDefined.getName(), Type.getMethodDescriptor( Type.getType( void.class ), Type.getType( persistentFieldAsDefined.getType().asErasure().getDescriptor() ) ), false ); }
Example 6
Source File: PersistentAttributeTransformer.java From lams with GNU General Public License v2.0 | 5 votes |
@Override public MethodVisitor wrap( TypeDescription instrumentedType, MethodDescription instrumentedMethod, MethodVisitor methodVisitor, Implementation.Context implementationContext, TypePool typePool, int writerFlags, int readerFlags) { return new MethodVisitor( Opcodes.ASM5, methodVisitor ) { @Override public void visitFieldInsn(int opcode, String owner, String name, String desc) { if ( isEnhanced( owner, name, desc ) ) { switch ( opcode ) { case Opcodes.GETFIELD: methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, owner, EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX + name, "()" + desc, false ); return; case Opcodes.PUTFIELD: methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, owner, EnhancerConstants.PERSISTENT_FIELD_WRITER_PREFIX + name, "(" + desc + ")V", false ); return; } } super.visitFieldInsn( opcode, owner, name, desc ); } }; }
Example 7
Source File: FieldWriterAppender.java From lams with GNU General Public License v2.0 | 5 votes |
@Override protected void fieldRead(MethodVisitor methodVisitor) { methodVisitor.visitMethodInsn( Opcodes.INVOKESPECIAL, managedCtClass.getSuperClass().asErasure().getInternalName(), EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX + persistentFieldAsDefined.getName(), Type.getMethodDescriptor( Type.getType( persistentFieldAsDefined.getType().asErasure().getDescriptor() ) ), false ); }
Example 8
Source File: FieldWriterAppender.java From lams with GNU General Public License v2.0 | 5 votes |
@Override protected void fieldWrite(MethodVisitor methodVisitor) { methodVisitor.visitMethodInsn( Opcodes.INVOKESPECIAL, managedCtClass.getSuperClass().asErasure().getInternalName(), EnhancerConstants.PERSISTENT_FIELD_WRITER_PREFIX + persistentFieldAsDefined.getName(), Type.getMethodDescriptor( Type.getType( void.class ), Type.getType( persistentFieldAsDefined.getType().asErasure().getDescriptor() ) ), false ); }
Example 9
Source File: BytecodeProviderImpl.java From lams with GNU General Public License v2.0 | 5 votes |
@Override public Size apply( MethodVisitor methodVisitor, Implementation.Context implementationContext, MethodDescription instrumentedMethod) { methodVisitor.visitLdcInsn( getters.length ); methodVisitor.visitTypeInsn( Opcodes.ANEWARRAY, Type.getInternalName( Object.class ) ); int index = 0; for ( Method getter : getters ) { methodVisitor.visitInsn( Opcodes.DUP ); methodVisitor.visitLdcInsn( index++ ); methodVisitor.visitVarInsn( Opcodes.ALOAD, 1 ); methodVisitor.visitTypeInsn( Opcodes.CHECKCAST, Type.getInternalName( clazz ) ); methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, Type.getInternalName( clazz ), getter.getName(), Type.getMethodDescriptor( getter ), false ); if ( getter.getReturnType().isPrimitive() ) { PrimitiveBoxingDelegate.forPrimitive( new TypeDescription.ForLoadedType( getter.getReturnType() ) ) .assignBoxedTo( TypeDescription.Generic.OBJECT, ReferenceTypeAwareAssigner.INSTANCE, Assigner.Typing.STATIC ) .apply( methodVisitor, implementationContext ); } methodVisitor.visitInsn( Opcodes.AASTORE ); } methodVisitor.visitInsn( Opcodes.ARETURN ); return new Size( 6, instrumentedMethod.getStackSize() ); }
Example 10
Source File: BytecodeProviderImpl.java From lams with GNU General Public License v2.0 | 5 votes |
@Override public Size apply( MethodVisitor methodVisitor, Implementation.Context implementationContext, MethodDescription instrumentedMethod) { int index = 0; for ( Method setter : setters ) { methodVisitor.visitVarInsn( Opcodes.ALOAD, 1 ); methodVisitor.visitTypeInsn( Opcodes.CHECKCAST, Type.getInternalName( clazz ) ); methodVisitor.visitVarInsn( Opcodes.ALOAD, 2 ); methodVisitor.visitLdcInsn( index++ ); methodVisitor.visitInsn( Opcodes.AALOAD ); if ( setter.getParameterTypes()[0].isPrimitive() ) { PrimitiveUnboxingDelegate.forReferenceType( TypeDescription.Generic.OBJECT ) .assignUnboxedTo( new TypeDescription.Generic.OfNonGenericType.ForLoadedType( setter.getParameterTypes()[0] ), ReferenceTypeAwareAssigner.INSTANCE, Assigner.Typing.DYNAMIC ) .apply( methodVisitor, implementationContext ); } else { methodVisitor.visitTypeInsn( Opcodes.CHECKCAST, Type.getInternalName( setter.getParameterTypes()[0] ) ); } methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, Type.getInternalName( clazz ), setter.getName(), Type.getMethodDescriptor( setter ), false ); } methodVisitor.visitInsn( Opcodes.RETURN ); return new Size( 4, instrumentedMethod.getStackSize() ); }
Example 11
Source File: InlineDirtyCheckingHandler.java From lams with GNU General Public License v2.0 | 4 votes |
@Override public Size apply( MethodVisitor methodVisitor, Context implementationContext, MethodDescription instrumentedMethod) { // if (arg != field) { methodVisitor.visitVarInsn( Type.getType( persistentField.getType().asErasure().getDescriptor() ).getOpcode( Opcodes.ILOAD ), 1 ); methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); if ( persistentField.getDeclaringType().asErasure().equals( managedCtClass ) ) { methodVisitor.visitFieldInsn( Opcodes.GETFIELD, persistentField.getDeclaringType().asErasure().getInternalName(), persistentField.getName(), persistentField.getDescriptor() ); } else { methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, persistentField.getDeclaringType().asErasure().getInternalName(), EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX + persistentField.getName(), Type.getMethodDescriptor( Type.getType( persistentField.getDescriptor() ) ), false ); } int branchCode; if ( persistentField.getType().isPrimitive() ) { if ( persistentField.getType().represents( long.class ) ) { methodVisitor.visitInsn( Opcodes.LCMP ); } else if ( persistentField.getType().represents( float.class ) ) { methodVisitor.visitInsn( Opcodes.FCMPL ); } else if ( persistentField.getType().represents( double.class ) ) { methodVisitor.visitInsn( Opcodes.DCMPL ); } else { methodVisitor.visitInsn( Opcodes.ISUB ); } branchCode = Opcodes.IFEQ; } else { methodVisitor.visitMethodInsn( Opcodes.INVOKESTATIC, Type.getInternalName( Objects.class ), "deepEquals", Type.getMethodDescriptor( Type.getType( boolean.class ), Type.getType( Object.class ), Type.getType( Object.class ) ), false ); branchCode = Opcodes.IFNE; } Label skip = new Label(); methodVisitor.visitJumpInsn( branchCode, skip ); // this.$$_hibernate_trackChange(fieldName) methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); methodVisitor.visitLdcInsn( persistentField.getName() ); methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, managedCtClass.getInternalName(), EnhancerConstants.TRACKER_CHANGER_NAME, Type.getMethodDescriptor( Type.getType( void.class ), Type.getType( String.class ) ), false ); // } methodVisitor.visitLabel( skip ); if ( implementationContext.getClassFileVersion().isAtLeast( ClassFileVersion.JAVA_V6 ) ) { methodVisitor.visitFrame( Opcodes.F_SAME, 0, null, 0, null ); } return new Size( 1 + 2 * persistentField.getType().asErasure().getStackSize().getSize(), instrumentedMethod.getStackSize() ); }
Example 12
Source File: FieldReaderAppender.java From lams with GNU General Public License v2.0 | 4 votes |
@Override public Size apply( MethodVisitor methodVisitor, Implementation.Context implementationContext, MethodDescription instrumentedMethod) { TypeDescription dispatcherType = persistentFieldAsDefined.getType().isPrimitive() ? persistentFieldAsDefined.getType().asErasure() : TypeDescription.OBJECT; // if ( this.$$_hibernate_getInterceptor() != null ) methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, managedCtClass.getInternalName(), EnhancerConstants.INTERCEPTOR_GETTER_NAME, Type.getMethodDescriptor( Type.getType( PersistentAttributeInterceptor.class ) ), false ); Label skip = new Label(); methodVisitor.visitJumpInsn( Opcodes.IFNULL, skip ); // this (for field write) methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); // this.$$_hibernate_getInterceptor(); methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, managedCtClass.getInternalName(), EnhancerConstants.INTERCEPTOR_GETTER_NAME, Type.getMethodDescriptor( Type.getType( PersistentAttributeInterceptor.class ) ), false ); // .readXXX( self, fieldName, field ); methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); methodVisitor.visitLdcInsn( persistentFieldAsDefined.getName() ); methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); fieldRead( methodVisitor ); methodVisitor.visitMethodInsn( Opcodes.INVOKEINTERFACE, Type.getInternalName( PersistentAttributeInterceptor.class ), "read" + EnhancerImpl.capitalize( dispatcherType.getSimpleName() ), Type.getMethodDescriptor( Type.getType( dispatcherType.getDescriptor() ), Type.getType( Object.class ), Type.getType( String.class ), Type.getType( dispatcherType.getDescriptor() ) ), true ); // field = (cast) XXX if ( !dispatcherType.isPrimitive() ) { methodVisitor.visitTypeInsn( Opcodes.CHECKCAST, persistentFieldAsDefined.getType().asErasure().getInternalName() ); } fieldWrite( methodVisitor ); // end if methodVisitor.visitLabel( skip ); if ( implementationContext.getClassFileVersion().isAtLeast( ClassFileVersion.JAVA_V6 ) ) { methodVisitor.visitFrame( Opcodes.F_SAME, 0, null, 0, null ); } // return field methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); fieldRead( methodVisitor ); if ( !persistentField.getType().isPrimitive() && !persistentField.getType().asErasure().getInternalName().equals( persistentFieldAsDefined.getType().asErasure().getInternalName() ) ) { methodVisitor.visitTypeInsn( Opcodes.CHECKCAST, persistentField.getType().asErasure().getInternalName() ); } methodVisitor.visitInsn( Type.getType( persistentFieldAsDefined.getType().asErasure().getDescriptor() ).getOpcode( Opcodes.IRETURN ) ); return new Size( 4 + persistentFieldAsDefined.getType().getStackSize().getSize(), instrumentedMethod.getStackSize() ); }
Example 13
Source File: FieldAccessEnhancer.java From lams with GNU General Public License v2.0 | 4 votes |
@Override public MethodVisitor wrap( TypeDescription instrumentedType, MethodDescription instrumentedMethod, MethodVisitor methodVisitor, Implementation.Context implementationContext, TypePool typePool, int writerFlags, int readerFlags) { return new MethodVisitor( Opcodes.ASM5, methodVisitor ) { @Override public void visitFieldInsn(int opcode, String owner, String name, String desc) { if ( opcode != Opcodes.GETFIELD && opcode != Opcodes.PUTFIELD ) { super.visitFieldInsn( opcode, owner, name, desc ); return; } FieldDescription field = findField( owner, name, desc ); if ( ( enhancementContext.isEntityClass( field.getDeclaringType().asErasure() ) || enhancementContext.isCompositeClass( field.getDeclaringType().asErasure() ) ) && !field.getType().asErasure().equals( managedCtClass ) && enhancementContext.isPersistentField( field ) && !EnhancerImpl.isAnnotationPresent( field, Id.class ) && !field.getName().equals( "this$0" ) ) { log.debugf( "Extended enhancement: Transforming access to field [%s.%s] from method [%s#%s]", field.getType().asErasure(), field.getName(), field.getName(), name ); switch ( opcode ) { case Opcodes.GETFIELD: methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, owner, EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX + name, Type.getMethodDescriptor( Type.getType( desc ) ), false ); return; case Opcodes.PUTFIELD: methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, owner, EnhancerConstants.PERSISTENT_FIELD_WRITER_PREFIX + name, Type.getMethodDescriptor( Type.getType( void.class ), Type.getType( desc ) ), false ); return; default: throw new EnhancementException( "Unexpected opcode: " + opcode ); } } else { super.visitFieldInsn( opcode, owner, name, desc ); } } }; }
Example 14
Source File: FieldWriterAppender.java From lams with GNU General Public License v2.0 | 4 votes |
@Override public Size apply( MethodVisitor methodVisitor, Implementation.Context implementationContext, MethodDescription instrumentedMethod) { TypeDescription dispatcherType = persistentFieldAsDefined.getType().isPrimitive() ? persistentFieldAsDefined.getType().asErasure() : TypeDescription.OBJECT; // if ( this.$$_hibernate_getInterceptor() != null ) methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, managedCtClass.getInternalName(), EnhancerConstants.INTERCEPTOR_GETTER_NAME, Type.getMethodDescriptor( Type.getType( PersistentAttributeInterceptor.class ) ), false ); Label noInterceptor = new Label(); methodVisitor.visitJumpInsn( Opcodes.IFNULL, noInterceptor ); // this (for field write) methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); // this.$$_hibernate_getInterceptor(); methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); methodVisitor.visitMethodInsn( Opcodes.INVOKEVIRTUAL, managedCtClass.getInternalName(), EnhancerConstants.INTERCEPTOR_GETTER_NAME, Type.getMethodDescriptor( Type.getType( PersistentAttributeInterceptor.class ) ), false ); // .writeXXX( self, fieldName, field, arg1 ); methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); methodVisitor.visitLdcInsn( persistentFieldAsDefined.getName() ); methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); fieldRead( methodVisitor ); methodVisitor.visitVarInsn( Type.getType( dispatcherType.getDescriptor() ).getOpcode( Opcodes.ILOAD ), 1 ); methodVisitor.visitMethodInsn( Opcodes.INVOKEINTERFACE, Type.getInternalName( PersistentAttributeInterceptor.class ), "write" + EnhancerImpl.capitalize( dispatcherType.getSimpleName() ), Type.getMethodDescriptor( Type.getType( dispatcherType.getDescriptor() ), Type.getType( Object.class ), Type.getType( String.class ), Type.getType( dispatcherType.getDescriptor() ), Type.getType( dispatcherType.getDescriptor() ) ), true ); // arg1 = (cast) XXX if ( !dispatcherType.isPrimitive() ) { methodVisitor.visitTypeInsn( Opcodes.CHECKCAST, persistentFieldAsDefined.getType().asErasure().getInternalName() ); } fieldWrite( methodVisitor ); // return methodVisitor.visitInsn( Opcodes.RETURN ); // else methodVisitor.visitLabel( noInterceptor ); if ( implementationContext.getClassFileVersion().isAtLeast( ClassFileVersion.JAVA_V6 ) ) { methodVisitor.visitFrame( Opcodes.F_SAME, 0, null, 0, null ); } // this (for field write) methodVisitor.visitVarInsn( Opcodes.ALOAD, 0 ); // arg1 = (cast) XXX methodVisitor.visitVarInsn( Type.getType( dispatcherType.getDescriptor() ).getOpcode( Opcodes.ILOAD ), 1 ); if ( !dispatcherType.isPrimitive() ) { methodVisitor.visitTypeInsn( Opcodes.CHECKCAST, persistentFieldAsDefined.getType().asErasure().getInternalName() ); } fieldWrite( methodVisitor ); // return methodVisitor.visitInsn( Opcodes.RETURN ); return new Size( 4 + 2 * persistentFieldAsDefined.getType().getStackSize().getSize(), instrumentedMethod.getStackSize() ); }