protected void buildCommonMethods( ClassWriter cw, String proxy ) { MethodVisitor mv; { mv = cw.visitMethod( ACC_PUBLIC, "toString", "()" + Type.getDescriptor( String.class ), null, null ); mv.visitCode(); mv.visitTypeInsn( NEW, Type.getInternalName( StringBuilder.class ) ); mv.visitInsn( DUP ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( StringBuilder.class ), "<init>", "()V" ); mv.visitLdcInsn( "(@" + proxy + ") : " ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( String.class ) + ")" + Type.getDescriptor( StringBuilder.class ) ); mv.visitVarInsn( ALOAD, 0 ); mv.visitMethodInsn( INVOKEVIRTUAL, BuildUtils.getInternalType( proxy ), "getFields", "()" + Type.getDescriptor( Map.class ) ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Map.class ) , "entrySet", "()" + Type.getDescriptor( Set.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( Object.class ), "toString", "()" + Type.getDescriptor( String.class )); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( String.class ) + ")" + Type.getDescriptor( StringBuilder.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "toString", "()" + Type.getDescriptor( String.class )); mv.visitInsn( ARETURN ); // mv.visitMaxs( 2, 1 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); } }
protected void invokeContainsKey( MethodVisitor mv, String fieldName ) { mv.visitLdcInsn( fieldName ); mv.visitVarInsn( ALOAD, 1 ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( String.class ), "equals", "(" + Type.getDescriptor( Object.class ) + ")Z" ); Label l0 = new Label(); mv.visitJumpInsn( IFEQ, l0 ); mv.visitInsn( ICONST_1 ); mv.visitInsn( IRETURN ); mv.visitLabel( l0 ); }
protected void buildHardGetter( ClassVisitor cw, FieldDefinition field, String masterName, ClassDefinition proxy, ClassDefinition core, String getterName, boolean protect ) { Class fieldType = field.getType(); MethodVisitor mv = cw.visitMethod( protect ? ACC_PROTECTED : ACC_PUBLIC, getterName, "()" + Type.getDescriptor( fieldType ), null, null); mv.visitCode(); TraitFactory.invokeExtractor( mv, masterName, proxy, core, field ); if ( ! BuildUtils.isPrimitive( field.getTypeName() ) ) { mv.visitTypeInsn( CHECKCAST, Type.getInternalName( fieldType ) ); } mv.visitInsn( BuildUtils.returnType ( fieldType.getName() ) ); // mv.visitMaxs( 2, 1 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
Type.getDescriptor( TraitFieldTMS.class ), null, null ); null, null); mv.visitCode(); mv.visitVarInsn( ALOAD, 0 ); mv.visitFieldInsn( GETFIELD, BuildUtils.getInternalType( def.getName() ), TraitableBean.FIELDTMS_FIELD_NAME, Type.getDescriptor( TraitFieldTMS.class ) ); mv.visitInsn( ARETURN ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); null, null); mv.visitCode(); mv.visitVarInsn( ALOAD, 0 ); mv.visitVarInsn( ALOAD, 1 ); mv.visitFieldInsn ( PUTFIELD, BuildUtils.getInternalType( def.getName() ), TraitableBean.FIELDTMS_FIELD_NAME, Type.getDescriptor( TraitFieldTMS.class ) ); mv.visitInsn( RETURN) ; mv.visitMaxs( 0, 0 ); mv.visitEnd();
/** * Generates an invoke method instruction. * * @param opcode * the instruction's opcode. * @param type * the class in which the method is defined. * @param method * the method to be invoked. */ private void invokeInsn(final int opcode, final Type type, final Method method, final boolean itf) { String owner = type.getSort() == Type.ARRAY ? type.getDescriptor() : type.getInternalName(); mv.visitMethodInsn(opcode, owner, method.getName(), method.getDescriptor(), itf); }
private void buildCommonMethods(ClassWriter cw, String proxy, String core ) { String proxyType = BuildUtils.getInternalType( proxy ); { MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "toString", "()" + Type.getDescriptor( String.class ), null, null ); mv.visitCode(); mv.visitTypeInsn( NEW, Type.getInternalName( StringBuilder.class ) ); mv.visitInsn( DUP ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( StringBuilder.class ), "<init>", "()V" ); mv.visitLdcInsn( "(@" + proxy + ") : " ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( String.class ) + ")" + Type.getDescriptor( StringBuilder.class ) ); mv.visitVarInsn( ALOAD, 0 ); mv.visitMethodInsn( INVOKEVIRTUAL, proxyType, "getFields", "()" + Type.getDescriptor( Map.class ) ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Map.class ), "entrySet", "()" + Type.getDescriptor( Set.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( Object.class ), "toString", "()" + Type.getDescriptor( String.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( String.class ) + ")" + Type.getDescriptor( StringBuilder.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "toString", "()" + Type.getDescriptor( String.class ) ); mv.visitInsn( ARETURN ); // mv.visitMaxs( 2, 1 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); } }
protected void invokeContainsKey( MethodVisitor mv, String fieldName ) { mv.visitLdcInsn( fieldName ); mv.visitVarInsn( ALOAD, 1 ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( String.class ), "equals", "(" + Type.getDescriptor( Object.class ) + ")Z" ); Label l0 = new Label(); mv.visitJumpInsn( IFEQ, l0 ); mv.visitInsn( ICONST_1 ); mv.visitInsn( IRETURN ); mv.visitLabel( l0 ); }
private void buildHardGetter( ClassVisitor cw, FieldDefinition field, String masterName, ClassDefinition proxy, ClassDefinition core, String getterName, boolean protect ) { String fieldName = field.getName(); Class fieldType = field.getType(); MethodVisitor mv = cw.visitMethod( protect ? ACC_PROTECTED : ACC_PUBLIC, getterName, "()" + Type.getDescriptor( field.getType() ), null, null); mv.visitCode(); TraitFactory.invokeExtractor( mv, masterName, proxy, core, field ); if ( ! BuildUtils.isPrimitive( field.getTypeName() ) ) { mv.visitTypeInsn( CHECKCAST, Type.getInternalName( fieldType ) ); } mv.visitInsn( BuildUtils.returnType ( field.getTypeName() ) ); // mv.visitMaxs( 2, 1 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
Type.getDescriptor( Map.class ) , "Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;", null); "()Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;", null); mv.visitCode(); mv.visitVarInsn( ALOAD, 0 ); mv.visitFieldInsn( GETFIELD, BuildUtils.getInternalType(def.getName()), TraitableBean.MAP_FIELD_NAME, Type.getDescriptor( Map.class ) ); mv.visitInsn( ARETURN ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); "(Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;)V", null); mv.visitCode(); mv.visitVarInsn( ALOAD, 0 ); mv.visitVarInsn( ALOAD, 1 ); mv.visitFieldInsn ( PUTFIELD, BuildUtils.getInternalType( def.getName() ), TraitableBean.MAP_FIELD_NAME, Type.getDescriptor( Map.class ) ); mv.visitInsn( RETURN) ; mv.visitMaxs( 0, 0 ); mv.visitEnd();
private void buildPut( ClassVisitor cw, String wrapperName, String coreName, ClassDefinition trait, ClassDefinition core, BitSet mask ) { String internalWrapper = BuildUtils.getInternalType( wrapperName ); MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "put", "(" + Type.getDescriptor( String.class ) + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ), null, null ); mv.visitCode(); if ( core.getFieldsDefinitions().size() > 0) { for ( FieldDefinition field : core.getFieldsDefinitions() ) { invokePut( mv, wrapperName, core, field.getName(), field ); } } mv.visitVarInsn( ALOAD, 0 ); mv.visitFieldInsn( GETFIELD, internalWrapper, "map", Type.getDescriptor( Map.class ) ); mv.visitVarInsn( ALOAD, 1 ); mv.visitVarInsn( ALOAD, 2 ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Map.class ), "put", "(" + Type.getDescriptor( Object.class ) + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ) ); mv.visitInsn( ARETURN ); // mv.visitMaxs( 4, 5 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
protected int clearSoftField(MethodVisitor mv, String wrapperName, FieldDefinition field ) { int size = 0; mv.visitVarInsn( ALOAD, 0 ); mv.visitFieldInsn( GETFIELD, wrapperName, "store", Type.getDescriptor( TripleStore.class ) ); mv.visitVarInsn( ALOAD, 0 ); mv.visitLdcInsn( field.getName() ); mv.visitInsn( BuildUtils.zero( field.getTypeName() ) ); if ( BuildUtils.isPrimitive( field.getTypeName() ) ) { TraitFactory.valueOf( mv, field.getTypeName() ); size = BuildUtils.sizeOf( field.getTypeName() ); } else { size = 2; } mv.visitMethodInsn( INVOKEVIRTUAL, wrapperName, "property", "(" + Type.getDescriptor( String.class ) + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Triple.class ) ); mv.visitInsn( ICONST_1 ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( TripleStore.class ), "put", "(" + Type.getDescriptor( Triple.class ) + "Z)Z" ); mv.visitInsn( POP ); return size; }
private void buildGet( ClassVisitor cw, String wrapperName, String coreName, ClassDefinition trait, ClassDefinition core, BitSet mask ) { String internalWrapper = BuildUtils.getInternalType( wrapperName ); MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "get", "(" + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ), null, null ); mv.visitCode(); if ( core.getFieldsDefinitions().size() > 0) { for ( FieldDefinition field : core.getFieldsDefinitions() ) { invokeGet( mv, wrapperName, core, field.getName(), field ); } } mv.visitVarInsn( ALOAD, 0 ); mv.visitFieldInsn( GETFIELD, internalWrapper, "map", Type.getDescriptor( Map.class ) ); mv.visitVarInsn( ALOAD, 1 ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Map.class ), "get", "(" + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ) ); mv.visitInsn( ARETURN ); // mv.visitMaxs( 2, 2 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
mv.visitVarInsn( ALOAD, 0 ); mv.visitTypeInsn( NEW, Type.getInternalName(mixinClass) ); mv.visitInsn( DUP ); mv.visitVarInsn( ALOAD, 0 ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( mixinClass ), "<init>", "("+ Type.getDescriptor( actualArg ) + ")V" ); mv.visitFieldInsn( PUTFIELD, internalProxy, mixin, Type.getDescriptor( mixinClass ) ); mv.visitInsn( DUP ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( mixinClass ), "<init>", "()V" ); mv.visitFieldInsn( PUTFIELD, internalProxy, mixin, Type.getDescriptor( mixinClass ) ); mv.visitFieldInsn( PUTFIELD, internalProxy, "store", Type.getDescriptor( TripleStore.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, internalProxy, "setTripleFactory", "(" + Type.getDescriptor( TripleFactory.class ) + ")V" ); mv.visitMethodInsn( INVOKESPECIAL, internalWrapper, "<init>", "(" + descrCore + Type.getDescriptor( TripleStore.class ) + Type.getDescriptor( TripleFactory.class ) + ")V" ); mv.visitFieldInsn( PUTFIELD, internalProxy, "fields", Type.getDescriptor( Map.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, internalCore, "_getDynamicProperties", "()" + Type.getDescriptor( Map.class ) ); Label l0 = new Label();
protected void buildPut( ClassVisitor cw, String wrapperName, String coreName, ClassDefinition trait, ClassDefinition core, BitSet mask ) { MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "put", "(" + Type.getDescriptor( String.class) + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ), null, null ); mv.visitCode(); if ( core.getFieldsDefinitions().size() > 0) { int j = 0; for ( FieldDefinition field : core.getFieldsDefinitions() ) { invokePut( mv, wrapperName, core, field.getName(), field ); } } mv.visitVarInsn( ALOAD, 0 ); mv.visitVarInsn( ALOAD, 1 ); mv.visitVarInsn( ALOAD, 2 ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( TripleBasedStruct.class ), "put", "(" + Type.getDescriptor( String.class) + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ) ); mv.visitInsn( ARETURN ); // mv.visitMaxs( 4, 5 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
private void invokeRemove( MethodVisitor mv, String wrapperName, ClassDefinition core, String fieldName, FieldDefinition field ) { mv.visitLdcInsn( fieldName ); mv.visitVarInsn( ALOAD, 1 ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName(String.class), "equals", "(" + Type.getDescriptor( Object.class ) + ")Z" ); Label l1 = new Label(); mv.visitJumpInsn( IFEQ, l1 ); TraitFactory.invokeExtractor( mv, wrapperName, trait, core, field ); if ( BuildUtils.isPrimitive( field.getTypeName() ) ) { TraitFactory.valueOf( mv, field.getTypeName() ); } mv.visitVarInsn( ASTORE, 2 ); TraitFactory.invokeInjector( mv, wrapperName, trait, core, field, true, 1 ); mv.visitVarInsn( ALOAD, 2 ); mv.visitInsn( ARETURN ); mv.visitLabel( l1 ); }
private void buildContainsKey(ClassWriter cw, String name, String className, ClassDefinition trait, ClassDefinition core, BitSet mask) { String internalWrapper = BuildUtils.getInternalType( name ); MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "containsKey", "(" + Type.getDescriptor( Object.class ) + ")Z", null, null ); mv.visitCode(); for ( FieldDefinition field : core.getFieldsDefinitions() ) { invokeContainsKey( mv, field.getName() ); } mv.visitVarInsn( ALOAD, 0 ); mv.visitFieldInsn( GETFIELD, internalWrapper, "map", Type.getDescriptor( Map.class ) ); mv.visitVarInsn( ALOAD, 1 ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Map.class ), "containsKey", "(" + Type.getDescriptor( Object.class ) + ")Z" ); mv.visitInsn( IRETURN ); // mv.visitMaxs( 2, 2 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
private void invokeGet( MethodVisitor mv, String wrapperName, ClassDefinition core, String fieldName, FieldDefinition field ) { mv.visitLdcInsn( fieldName ); mv.visitVarInsn( ALOAD, 1 ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( String.class ), "equals", "(" + Type.getDescriptor( Object.class ) + ")Z" ); Label l0 = new Label(); mv.visitJumpInsn( IFEQ, l0 ); TraitFactory.invokeExtractor( mv, wrapperName, trait, core, field ); if ( BuildUtils.isPrimitive( field.getTypeName() ) ) { TraitFactory.valueOf( mv, field.getTypeName() ); } mv.visitInsn( ARETURN ); mv.visitLabel( l0 ); }
protected void buildGet( ClassVisitor cw, String wrapperName, String coreName, ClassDefinition trait, ClassDefinition core, BitSet mask ) { MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "get", "(" + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ), null, null ); mv.visitCode(); if ( core.getFieldsDefinitions().size() > 0 ) { for ( FieldDefinition field : core.getFieldsDefinitions() ) { invokeGet( mv, wrapperName, core, field.getName(), field ); } } mv.visitVarInsn( ALOAD, 0 ); mv.visitVarInsn( ALOAD, 1 ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( TripleBasedStruct.class ), "get", "(" + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ) ); mv.visitInsn( ARETURN ); // mv.visitMaxs( 2, 2 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
protected void invokeRemove( MethodVisitor mv, String wrapperName, ClassDefinition core, String fieldName, FieldDefinition field ) { mv.visitLdcInsn( fieldName ); mv.visitVarInsn( ALOAD, 1 ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( String.class ), "equals", "("+ Type.getDescriptor( Object.class ) + ")Z" ); Label l1 = new Label(); mv.visitJumpInsn( IFEQ, l1 ); TraitFactory.invokeExtractor( mv, wrapperName, trait, core, field ); if ( BuildUtils.isPrimitive( field.getTypeName() ) ) { TraitFactory.valueOf( mv, field.getTypeName() ); } mv.visitVarInsn(ASTORE, 2); TraitFactory.invokeInjector( mv, wrapperName, trait, core, field, true, 1); mv.visitVarInsn( ALOAD, 2 ); mv.visitInsn( ARETURN ); mv.visitLabel( l1 ); }
mv = cw.visitMethod( ACC_PUBLIC, "toString", "()" + Type.getDescriptor( String.class ), null, null ); mv.visitCode(); mv.visitTypeInsn( NEW, Type.getInternalName( StringBuilder.class ) ); mv.visitInsn( DUP ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( StringBuilder.class ), "<init>", "()V" ); mv.visitLdcInsn("[["); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( String.class ) +")" + Type.getDescriptor( StringBuilder.class ) ); mv.visitVarInsn( ALOAD, 0 ); mv.visitMethodInsn( INVOKEVIRTUAL, BuildUtils.getInternalType( wrapper ), "entrySet", "()" + Type.getDescriptor( Set.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( StringBuilder.class ) ); "(" + Type.getDescriptor( String.class ) +")" + Type.getDescriptor( StringBuilder.class )); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "toString", "()" + Type.getDescriptor( String.class ) ); mv.visitInsn( ARETURN ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); "(" + Type.getDescriptor( Object.class ) + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ), null, null); mv.visitCode(); mv.visitVarInsn( ALOAD, 0 ); mv.visitVarInsn( ALOAD, 1 ); "(" + Type.getDescriptor( String.class ) + Type.getDescriptor( Object.class ) + ")" + Type.getDescriptor( Object.class ) ); mv.visitInsn( ARETURN);