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