blob: ee36450d1ce56798f8714a72a313aeb34f049662 [file] [log] [blame]
/*
* 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;
}
}