blob: 08bd4e64409d999a6aa720e6750afe20bb41646a [file] [log] [blame]
/*
* Copyright (c) 2010, Rickard Öberg. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.zest.test;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.util.ASMifier;
import org.objectweb.asm.util.TraceClassVisitor;
import org.apache.zest.api.composite.CompositeInvoker;
import org.apache.zest.runtime.composite.FragmentClassLoader;
import org.apache.zest.runtime.composite.QI256Test;
import static org.objectweb.asm.Opcodes.*;
public class ASMTest
{
@Test
public void generateASM()
throws Exception
{
ASMifier.main( new String[]{ SomeMixin_Stubx.class.getName() } );
}
@Test
public void createClass()
throws Exception
{
FragmentClassLoader classLoader = new FragmentClassLoader( SomeMixin.class.getClassLoader() );
Class clazz = classLoader.loadClass( SomeMixin.class.getName() + "_Stub" );
// Class clazz = SomeMixin_Stubx.class;
final Other other = new Other()
{
public String other()
{
return "other";
}
public String foo( String bar, int x )
{
return "bar:" + bar;
}
public void bar( double doub,
boolean bool,
float fl,
char ch,
int integer,
long lg,
short sh,
byte b,
Double doubObj,
Object[] objArr,
int[] intArr
)
{
}
public void multiEx( String bar )
throws Exception1, Exception2
{
}
public long unwrapResult()
{
return 0;
}
public void generic( List<String> list )
{
list.add( "Hello World" );
}
};
final Some instance = (Some) clazz.getConstructor().newInstance();
CompositeInvoker invoker = new CompositeInvoker()
{
public Object invokeComposite( Method method, Object[] args )
throws Throwable
{
Method fakeMethod = null;
try
{
fakeMethod = instance.getClass().getMethod( "_" + method.getName(), method.getParameterTypes() );
try
{
return fakeMethod.invoke( instance, args );
}
catch( InvocationTargetException e )
{
throw e.getCause();
}
}
catch( NoSuchMethodException e )
{
try
{
return method.invoke( other, args );
}
catch( InvocationTargetException ex )
{
throw ex.getCause();
}
}
}
};
clazz.getField( "_instance" ).set( instance, invoker );
System.out.println( instance.some() );
System.out.println( instance.testConcern() );
}
@Test
@Ignore( "Convenience to look at what code is generated in the Fragment Classloader, and is not really a test case." )
public void fragmentClassLoaderGenerateClassTest()
throws Exception
{
byte[] asm = generateClass();
byte[] cl = FragmentClassLoader.generateClass(
QI256Test.TestTransient.TestTransientMixin.class.getName() + "_Stub",
QI256Test.TestTransient.TestTransientMixin.class );
new ClassReader( cl ).accept( new TraceClassVisitor( new PrintWriter( System.out, true ) ), 0 );
Assert.assertArrayEquals( asm, cl );
}
// This is the code generated from the manual stub
private static byte[] generateClass()
{
ClassWriter cw = new ClassWriter( 0 );
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;
cw.visit( V1_6, ACC_PUBLIC + ACC_SUPER, "org/qi4j/satisfiedBy/SomeMixin_Stub", null,
"org/qi4j/satisfiedBy/SomeMixin", null );
{
fv = cw.visitField( ACC_PUBLIC, "_instance", "Lorg/qi4j/spi/composite/CompositeInvoker;", null, null );
fv.visitEnd();
}
{
fv = cw.visitField( ACC_PRIVATE + ACC_STATIC, "m1", "Ljava/lang/reflect/Method;", null, null );
fv.visitEnd();
}
{
fv = cw.visitField( ACC_PRIVATE + ACC_STATIC, "m2", "Ljava/lang/reflect/Method;", null, null );
fv.visitEnd();
}
{
fv = cw.visitField( ACC_PRIVATE + ACC_STATIC, "m3", "Ljava/lang/reflect/Method;", null, null );
fv.visitEnd();
}
{
fv = cw.visitField( ACC_PRIVATE + ACC_STATIC, "m4", "Ljava/lang/reflect/Method;", null, null );
fv.visitEnd();
}
{
fv = cw.visitField( ACC_PRIVATE + ACC_STATIC, "m5", "Ljava/lang/reflect/Method;", null, null );
fv.visitEnd();
}
{
mv = cw.visitMethod( ACC_PUBLIC, "<init>", "()V", null, null );
mv.visitCode();
mv.visitVarInsn( ALOAD, 0 );
mv.visitMethodInsn( INVOKESPECIAL, "org/qi4j/satisfiedBy/SomeMixin", "<init>", "()V", false );
mv.visitInsn( RETURN );
mv.visitMaxs( 1, 1 );
mv.visitEnd();
}
{
mv = cw.visitMethod( ACC_PUBLIC, "<init>", "(Ljava/lang/String;)V", null, null );
mv.visitCode();
mv.visitVarInsn( ALOAD, 0 );
mv.visitVarInsn( ALOAD, 1 );
mv.visitMethodInsn( INVOKESPECIAL, "org/qi4j/satisfiedBy/SomeMixin", "<init>", "(Ljava/lang/String;)V", false );
mv.visitInsn( RETURN );
mv.visitMaxs( 2, 2 );
mv.visitEnd();
}
{
mv = cw.visitMethod( ACC_PUBLIC, "other", "()Ljava/lang/String;", null, null );
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock( l0, l1, l2, "java/lang/Throwable" );
mv.visitLabel( l0 );
mv.visitVarInsn( ALOAD, 0 );
mv.visitFieldInsn( GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
"Lorg/qi4j/spi/composite/CompositeInvoker;" );
mv.visitFieldInsn( GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m1", "Ljava/lang/reflect/Method;" );
mv.visitInsn( ACONST_NULL );
mv.visitMethodInsn( INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
"(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true );
mv.visitTypeInsn( CHECKCAST, "java/lang/String" );
mv.visitLabel( l1 );
mv.visitInsn( ARETURN );
mv.visitLabel( l2 );
mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" } );
mv.visitVarInsn( ASTORE, 1 );
mv.visitTypeInsn( NEW, "java/lang/reflect/UndeclaredThrowableException" );
mv.visitInsn( DUP );
mv.visitVarInsn( ALOAD, 1 );
mv.visitMethodInsn( INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
"(Ljava/lang/Throwable;)V", false );
mv.visitInsn( ATHROW );
mv.visitMaxs( 3, 2 );
mv.visitEnd();
}
{
mv = cw.visitMethod( ACC_PUBLIC, "foo", "(Ljava/lang/String;I)Ljava/lang/String;", null,
new String[]{ "java/lang/IllegalArgumentException" } );
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock( l0, l1, l2, "java/lang/IllegalArgumentException" );
Label l3 = new Label();
mv.visitTryCatchBlock( l0, l1, l3, "java/lang/Throwable" );
mv.visitLabel( l0 );
mv.visitVarInsn( ALOAD, 0 );
mv.visitFieldInsn( GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
"Lorg/qi4j/spi/composite/CompositeInvoker;" );
mv.visitFieldInsn( GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m2", "Ljava/lang/reflect/Method;" );
mv.visitInsn( ICONST_2 );
mv.visitTypeInsn( ANEWARRAY, "java/lang/Object" );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_0 );
mv.visitVarInsn( ALOAD, 1 );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_1 );
mv.visitVarInsn( ILOAD, 2 );
mv.visitMethodInsn( INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false );
mv.visitInsn( AASTORE );
mv.visitMethodInsn( INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
"(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true );
mv.visitTypeInsn( CHECKCAST, "java/lang/String" );
mv.visitLabel( l1 );
mv.visitInsn( ARETURN );
mv.visitLabel( l2 );
mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/IllegalArgumentException" } );
mv.visitVarInsn( ASTORE, 3 );
mv.visitVarInsn( ALOAD, 3 );
mv.visitInsn( ATHROW );
mv.visitLabel( l3 );
mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" } );
mv.visitVarInsn( ASTORE, 3 );
mv.visitTypeInsn( NEW, "java/lang/reflect/UndeclaredThrowableException" );
mv.visitInsn( DUP );
mv.visitVarInsn( ALOAD, 3 );
mv.visitMethodInsn( INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
"(Ljava/lang/Throwable;)V", false );
mv.visitInsn( ATHROW );
mv.visitMaxs( 6, 4 );
mv.visitEnd();
}
{
mv = cw.visitMethod( ACC_PUBLIC, "bar", "(DZFCIJSBLjava/lang/Double;[Ljava/lang/Object;[I)V", null, null );
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock( l0, l1, l2, "java/lang/Throwable" );
mv.visitLabel( l0 );
mv.visitVarInsn( ALOAD, 0 );
mv.visitFieldInsn( GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
"Lorg/qi4j/spi/composite/CompositeInvoker;" );
mv.visitFieldInsn( GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m3", "Ljava/lang/reflect/Method;" );
mv.visitIntInsn( BIPUSH, 11 );
mv.visitTypeInsn( ANEWARRAY, "java/lang/Object" );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_0 );
mv.visitVarInsn( DLOAD, 1 );
mv.visitMethodInsn( INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;", false );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_1 );
mv.visitVarInsn( ILOAD, 3 );
mv.visitMethodInsn( INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_2 );
mv.visitVarInsn( FLOAD, 4 );
mv.visitMethodInsn( INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;", false );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_3 );
mv.visitVarInsn( ILOAD, 5 );
mv.visitMethodInsn( INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;", false );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_4 );
mv.visitVarInsn( ILOAD, 6 );
mv.visitMethodInsn( INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_5 );
mv.visitVarInsn( LLOAD, 7 );
mv.visitMethodInsn( INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 6 );
mv.visitVarInsn( ILOAD, 9 );
mv.visitMethodInsn( INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;", false );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 7 );
mv.visitVarInsn( ILOAD, 10 );
mv.visitMethodInsn( INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;", false );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 8 );
mv.visitVarInsn( ALOAD, 11 );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 9 );
mv.visitVarInsn( ALOAD, 12 );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 10 );
mv.visitVarInsn( ALOAD, 13 );
mv.visitInsn( AASTORE );
mv.visitMethodInsn( INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
"(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true );
mv.visitInsn( POP );
mv.visitLabel( l1 );
Label l3 = new Label();
mv.visitJumpInsn( GOTO, l3 );
mv.visitLabel( l2 );
mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" } );
mv.visitVarInsn( ASTORE, 14 );
mv.visitTypeInsn( NEW, "java/lang/reflect/UndeclaredThrowableException" );
mv.visitInsn( DUP );
mv.visitVarInsn( ALOAD, 14 );
mv.visitMethodInsn( INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
"(Ljava/lang/Throwable;)V", false );
mv.visitInsn( ATHROW );
mv.visitLabel( l3 );
mv.visitFrame( Opcodes.F_SAME, 0, null, 0, null );
mv.visitInsn( RETURN );
mv.visitMaxs( 7, 15 );
mv.visitEnd();
}
{
mv = cw.visitMethod( ACC_PUBLIC, "multiEx", "(Ljava/lang/String;)V", null,
new String[]{ "org/qi4j/satisfiedBy/Exception1", "org/qi4j/satisfiedBy/Exception2" } );
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock( l0, l1, l2, "org/qi4j/satisfiedBy/Exception1" );
Label l3 = new Label();
mv.visitTryCatchBlock( l0, l1, l3, "org/qi4j/satisfiedBy/Exception2" );
Label l4 = new Label();
mv.visitTryCatchBlock( l0, l1, l4, "java/lang/Throwable" );
mv.visitLabel( l0 );
mv.visitVarInsn( ALOAD, 0 );
mv.visitFieldInsn( GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
"Lorg/qi4j/spi/composite/CompositeInvoker;" );
mv.visitFieldInsn( GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m4", "Ljava/lang/reflect/Method;" );
mv.visitInsn( ICONST_1 );
mv.visitTypeInsn( ANEWARRAY, "java/lang/Object" );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_0 );
mv.visitVarInsn( ALOAD, 1 );
mv.visitInsn( AASTORE );
mv.visitMethodInsn( INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
"(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true );
mv.visitInsn( POP );
mv.visitLabel( l1 );
Label l5 = new Label();
mv.visitJumpInsn( GOTO, l5 );
mv.visitLabel( l2 );
mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "org/qi4j/satisfiedBy/Exception1" } );
mv.visitVarInsn( ASTORE, 2 );
mv.visitVarInsn( ALOAD, 2 );
mv.visitInsn( ATHROW );
mv.visitLabel( l3 );
mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "org/qi4j/satisfiedBy/Exception2" } );
mv.visitVarInsn( ASTORE, 2 );
mv.visitVarInsn( ALOAD, 2 );
mv.visitInsn( ATHROW );
mv.visitLabel( l4 );
mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" } );
mv.visitVarInsn( ASTORE, 2 );
mv.visitTypeInsn( NEW, "java/lang/reflect/UndeclaredThrowableException" );
mv.visitInsn( DUP );
mv.visitVarInsn( ALOAD, 2 );
mv.visitMethodInsn( INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
"(Ljava/lang/Throwable;)V", false );
mv.visitInsn( ATHROW );
mv.visitLabel( l5 );
mv.visitFrame( Opcodes.F_SAME, 0, null, 0, null );
mv.visitInsn( RETURN );
mv.visitMaxs( 6, 3 );
mv.visitEnd();
}
{
mv = cw.visitMethod( ACC_PUBLIC, "unwrapResult", "()I", null, null );
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock( l0, l1, l2, "java/lang/Throwable" );
mv.visitLabel( l0 );
mv.visitVarInsn( ALOAD, 0 );
mv.visitFieldInsn( GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance",
"Lorg/qi4j/spi/composite/CompositeInvoker;" );
mv.visitFieldInsn( GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m5", "Ljava/lang/reflect/Method;" );
mv.visitInsn( ACONST_NULL );
mv.visitMethodInsn( INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite",
"(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true );
mv.visitTypeInsn( CHECKCAST, "java/lang/Integer" );
mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false );
mv.visitLabel( l1 );
mv.visitInsn( IRETURN );
mv.visitLabel( l2 );
mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" } );
mv.visitVarInsn( ASTORE, 1 );
mv.visitTypeInsn( NEW, "java/lang/reflect/UndeclaredThrowableException" );
mv.visitInsn( DUP );
mv.visitVarInsn( ALOAD, 1 );
mv.visitMethodInsn( INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>",
"(Ljava/lang/Throwable;)V", false );
mv.visitInsn( ATHROW );
mv.visitMaxs( 3, 2 );
mv.visitEnd();
}
{
mv = cw.visitMethod( ACC_STATIC, "<clinit>", "()V", null, null );
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock( l0, l1, l2, "java/lang/NoSuchMethodException" );
mv.visitLabel( l0 );
mv.visitLdcInsn( Type.getType( "Lorg/qi4j/satisfiedBy/Other;" ) );
mv.visitLdcInsn( "other" );
mv.visitInsn( ICONST_0 );
mv.visitTypeInsn( ANEWARRAY, "java/lang/Class" );
mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Class", "getMethod",
"(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false );
mv.visitFieldInsn( PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m1", "Ljava/lang/reflect/Method;" );
mv.visitLdcInsn( Type.getType( "Lorg/qi4j/satisfiedBy/Other;" ) );
mv.visitLdcInsn( "foo" );
mv.visitInsn( ICONST_2 );
mv.visitTypeInsn( ANEWARRAY, "java/lang/Class" );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_0 );
mv.visitLdcInsn( Type.getType( "Ljava/lang/String;" ) );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_1 );
mv.visitFieldInsn( GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;" );
mv.visitInsn( AASTORE );
mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Class", "getMethod",
"(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false );
mv.visitFieldInsn( PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m2", "Ljava/lang/reflect/Method;" );
mv.visitLdcInsn( Type.getType( "Lorg/qi4j/satisfiedBy/Other;" ) );
mv.visitLdcInsn( "bar" );
mv.visitIntInsn( BIPUSH, 11 );
mv.visitTypeInsn( ANEWARRAY, "java/lang/Class" );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_0 );
mv.visitFieldInsn( GETSTATIC, "java/lang/Double", "TYPE", "Ljava/lang/Class;" );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_1 );
mv.visitFieldInsn( GETSTATIC, "java/lang/Boolean", "TYPE", "Ljava/lang/Class;" );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_2 );
mv.visitFieldInsn( GETSTATIC, "java/lang/Float", "TYPE", "Ljava/lang/Class;" );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_3 );
mv.visitFieldInsn( GETSTATIC, "java/lang/Character", "TYPE", "Ljava/lang/Class;" );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_4 );
mv.visitFieldInsn( GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;" );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_5 );
mv.visitFieldInsn( GETSTATIC, "java/lang/Long", "TYPE", "Ljava/lang/Class;" );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 6 );
mv.visitFieldInsn( GETSTATIC, "java/lang/Short", "TYPE", "Ljava/lang/Class;" );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 7 );
mv.visitFieldInsn( GETSTATIC, "java/lang/Byte", "TYPE", "Ljava/lang/Class;" );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 8 );
mv.visitLdcInsn( Type.getType( "Ljava/lang/Double;" ) );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 9 );
mv.visitLdcInsn( Type.getType( "[Ljava/lang/Object;" ) );
mv.visitInsn( AASTORE );
mv.visitInsn( DUP );
mv.visitIntInsn( BIPUSH, 10 );
mv.visitLdcInsn( Type.getType( "[I" ) );
mv.visitInsn( AASTORE );
mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Class", "getMethod",
"(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false );
mv.visitFieldInsn( PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m3", "Ljava/lang/reflect/Method;" );
mv.visitLdcInsn( Type.getType( "Lorg/qi4j/satisfiedBy/Other;" ) );
mv.visitLdcInsn( "multiEx" );
mv.visitInsn( ICONST_1 );
mv.visitTypeInsn( ANEWARRAY, "java/lang/Class" );
mv.visitInsn( DUP );
mv.visitInsn( ICONST_0 );
mv.visitLdcInsn( Type.getType( "Ljava/lang/String;" ) );
mv.visitInsn( AASTORE );
mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Class", "getMethod",
"(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false );
mv.visitFieldInsn( PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m4", "Ljava/lang/reflect/Method;" );
mv.visitLdcInsn( Type.getType( "Lorg/qi4j/satisfiedBy/Other;" ) );
mv.visitLdcInsn( "unwrapResult" );
mv.visitInsn( ICONST_0 );
mv.visitTypeInsn( ANEWARRAY, "java/lang/Class" );
mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/Class", "getMethod",
"(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false );
mv.visitFieldInsn( PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m5", "Ljava/lang/reflect/Method;" );
mv.visitLabel( l1 );
Label l3 = new Label();
mv.visitJumpInsn( GOTO, l3 );
mv.visitLabel( l2 );
mv.visitFrame( Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/NoSuchMethodException" } );
mv.visitVarInsn( ASTORE, 0 );
mv.visitVarInsn( ALOAD, 0 );
mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/NoSuchMethodException", "printStackTrace", "()V", false );
mv.visitLabel( l3 );
mv.visitFrame( Opcodes.F_SAME, 0, null, 0, null );
mv.visitInsn( RETURN );
mv.visitMaxs( 6, 1 );
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
}