/*
 * Copyright 2014 - 2020 Rafael Winterhalter
 *
 * 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 net.bytebuddy.implementation.bytecode.member;

import net.bytebuddy.description.type.TypeDefinition;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.implementation.bytecode.StackManipulation;
import net.bytebuddy.implementation.bytecode.StackSize;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

A stack manipulation returning a value of a given type.
/** * A stack manipulation returning a value of a given type. */
public enum MethodReturn implements StackManipulation {
The method return handler for returning a JVM-integer.
/** * The method return handler for returning a JVM-integer. */
INTEGER(Opcodes.IRETURN, StackSize.SINGLE),
The method return handler for returning a double.
/** * The method return handler for returning a {@code double}. */
DOUBLE(Opcodes.DRETURN, StackSize.DOUBLE),
The method return handler for returning a float.
/** * The method return handler for returning a {@code float}. */
FLOAT(Opcodes.FRETURN, StackSize.SINGLE),
The method return handler for returning a long.
/** * The method return handler for returning a {@code long}. */
LONG(Opcodes.LRETURN, StackSize.DOUBLE),
The method return handler for returning void.
/** * The method return handler for returning {@code void}. */
VOID(Opcodes.RETURN, StackSize.ZERO),
The method return handler for returning a reference type.
/** * The method return handler for returning a reference type. */
REFERENCE(Opcodes.ARETURN, StackSize.SINGLE);
The opcode of this operation.
/** * The opcode of this operation. */
private final int returnOpcode;
The operand stack size change that is implied by this operation.
/** * The operand stack size change that is implied by this operation. */
private final Size size;
Creates a new method return manipulation.
Params:
  • returnOpcode – The opcode of this operation.
  • stackSize – The operand stack size change that is implied by this operation.
/** * Creates a new method return manipulation. * * @param returnOpcode The opcode of this operation. * @param stackSize The operand stack size change that is implied by this operation. */
MethodReturn(int returnOpcode, StackSize stackSize) { this.returnOpcode = returnOpcode; size = stackSize.toDecreasingSize(); }
Returns a method return corresponding to a given type.
Params:
  • typeDefinition – The type to be returned.
Returns:The stack manipulation representing the method return.
/** * Returns a method return corresponding to a given type. * * @param typeDefinition The type to be returned. * @return The stack manipulation representing the method return. */
public static StackManipulation of(TypeDefinition typeDefinition) { if (typeDefinition.isPrimitive()) { if (typeDefinition.represents(long.class)) { return LONG; } else if (typeDefinition.represents(double.class)) { return DOUBLE; } else if (typeDefinition.represents(float.class)) { return FLOAT; } else if (typeDefinition.represents(void.class)) { return VOID; } else { return INTEGER; } } else { return REFERENCE; } }
{@inheritDoc}
/** * {@inheritDoc} */
public boolean isValid() { return true; }
{@inheritDoc}
/** * {@inheritDoc} */
public Size apply(MethodVisitor methodVisitor, Implementation.Context implementationContext) { methodVisitor.visitInsn(returnOpcode); return size; } }