1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.bcel.generic;
18
19 import org.apache.bcel.Const;
20 import org.apache.bcel.ExceptionConst;
21
22 /**
23 * Super class for the xRETURN family of instructions.
24 */
25 public abstract class ReturnInstruction extends Instruction implements ExceptionThrower, TypedInstruction, StackConsumer {
26
27 /**
28 * Empty constructor needed for Instruction.readInstruction. Not to be used otherwise.
29 */
30 ReturnInstruction() {
31 }
32
33 /**
34 * @param opcode of instruction
35 */
36 protected ReturnInstruction(final short opcode) {
37 super(opcode, (short) 1);
38 }
39
40 @Override
41 public Class<?>[] getExceptions() {
42 return new Class[] {ExceptionConst.ILLEGAL_MONITOR_STATE};
43 }
44
45 public Type getType() {
46 final short opcode = super.getOpcode();
47 switch (opcode) {
48 case Const.IRETURN:
49 return Type.INT;
50 case Const.LRETURN:
51 return Type.LONG;
52 case Const.FRETURN:
53 return Type.FLOAT;
54 case Const.DRETURN:
55 return Type.DOUBLE;
56 case Const.ARETURN:
57 return Type.OBJECT;
58 case Const.RETURN:
59 return Type.VOID;
60 default: // Never reached
61 throw new ClassGenException("Unknown type " + opcode);
62 }
63 }
64
65 /**
66 * @return type associated with the instruction
67 */
68 @Override
69 public Type getType(final ConstantPoolGen cp) {
70 return getType();
71 }
72 }