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}