1 /*
   2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
   3  */
   4 /*
   5  * Licensed to the Apache Software Foundation (ASF) under one or more
   6  * contributor license agreements.  See the NOTICE file distributed with
   7  * this work for additional information regarding copyright ownership.
   8  * The ASF licenses this file to You under the Apache License, Version 2.0
   9  * (the "License"); you may not use this file except in compliance with
  10  * the License.  You may obtain a copy of the License at
  11  *
  12  *      http://www.apache.org/licenses/LICENSE-2.0
  13  *
  14  * Unless required by applicable law or agreed to in writing, software
  15  * distributed under the License is distributed on an "AS IS" BASIS,
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17  * See the License for the specific language governing permissions and
  18  * limitations under the License.
  19  */
  20 package com.sun.org.apache.bcel.internal.generic;
  21 
  22 /**
  23  * ICONST - Push value between -1, ..., 5, other values cause an exception
  24  *
  25  * <PRE>Stack: ... -&gt; ..., </PRE>
  26  *
  27  * @version $Id: ICONST.java 1747278 2016-06-07 17:28:43Z britter $
  28  */
  29 public class ICONST extends Instruction implements ConstantPushInstruction {
  30 
  31     private int value;
  32 
  33     /**
  34      * Empty constructor needed for the Class.newInstance() statement in
  35      * Instruction.readInstruction(). Not to be used otherwise.
  36      */
  37     ICONST() {
  38     }
  39 
  40     public ICONST(final int i) {
  41         super(com.sun.org.apache.bcel.internal.Const.ICONST_0, (short) 1);
  42         if ((i >= -1) && (i <= 5)) {
  43             super.setOpcode((short) (com.sun.org.apache.bcel.internal.Const.ICONST_0 + i)); // Even works for i == -1
  44         } else {
  45             throw new ClassGenException("ICONST can be used only for value between -1 and 5: " + i);
  46         }
  47         value = i;
  48     }
  49 
  50     @Override
  51     public Number getValue() {
  52         return Integer.valueOf(value);
  53     }
  54 
  55     /**
  56      * @return Type.INT
  57      */
  58     @Override
  59     public Type getType(final ConstantPoolGen cp) {
  60         return Type.INT;
  61     }
  62 
  63     /**
  64      * Call corresponding visitor method(s). The order is: Call visitor methods
  65      * of implemented interfaces first, then call methods according to the class
  66      * hierarchy in descending order, i.e., the most specific visitXXX() call
  67      * comes last.
  68      *
  69      * @param v Visitor object
  70      */
  71     @Override
  72     public void accept(final Visitor v) {
  73         v.visitPushInstruction(this);
  74         v.visitStackProducer(this);
  75         v.visitTypedInstruction(this);
  76         v.visitConstantPushInstruction(this);
  77         v.visitICONST(this);
  78     }
  79 }