001/* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013package org.jikesrvm.adaptive.database.callgraph; 014 015import org.jikesrvm.classloader.RVMMethod; 016 017/** 018 * A call site is a pair: <RVMMethod, bcIndex> 019 */ 020public final class CallSite { 021 022 /** 023 * Caller method 024 */ 025 private final RVMMethod method; 026 027 /** 028 * bytecode index of callsite in caller method 029 */ 030 private final int bcIndex; 031 032 /** 033 * @param m the RVMMethod containing the callsite 034 * @param bci the bytecode index of the callsite within m 035 */ 036 public CallSite(RVMMethod m, int bci) { 037 if (org.jikesrvm.VM.VerifyAssertions) org.jikesrvm.VM._assert(m != null); 038 method = m; 039 bcIndex = bci; 040 } 041 042 /** 043 * @return method containing the callsite 044 */ 045 public RVMMethod getMethod() { 046 return method; 047 } 048 049 /** 050 * @return call site's bytecode index in its method 051 */ 052 public int getBytecodeIndex() { 053 return bcIndex; 054 } 055 056 /** 057 * @return string representation of call site 058 */ 059 @Override 060 public String toString() { 061 return "<" + method + ", " + bcIndex + ">"; 062 } 063 064 /** 065 * Determine if two call sites are the same. Exact match: no wild cards. 066 * 067 * @param obj call site to compare to 068 * @return {@code true} if call sites are the same; otherwise, 069 * return {@code false} 070 */ 071 @Override 072 public boolean equals(Object obj) { 073 if (obj instanceof CallSite) { 074 CallSite cs = (CallSite) obj; 075 return method.equals(cs.method) && bcIndex == cs.bcIndex; 076 } else { 077 return false; 078 } 079 } 080 081 /** 082 * @return hash code 083 */ 084 @Override 085 public int hashCode() { 086 return bcIndex + method.hashCode(); 087 } 088}