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 initFields( MethodVisitor mv, String internalProxy ) { mv.visitVarInsn( ALOAD, 0 ); mv.visitVarInsn( ILOAD, 6 ); mv.visitMethodInsn( INVOKESPECIAL, internalProxy, "synchFields", Type.getMethodDescriptor( Type.VOID_TYPE, new Type[] { Type.BOOLEAN_TYPE } ) ); }
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 Object addSubstatement(ExecutableStatement stmt) { if (stmt instanceof ExecutableAccessor) { ExecutableAccessor ea = (ExecutableAccessor) stmt; if (ea.getNode().isIdentifier() && !ea.getNode().isDeepProperty()) { loadVariableByName(ea.getNode().getName()); return null; } } compiledInputs.add(stmt); assert debug("ALOAD 0"); mv.visitVarInsn(ALOAD, 0); assert debug("GETFIELD p" + (compiledInputs.size() - 1)); mv.visitFieldInsn(GETFIELD, className, "p" + (compiledInputs.size() - 1), "L" + NAMESPACE + "compiler/ExecutableStatement;"); assert debug("ALOAD 2"); mv.visitVarInsn(ALOAD, 2); assert debug("ALOAD 3"); mv.visitVarInsn(ALOAD, 3); assert debug("INVOKEINTERFACE ExecutableStatement.getValue"); mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(ExecutableStatement.class), "getValue", "(Ljava/lang/Object;L" + NAMESPACE + "integration/VariableResolverFactory;)Ljava/lang/Object;"); return null; }
/** * 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 writeOutNullHandler(Member member, int type) { mv.visitInsn(DUP); mv.visitInsn(POP); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEINTERFACE, NAMESPACE + "integration/PropertyHandler", "getProperty", "(Ljava/lang/String;Ljava/lang/Object;L" + NAMESPACE + "integration/VariableResolverFactory;)Ljava/lang/Object;");
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 Object addSubstatement(ExecutableStatement stmt) { if (stmt instanceof ExecutableAccessor) { ExecutableAccessor ea = (ExecutableAccessor) stmt; if (ea.getNode().isIdentifier() && !ea.getNode().isDeepProperty()) { loadVariableByName(ea.getNode().getName()); return null; } } compiledInputs.add(stmt); assert debug("ALOAD 0"); mv.visitVarInsn(ALOAD, 0); assert debug("GETFIELD p" + (compiledInputs.size() - 1)); mv.visitFieldInsn(GETFIELD, className, "p" + (compiledInputs.size() - 1), "L" + NAMESPACE + "compiler/ExecutableStatement;"); assert debug("ALOAD 2"); mv.visitVarInsn(ALOAD, 2); assert debug("ALOAD 3"); mv.visitVarInsn(ALOAD, 3); assert debug("INVOKEINTERFACE ExecutableStatement.getValue"); mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(ExecutableStatement.class), "getValue", "(Ljava/lang/Object;L" + NAMESPACE + "integration/VariableResolverFactory;)Ljava/lang/Object;"); return null; }
private void loadVariableByIndex(int pos) { assert debug("ALOAD 3"); mv.visitVarInsn(ALOAD, 3); assert debug("PUSH IDX VAL =" + pos); intPush(pos); assert debug("INVOKEINTERFACE " + NAMESPACE + "integration/VariableResolverFactory.getIndexedVariableResolver"); mv.visitMethodInsn(INVOKEINTERFACE, "" + NAMESPACE + "integration/VariableResolverFactory", "getIndexedVariableResolver", "(I)L" + NAMESPACE + "integration/VariableResolver;"); assert debug("INVOKEINTERFACE " + NAMESPACE + "integration/VariableResolver.getValue"); mv.visitMethodInsn(INVOKEINTERFACE, "" + NAMESPACE + "integration/VariableResolver", "getValue", "()Ljava/lang/Object;"); returnType = Object.class; }
protected void buildSystemHashCode(ClassWriter cw) { { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "identityHashCode", "(Ljava/lang/Object;)I"); mv.visitInsn(IRETURN); 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 Object addSubstatement(ExecutableStatement stmt) { if (stmt instanceof ExecutableAccessor) { ExecutableAccessor ea = (ExecutableAccessor) stmt; if (ea.getNode().isIdentifier() && !ea.getNode().isDeepProperty()) { loadVariableByName(ea.getNode().getName()); return null; } } compiledInputs.add(stmt); assert debug("ALOAD 0"); mv.visitVarInsn(ALOAD, 0); assert debug("GETFIELD p" + (compiledInputs.size() - 1)); mv.visitFieldInsn(GETFIELD, className, "p" + (compiledInputs.size() - 1), "L" + NAMESPACE + "compiler/ExecutableStatement;"); assert debug("ALOAD 2"); mv.visitVarInsn(ALOAD, 2); assert debug("ALOAD 3"); mv.visitVarInsn(ALOAD, 3); assert debug("INVOKEINTERFACE ExecutableStatement.getValue"); mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(ExecutableStatement.class), "getValue", "(Ljava/lang/Object;L" + NAMESPACE + "integration/VariableResolverFactory;)Ljava/lang/Object;"); return null; }
private void loadVariableByName(String name) { assert debug("ALOAD 3"); mv.visitVarInsn(ALOAD, 3); assert debug("LDC \"" + name + "\""); mv.visitLdcInsn(name); assert debug("INVOKEINTERFACE " + NAMESPACE + "integration/VariableResolverFactory.getVariableResolver"); mv.visitMethodInsn(INVOKEINTERFACE, "" + NAMESPACE + "integration/VariableResolverFactory", "getVariableResolver", "(Ljava/lang/String;)L" + NAMESPACE + "integration/VariableResolver;"); assert debug("INVOKEINTERFACE " + NAMESPACE + "integration/VariableResolver.getValue"); mv.visitMethodInsn(INVOKEINTERFACE, "" + NAMESPACE + "integration/VariableResolver", "getValue", "()Ljava/lang/Object;"); returnType = Object.class; }
private void buildKeyset( ClassVisitor cw, String wrapperName, String coreName, ClassDefinition trait, ClassDefinition core, BitSet mask ) { String internalWrapper = BuildUtils.getInternalType( wrapperName ); MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "keySet", "()" + Type.getDescriptor( Set.class ), "()Ljava/util/Set<Ljava/lang/String;>;", null ); mv.visitCode(); mv.visitTypeInsn( NEW, Type.getInternalName( HashSet.class ) ); mv.visitInsn( DUP ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( HashSet.class ), "<init>", "()V" ); mv.visitVarInsn( ASTORE, 1 ); for ( FieldDefinition field : core.getFieldsDefinitions() ) { mv.visitVarInsn( ALOAD, 1 ); mv.visitLdcInsn( field.getName() ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Set.class ), "add", "(" + Type.getDescriptor( Object.class ) + ")Z" ); mv.visitInsn( POP ); } mv.visitVarInsn( ALOAD, 1 ); mv.visitVarInsn( ALOAD, 0 ); mv.visitFieldInsn( GETFIELD, internalWrapper, "map", Type.getDescriptor( Map.class ) ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Map.class ), "keySet", "()" + Type.getDescriptor( Set.class ) ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Set.class ), "addAll", "(" + Type.getDescriptor( Collection.class ) + ")Z" ); mv.visitInsn( POP ); mv.visitVarInsn( ALOAD, 1 ); mv.visitInsn( ARETURN ); // mv.visitMaxs( 2, 2 ); 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 ); }
protected boolean defaultConstructorStart( MethodVisitor mv, ClassDefinition classDef ) { // Building default constructor mv.visitVarInsn( Opcodes.ALOAD, 0 ); String sup = ""; try { sup = Type.getInternalName(Class.forName(classDef.getSuperClass())); } catch (ClassNotFoundException e) { sup = BuildUtils.getInternalType( classDef.getSuperClass() ); } mv.visitMethodInsn( Opcodes.INVOKESPECIAL, sup, "<init>", Type.getMethodDescriptor( Type.VOID_TYPE, new Type[]{} ) ); boolean hasObjects = false; for (FieldDefinition field : classDef.getFieldsDefinitions()) { hasObjects = hasObjects || initFieldWithDefaultValue( mv, classDef, field ); } if ( classDef.isTraitable() ) { initializeDynamicTypeStructures( mv, classDef ); } return hasObjects; }
private void loadVariableByName(String name) { assert debug("ALOAD 3"); mv.visitVarInsn(ALOAD, 3); assert debug("LDC \"" + name + "\""); mv.visitLdcInsn(name); assert debug("INVOKEINTERFACE " + NAMESPACE + "integration/VariableResolverFactory.getVariableResolver"); mv.visitMethodInsn(INVOKEINTERFACE, "" + NAMESPACE + "integration/VariableResolverFactory", "getVariableResolver", "(Ljava/lang/String;)L" + NAMESPACE + "integration/VariableResolver;"); assert debug("INVOKEINTERFACE " + NAMESPACE + "integration/VariableResolver.getValue"); mv.visitMethodInsn(INVOKEINTERFACE, "" + NAMESPACE + "integration/VariableResolver", "getValue", "()Ljava/lang/Object;"); returnType = Object.class; }
protected void buildSize( ClassVisitor cw, String wrapperName, String coreName, ClassDefinition trait, ClassDefinition core, BitSet mask ) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "size", "()I", null, null); mv.visitCode(); mv.visitVarInsn( ALOAD, 0 ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( TripleBasedStruct.class ), "size", "()I" ); int n = core.getFieldsDefinitions().size(); for ( int j = 0; j < n; j++ ) { mv.visitInsn( ICONST_1 ); mv.visitInsn( IADD ); } mv.visitInsn(IRETURN); // mv.visitMaxs( core.getFieldsDefinitions().size() > 0 ? 2 : 1, // 1 ); 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 ); }