| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.dx.cf.code; |
| |
| import com.android.dx.rop.type.Type; |
| import com.android.dx.rop.type.TypeBearer; |
| import com.android.dx.util.Hex; |
| |
| /** |
| * Representation of a subroutine return address. In Java verification, |
| * somewhat counterintuitively, the salient bit of information you need to |
| * know about a return address is the <i>start address</i> of the subroutine |
| * being returned from, not the address being returned <i>to</i>, so that's |
| * what instances of this class hang onto. |
| */ |
| public final class ReturnAddress implements TypeBearer { |
| /** {@code >= 0;} the start address of the subroutine being returned from */ |
| private final int subroutineAddress; |
| |
| /** |
| * Constructs an instance. |
| * |
| * @param subroutineAddress {@code >= 0;} the start address of the |
| * subroutine being returned from |
| */ |
| public ReturnAddress(int subroutineAddress) { |
| if (subroutineAddress < 0) { |
| throw new IllegalArgumentException("subroutineAddress < 0"); |
| } |
| |
| this.subroutineAddress = subroutineAddress; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public String toString() { |
| return ("<addr:" + Hex.u2(subroutineAddress) + ">"); |
| } |
| |
| /** {@inheritDoc} */ |
| public String toHuman() { |
| return toString(); |
| } |
| |
| /** {@inheritDoc} */ |
| public Type getType() { |
| return Type.RETURN_ADDRESS; |
| } |
| |
| /** {@inheritDoc} */ |
| public TypeBearer getFrameType() { |
| return this; |
| } |
| |
| /** {@inheritDoc} */ |
| public int getBasicType() { |
| return Type.RETURN_ADDRESS.getBasicType(); |
| } |
| |
| /** {@inheritDoc} */ |
| public int getBasicFrameType() { |
| return Type.RETURN_ADDRESS.getBasicFrameType(); |
| } |
| |
| /** {@inheritDoc} */ |
| public boolean isConstant() { |
| return false; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public boolean equals(Object other) { |
| if (!(other instanceof ReturnAddress)) { |
| return false; |
| } |
| |
| return subroutineAddress == ((ReturnAddress) other).subroutineAddress; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public int hashCode() { |
| return subroutineAddress; |
| } |
| |
| /** |
| * Gets the subroutine address. |
| * |
| * @return {@code >= 0;} the subroutine address |
| */ |
| public int getSubroutineAddress() { |
| return subroutineAddress; |
| } |
| } |