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  */
18 package org.apache.bcel.generic;
19 
20 import org.apache.bcel.Const;
21 
22 /**
23  * Super class for the family of arithmetic instructions.
24  *
25  * @version $Id$
26  */
27 public abstract class ArithmeticInstruction extends Instruction implements TypedInstruction,
28         StackProducer, StackConsumer {
29 
30     /**
31      * Empty constructor needed for Instruction.readInstruction.
32      * Not to be used otherwise.
33      */
ArithmeticInstruction()34     ArithmeticInstruction() {
35     }
36 
37 
38     /**
39      * @param opcode of instruction
40      */
ArithmeticInstruction(final short opcode)41     protected ArithmeticInstruction(final short opcode) {
42         super(opcode, (short) 1);
43     }
44 
45 
46     /** @return type associated with the instruction
47      */
48     @Override
getType( final ConstantPoolGen cp )49     public Type getType( final ConstantPoolGen cp ) {
50         final short _opcode = super.getOpcode();
51         switch (_opcode) {
52             case Const.DADD:
53             case Const.DDIV:
54             case Const.DMUL:
55             case Const.DNEG:
56             case Const.DREM:
57             case Const.DSUB:
58                 return Type.DOUBLE;
59             case Const.FADD:
60             case Const.FDIV:
61             case Const.FMUL:
62             case Const.FNEG:
63             case Const.FREM:
64             case Const.FSUB:
65                 return Type.FLOAT;
66             case Const.IADD:
67             case Const.IAND:
68             case Const.IDIV:
69             case Const.IMUL:
70             case Const.INEG:
71             case Const.IOR:
72             case Const.IREM:
73             case Const.ISHL:
74             case Const.ISHR:
75             case Const.ISUB:
76             case Const.IUSHR:
77             case Const.IXOR:
78                 return Type.INT;
79             case Const.LADD:
80             case Const.LAND:
81             case Const.LDIV:
82             case Const.LMUL:
83             case Const.LNEG:
84             case Const.LOR:
85             case Const.LREM:
86             case Const.LSHL:
87             case Const.LSHR:
88             case Const.LSUB:
89             case Const.LUSHR:
90             case Const.LXOR:
91                 return Type.LONG;
92             default: // Never reached
93                 throw new ClassGenException("Unknown type " + _opcode);
94         }
95     }
96 }
97