Example usage for org.objectweb.asm Opcodes ARETURN

List of usage examples for org.objectweb.asm Opcodes ARETURN

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes ARETURN.

Prototype

int ARETURN

To view the source code for org.objectweb.asm Opcodes ARETURN.

Click Source Link

Usage

From source file:org.fabric3.implementation.bytecode.reflection.BytecodeConsumerInvokerFactory.java

License:Open Source License

private void writeReturn(Class<?> returnType, MethodVisitor mv) {
    if (Void.TYPE.equals(returnType)) {
        mv.visitInsn(Opcodes.ACONST_NULL);
        mv.visitInsn(Opcodes.ARETURN);
    } else if (returnType.isPrimitive()) {
        if (Integer.TYPE.equals(returnType)) {
            mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
            mv.visitInsn(Opcodes.ARETURN);
        } else if (Boolean.TYPE.equals(returnType)) {
            mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;");
            mv.visitInsn(Opcodes.ARETURN);
        } else if (Double.TYPE.equals(returnType)) {
            mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
            mv.visitInsn(Opcodes.ARETURN);
        } else if (Long.TYPE.equals(returnType)) {
            mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
            mv.visitInsn(Opcodes.ARETURN);
        } else if (Float.TYPE.equals(returnType)) {
            mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
            mv.visitInsn(Opcodes.ARETURN);
        } else if (Short.TYPE.equals(returnType)) {
            mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
            mv.visitInsn(Opcodes.ARETURN);
        } else if (Byte.TYPE.equals(returnType)) {
            mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
            mv.visitInsn(Opcodes.ARETURN);
        }//  ww w  .j av a 2  s.  com
    } else {
        mv.visitInsn(Opcodes.ARETURN);
    }
}

From source file:org.formulacompiler.compiler.internal.bytecode.ArrayAccessorForConstDataCompiler.java

License:Open Source License

@Override
protected void compileBody() throws CompilerException {
    final GeneratorAdapter mv = mv();
    final ArrayDescriptor dim = this.arrayNode.arrayDescriptor();
    final int n = dim.numberOfElements();
    final DataType eltDataType = this.arrayNode.getDataType();
    final TypeCompiler eltCompiler = section().engineCompiler().typeCompiler(eltDataType);
    final Type eltType = eltCompiler.type();

    // private double[] xy;
    final FieldVisitor fv = cw().visitField(Opcodes.ACC_PRIVATE, methodName(), arrayDescriptor(), null, null);
    fv.visitEnd();// ww w . ja  v a2s. c o m

    // if (this.xy == null) {
    final Label skipInit = mv.newLabel();
    mv.loadThis();
    mv.visitFieldInsn(Opcodes.GETFIELD, section().classInternalName(), methodName(), arrayDescriptor());
    mv.ifNonNull(skipInit);

    // ... new double[ n ]
    mv.loadThis();
    mv.push(n);
    mv.newArray(eltType);

    // ... { c1, c2, ... }
    int i = 0;
    for (ExpressionNode elt : this.arrayNode.arguments()) {
        if (elt instanceof ExpressionNodeForConstantValue) {
            mv.visitInsn(Opcodes.DUP);
            mv.push(i);
            final ExpressionNodeForConstantValue constElt = (ExpressionNodeForConstantValue) elt;
            eltCompiler.compileConst(mv, constElt.value());
            mv.arrayStore(eltType);
        }
        i++;
    }

    // this.xy *=* new double[] { ... }
    mv.visitFieldInsn(Opcodes.PUTFIELD, section().classInternalName(), methodName(), arrayDescriptor());

    // }
    // return this.xy;
    mv.mark(skipInit);
    mv.loadThis();
    mv.visitFieldInsn(Opcodes.GETFIELD, section().classInternalName(), methodName(), arrayDescriptor());
    mv.visitInsn(Opcodes.ARETURN);
}

From source file:org.formulacompiler.compiler.internal.bytecode.ArrayAccessorForFullDataCompiler.java

License:Open Source License

@Override
protected void compileBody() throws CompilerException {
    final GeneratorAdapter mv = mv();
    final DataType eltDataType = this.arrayNode.getDataType();
    final ExpressionCompiler eltCompiler = expressionCompiler(eltDataType);
    final Type eltType = eltCompiler.type();
    final String initName = methodName() + "$init";
    final String initDesc = "Z";

    // private boolean xy$init;
    final FieldVisitor fv = cw().visitField(Opcodes.ACC_PRIVATE, initName, initDesc, null, null);
    fv.visitEnd();/*from  w  w w .j a  va 2  s .  c om*/

    // if (!this.xy$init) {
    final Label skipInit = mv.newLabel();
    mv.loadThis();
    mv.visitFieldInsn(Opcodes.GETFIELD, section().classInternalName(), initName, initDesc);
    mv.visitJumpInsn(Opcodes.IFNE, skipInit);

    // this.xy$init = true;
    mv.loadThis();
    mv.push(true);
    mv.visitFieldInsn(Opcodes.PUTFIELD, section().classInternalName(), initName, initDesc);

    // this.xy = { ?, c1, c2, ... }
    mv.loadThis();
    section().getArrayAccessorForConstDataOnly(this.arrayNode).compileCall(mv);
    int i = 0;
    for (ExpressionNode elt : this.arrayNode.arguments()) {
        if (!(elt instanceof ExpressionNodeForConstantValue)) {
            mv.visitInsn(Opcodes.DUP);
            mv.visitIntInsn(Opcodes.BIPUSH, i);
            eltCompiler.compile(elt);
            mv.arrayStore(eltType);
        }
        i++;
    }
    // return this.xy;
    mv.visitInsn(Opcodes.ARETURN);

    // } else
    // return this.xy;
    mv.mark(skipInit);
    mv.loadThis();
    section().getArrayAccessorForConstDataOnly(this.arrayNode).compileCall(mv);
    mv.visitInsn(Opcodes.ARETURN);

    if (section().hasReset()) {
        final GeneratorAdapter reset = section().resetter();
        // this.xy$init = false;
        reset.loadThis();
        reset.push(false);
        reset.visitFieldInsn(Opcodes.PUTFIELD, section().classInternalName(), initName, initDesc);
    }

}

From source file:org.formulacompiler.compiler.internal.bytecode.FactoryCompiler.java

License:Open Source License

private void buildComputationFactoryMethod() {
    final GeneratorAdapter mv = newMethod("newComputation",
            "(Ljava/lang/Object;)" + ByteCodeEngineCompiler.COMPUTATION_INTF.getDescriptor());
    mv.newInstance(ByteCodeEngineCompiler.GEN_ROOT_CLASS);
    mv.dup();//from  ww  w  .  j a  v  a  2  s . c  om
    mv.loadArg(0);
    compileClassRef(this.userInputClass, this.userInputType);
    mv.checkCast(this.userInputType);
    mv.loadThis();
    mv.getField(classType(), ByteCodeEngineCompiler.ENV_MEMBER_NAME, ByteCodeEngineCompiler.ENV_CLASS);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, ByteCodeEngineCompiler.GEN_ROOT_CLASS.getInternalName(), "<init>",
            "(" + this.userInputType.getDescriptor() + ByteCodeEngineCompiler.ENV_DESC + ")V");
    mv.visitInsn(Opcodes.ARETURN);
    endMethod(mv);
}

From source file:org.formulacompiler.compiler.internal.bytecode.FactoryCompiler.java

License:Open Source License

private void buildUserFactoryMethod() {
    final GeneratorAdapter mv = newMethod(this.userFactoryMethod.getName(),
            Type.getMethodDescriptor(this.userFactoryMethod));
    mv.newInstance(ByteCodeEngineCompiler.GEN_ROOT_CLASS);
    mv.dup();/*from  w w w  . ja v  a 2  s  .c om*/
    mv.loadArg(0);
    mv.loadThis();
    mv.getField(classType(), ByteCodeEngineCompiler.ENV_MEMBER_NAME, ByteCodeEngineCompiler.ENV_CLASS);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, ByteCodeEngineCompiler.GEN_ROOT_CLASS.getInternalName(), "<init>",
            "(" + this.userInputType.getDescriptor() + ByteCodeEngineCompiler.ENV_DESC + ")V");
    mv.visitInsn(Opcodes.ARETURN);
    endMethod(mv);
}

From source file:org.formulacompiler.compiler.internal.bytecode.SubSectionLazyGetterCompiler.java

License:Open Source License

@Override
protected void compileBody() throws CompilerException {
    final SubSectionCompiler sub = this.sub;
    final GeneratorAdapter mv = mv();

    // if (this.field == null) {
    final Label alreadySet = mv.newLabel();
    mv.loadThis();/*from  www .  j a  v  a 2  s. c  o m*/
    mv.getField(section().classType(), sub.getterName(), sub.arrayType());
    mv.ifNonNull(alreadySet);

    // ~ final DetailInput[] ds = this.inputs.getarray();
    final CallFrame inputCall = sub.model().getCallChainToCall();
    final Class inputContainerClass = inputCall.getMethod().getReturnType();
    final Type inputContainerType = Type.getType(inputContainerClass);
    final int l_ds = mv.newLocal(inputContainerType);
    compileInputGetterCall(inputCall);
    mv.storeLocal(l_ds);

    // ~ if (ds != null) {
    final Label isNull = mv.newLabel();
    mv.loadLocal(l_ds);
    mv.ifNull(isNull);

    final int l_di;
    if (inputContainerClass.isArray()) {
        l_di = compileInitFromArray(sub, mv, l_ds);
    } else if (Collection.class.isAssignableFrom(inputContainerClass)) {
        l_di = compileInitFromCollection(sub, mv, l_ds);
    } else if (Iterable.class.isAssignableFrom(inputContainerClass)) {
        final int l_it = mv.newLocal(ITERATOR_INTF);
        mv.loadLocal(l_ds);
        mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, ITERABLE_INTF.getInternalName(), "iterator",
                "()" + ITERATOR_INTF.getDescriptor());
        mv.storeLocal(l_it);
        l_di = compileInitFromIterator(sub, mv, l_it);
    } else if (Iterator.class.isAssignableFrom(inputContainerClass)) {
        l_di = compileInitFromIterator(sub, mv, l_ds);
    } else {
        throw new CompilerException.UnsupportedDataType("The return type of '" + inputCall.getMethod()
                + "' is not supported as input to a repeating section.");
    }

    // ~ ~ this.field = di;
    mv.loadThis();
    mv.loadLocal(l_di);
    mv.putField(section().classType(), sub.getterName(), sub.arrayType());

    // ~ } else {
    mv.goTo(alreadySet);
    mv.mark(isNull);

    // ~ ~ this.field = new DetailPrototype[ 0 ];
    mv.loadThis();
    mv.push(0);
    mv.newArray(sub.classType());
    mv.putField(section().classType(), sub.getterName(), sub.arrayType());

    // ~ }
    // }
    mv.mark(alreadySet);

    // return this.field;
    mv.loadThis();
    mv.getField(section().classType(), sub.getterName(), sub.arrayType());
    mv.visitInsn(Opcodes.ARETURN);
}

From source file:org.formulacompiler.compiler.internal.bytecode.SubSectionOutputAccessorCompiler.java

License:Open Source License

@SuppressWarnings("unchecked")
@Override/*from www.  j ava 2  s.co m*/
protected void compileBody() throws CompilerException {
    final SubSectionCompiler sub = this.sub;
    final GeneratorAdapter mv = mv();

    final CallFrame outputCall = this.callToImplement;
    final Class outputContainerClass = outputCall.getMethod().getReturnType();

    // get$Sect0()
    mv.loadThis();
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, section().classInternalName(), sub.getterName(),
            sub.getterDescriptor());

    if (outputContainerClass.isArray()) {
        mv.visitInsn(Opcodes.ARETURN);
    } else {
        // Detail[] arr = get$Sect0();
        final int l_arr = mv.newLocal(sub.arrayType());
        mv.storeLocal(l_arr);

        final int l_len = mv.newLocal(Type.INT_TYPE);
        mv.loadLocal(l_arr);
        mv.arrayLength();
        mv.storeLocal(l_len);

        // List lst = new ArrayList( arr.length );
        final int l_lst = mv.newLocal(ARRAYLIST_CLASS);
        mv.newInstance(ARRAYLIST_CLASS);
        mv.dup();
        mv.loadLocal(l_len);
        mv.visitMethodInsn(Opcodes.INVOKESPECIAL, ARRAYLIST_CLASS.getInternalName(), "<init>", "(I)V");
        mv.storeLocal(l_lst);

        // for (int i = 0; i < len; i++) {
        final int l_i = mv.newLocal(Type.INT_TYPE);
        mv.push(0);
        mv.storeLocal(l_i);
        final Label test = mv.newLabel();
        mv.goTo(test);
        final Label again = mv.mark();

        // lst.add( arr[ i ] );
        mv.loadLocal(l_lst);
        mv.loadLocal(l_arr);
        mv.loadLocal(l_i);
        mv.arrayLoad(sub.classType());
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, ARRAYLIST_CLASS.getInternalName(), "add",
                "(Ljava/lang/Object;)Z");
        mv.pop();

        // } // for
        mv.iinc(l_i, 1);
        mv.mark(test);
        mv.loadLocal(l_i);
        mv.loadLocal(l_len);
        mv.ifCmp(Type.INT_TYPE, mv.LT, again);

        mv.loadLocal(l_lst);
        if (outputContainerClass.isAssignableFrom(List.class)) {
            // return lst;
            mv.visitInsn(Opcodes.ARETURN);
        } else if (outputContainerClass.isAssignableFrom(Iterator.class)) {
            // return lst.iterator();
            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, ARRAYLIST_CLASS.getInternalName(), "iterator",
                    "()" + ITERATOR_INTF.getDescriptor());
            mv.visitInsn(Opcodes.ARETURN);
        } else {
            throw new CompilerException.UnsupportedDataType("The return type of '" + outputCall.getMethod()
                    + "' is not supported as input to a repeating section.");
        }
    }
}

From source file:org.glassfish.pfl.tf.spi.Util.java

License:Open Source License

public void storeFromXReturn(MethodVisitor mv, int returnOpcode, LocalVariableNode holder) {

    switch (returnOpcode) {
    case Opcodes.RETURN:
        // NOP/*w  ww.jav  a  2  s.  co  m*/
        break;
    case Opcodes.ARETURN:
        mv.visitVarInsn(Opcodes.ASTORE, holder.index);
        break;
    case Opcodes.IRETURN:
        mv.visitVarInsn(Opcodes.ISTORE, holder.index);
        break;
    case Opcodes.LRETURN:
        mv.visitVarInsn(Opcodes.LSTORE, holder.index);
        break;
    case Opcodes.FRETURN:
        mv.visitVarInsn(Opcodes.FSTORE, holder.index);
        break;
    case Opcodes.DRETURN:
        mv.visitVarInsn(Opcodes.DSTORE, holder.index);
        break;
    }
}

From source file:org.glassfish.pfl.tf.spi.Util.java

License:Open Source License

public void loadFromXReturn(MethodVisitor mv, int returnOpcode, LocalVariableNode holder) {

    switch (returnOpcode) {
    case Opcodes.RETURN:
        // NOP//from   w w w .ja  va 2 s .c  om
        break;
    case Opcodes.ARETURN:
        mv.visitVarInsn(Opcodes.ALOAD, holder.index);
        break;
    case Opcodes.IRETURN:
        mv.visitVarInsn(Opcodes.ILOAD, holder.index);
        break;
    case Opcodes.LRETURN:
        mv.visitVarInsn(Opcodes.LLOAD, holder.index);
        break;
    case Opcodes.FRETURN:
        mv.visitVarInsn(Opcodes.FLOAD, holder.index);
        break;
    case Opcodes.DRETURN:
        mv.visitVarInsn(Opcodes.DLOAD, holder.index);
        break;
    }
}

From source file:org.gradle.api.internal.model.DefaultObjectFactory.java

License:Apache License

private ClassGeneratingLoader loaderFor(Class<?> publicClass) {
    ///*from  w ww  .j a va  2s .  c o m*/
    // Generate implementation class
    //

    FormattingValidationProblemCollector problemCollector = new FormattingValidationProblemCollector(
            "Named implementation class", ModelType.of(publicClass));
    visitFields(publicClass, problemCollector);
    if (problemCollector.hasProblems()) {
        throw new GradleException(problemCollector.format());
    }

    AsmClassGenerator generator = new AsmClassGenerator(publicClass, "$Impl");
    Type implementationType = generator.getGeneratedType();
    ClassWriter visitor = generator.getVisitor();
    Type publicType = Type.getType(publicClass);

    Type superClass;
    String[] interfaces;
    if (publicClass.isInterface()) {
        superClass = OBJECT;
        interfaces = new String[] { publicType.getInternalName() };
    } else {
        superClass = publicType;
        interfaces = EMPTY_STRINGS;
    }

    visitor.visit(V1_5, ACC_PUBLIC | ACC_SYNTHETIC, implementationType.getInternalName(), null,
            superClass.getInternalName(), interfaces);

    //
    // Add name field
    //

    visitor.visitField(ACC_PRIVATE, NAME_FIELD, STRING.getDescriptor(), null, null);

    //
    // Add constructor
    //

    MethodVisitor methodVisitor = visitor.visitMethod(ACC_PUBLIC, CONSTRUCTOR_NAME, RETURN_VOID_FROM_STRING,
            null, EMPTY_STRINGS);
    methodVisitor.visitCode();
    // Call this.super()
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
    methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, superClass.getInternalName(), CONSTRUCTOR_NAME,
            RETURN_VOID, false);
    // Set this.name = param1
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 1);
    methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, implementationType.getInternalName(), NAME_FIELD,
            STRING.getDescriptor());
    // Done
    methodVisitor.visitInsn(Opcodes.RETURN);
    methodVisitor.visitMaxs(0, 0);
    methodVisitor.visitEnd();

    //
    // Add `getName()`
    //

    methodVisitor = visitor.visitMethod(ACC_PUBLIC, "getName", RETURN_STRING, null, EMPTY_STRINGS);
    methodVisitor.visitCode();
    // return this.name
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
    methodVisitor.visitFieldInsn(Opcodes.GETFIELD, implementationType.getInternalName(), NAME_FIELD,
            STRING.getDescriptor());
    methodVisitor.visitInsn(Opcodes.ARETURN);
    methodVisitor.visitMaxs(0, 0);
    methodVisitor.visitEnd();

    //
    // Add `toString()`
    //

    methodVisitor = visitor.visitMethod(ACC_PUBLIC, "toString", RETURN_STRING, null, EMPTY_STRINGS);
    methodVisitor.visitCode();
    // return this.name
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
    methodVisitor.visitFieldInsn(Opcodes.GETFIELD, implementationType.getInternalName(), NAME_FIELD,
            STRING.getDescriptor());
    methodVisitor.visitInsn(Opcodes.ARETURN);
    methodVisitor.visitMaxs(0, 0);
    methodVisitor.visitEnd();

    visitor.visitEnd();
    generator.define();

    //
    // Generate factory class
    //

    generator = new AsmClassGenerator(publicClass, "$Factory");
    visitor = generator.getVisitor();
    visitor.visit(V1_5, ACC_PUBLIC | ACC_SYNTHETIC, generator.getGeneratedType().getInternalName(), null,
            Type.getType(ClassGeneratingLoader.class).getInternalName(), EMPTY_STRINGS);

    //
    // Add constructor
    //

    methodVisitor = visitor.visitMethod(ACC_PUBLIC, CONSTRUCTOR_NAME, RETURN_VOID, null, EMPTY_STRINGS);
    methodVisitor.visitCode();
    // Call this.super()
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
    methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL,
            Type.getType(ClassGeneratingLoader.class).getInternalName(), CONSTRUCTOR_NAME, RETURN_VOID, false);
    // Done
    methodVisitor.visitInsn(Opcodes.RETURN);
    methodVisitor.visitMaxs(0, 0);
    methodVisitor.visitEnd();

    //
    // Add factory method
    //

    methodVisitor = visitor.visitMethod(ACC_PUBLIC, "load", Type.getMethodDescriptor(OBJECT, STRING), null,
            EMPTY_STRINGS);
    methodVisitor.visitCode();
    // Call return new <implClass>(param1)
    methodVisitor.visitTypeInsn(Opcodes.NEW, implementationType.getInternalName());
    methodVisitor.visitInsn(Opcodes.DUP);
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 1);
    methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, implementationType.getInternalName(), CONSTRUCTOR_NAME,
            RETURN_VOID_FROM_STRING, false);
    methodVisitor.visitInsn(Opcodes.ARETURN);
    methodVisitor.visitMaxs(0, 0);
    methodVisitor.visitEnd();

    visitor.visitEnd();
    Class<Object> factoryClass = generator.define();
    try {
        return (ClassGeneratingLoader) (factoryClass.newInstance());
    } catch (Exception e) {
        throw UncheckedException.throwAsUncheckedException(e);
    }
}