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     */
013    package org.jikesrvm.adaptive.util;
014    
015    import org.jikesrvm.classloader.MethodReference;
016    
017    /**
018     * A unresolved call site is a pair: {@code <MethodReference, bcIndex>}.
019     */
020    public final class UnResolvedCallSite {
021    
022      /**
023       * Caller method
024       */
025      private final MethodReference methodRef;
026    
027      /**
028       * bytecode index of callsite in caller method
029       */
030      private final int bcIndex;
031    
032      /**
033       * @param m the MethodReference containing the callsite
034       * @param bci the bytecode index of the callsite within m
035       */
036      public UnResolvedCallSite(MethodReference m, int bci) {
037        if (org.jikesrvm.VM.VerifyAssertions) org.jikesrvm.VM._assert(m != null);
038        methodRef = m;
039        bcIndex = bci;
040      }
041    
042      /**
043       * @return method containing the callsite
044       */
045      public MethodReference getMethodRef() { return methodRef; }
046    
047      /**
048       * @return call site's bytecode index in its method
049       */
050      public int getBytecodeIndex() {return bcIndex;}
051    
052      /**
053       * @return string representation of call site
054       */
055      @Override
056      public String toString() {
057        return "<" + methodRef + ", " + bcIndex + ">";
058      }
059    
060      /**
061       * Determine if two call sites are the same.  Exact match: no wild cards.
062       *
063       * @param obj call site to compare to
064       * @return {@code true} if call sites are the same; otherwise, return {@code fales}
065       */
066      @Override
067      public boolean equals(Object obj) {
068        if (obj instanceof UnResolvedCallSite) {
069          UnResolvedCallSite cs = (UnResolvedCallSite) obj;
070          return methodRef.equals(cs.methodRef) && bcIndex == cs.bcIndex;
071        } else {
072          return false;
073        }
074      }
075    
076      /**
077       * @return hash code
078       */
079      @Override
080      public int hashCode() {
081        return bcIndex + methodRef.hashCode();
082      }
083    }