1 /*
   2  * reserved comment block
   3  * DO NOT REMOVE OR ALTER!
   4  */
   5 /*
   6  * Licensed to the Apache Software Foundation (ASF) under one or more
   7  * contributor license agreements.  See the NOTICE file distributed with
   8  * this work for additional information regarding copyright ownership.
   9  * The ASF licenses this file to You under the Apache License, Version 2.0
  10  * (the "License"); you may not use this file except in compliance with
  11  * the License.  You may obtain a copy of the License at
  12  *
  13  *      http://www.apache.org/licenses/LICENSE-2.0
  14  *
  15  * Unless required by applicable law or agreed to in writing, software
  16  * distributed under the License is distributed on an "AS IS" BASIS,
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18  * See the License for the specific language governing permissions and
  19  * limitations under the License.
  20  */
  21 
  22 package com.sun.org.apache.bcel.internal.generic;
  23 
  24 import com.sun.org.apache.bcel.internal.Constants;
  25 import java.util.Objects;
  26 
  27 /**
  28  * Returnaddress, the type JSR or JSR_W instructions push upon the stack.
  29  *
  30  * see vmspec2 3.3.3
  31  * @author  <A HREF="http://www.inf.fu-berlin.de/~ehaase">Enver Haase</A>
  32  */
  33 public class ReturnaddressType extends Type {
  34 
  35   public static final ReturnaddressType NO_TARGET = new ReturnaddressType();
  36   private InstructionHandle returnTarget;
  37 
  38   /**
  39    * A Returnaddress [that doesn't know where to return to].
  40    */
  41   private ReturnaddressType(){
  42     super(Constants.T_ADDRESS, "<return address>");
  43   }
  44 
  45   /**
  46    * Creates a ReturnaddressType object with a target.
  47    */
  48   public ReturnaddressType(InstructionHandle returnTarget) {
  49     super(Constants.T_ADDRESS, "<return address targeting "+returnTarget+">");
  50         this.returnTarget = returnTarget;
  51   }
  52 
  53   @Override
  54   public int hashCode() {
  55       return Objects.hashCode(this.returnTarget);
  56   }
  57 
  58   /**
  59    * Returns if the two Returnaddresses refer to the same target.
  60    */
  61   @Override
  62   public boolean equals(Object rat){
  63     if(!(rat instanceof ReturnaddressType))
  64       return false;
  65 
  66     return ((ReturnaddressType)rat).returnTarget.equals(this.returnTarget);
  67   }
  68 
  69   /**
  70    * @return the target of this ReturnaddressType
  71    */
  72   public InstructionHandle getTarget(){
  73     return returnTarget;
  74   }
  75 }