/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. You * may obtain a copy of the License at * * http://www.opensource.org/licenses/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.jikesrvm.compilers.opt.ir.operand; import java.util.Arrays; import org.jikesrvm.classloader.MemberReference; /* * An InlinedOsrTypeInfoOperand object keeps necessary information * to recover non-inlined status for an inlined method. */ public final class InlinedOsrTypeInfoOperand extends Operand { //////////////////////////////////////////// // DATA Type // //////////////////////////////////////////// /* the type info is organized by calling sequences, e.g., * a calls b calls c, then the type information is * methodids: a_ids, b_ids, c_ids * bcindexes: a_pc, b_pc, c_pc * localsize: a_lsize, b_lsize, c_lsize * stacksize: a_ssize, b_sszie, c_sszie * localTypeCodes |-- a_lsize --|-- b_lsize --|-- c_lsize --| * stackTypeCodes |-- a_ssize --|-- b_ssize --|-- c_ssize --| */ public int[] methodids; public int[] bcindexes; public byte[][] localTypeCodes; public byte[][] stackTypeCodes; public int validOps; /* operands of OsrPoint is laid out as following: | locals 1 | stacks 1 | locals 2 | stacks 2 | .... */ public InlinedOsrTypeInfoOperand(int[] mids, int[] cpcs, byte[][] ltypes, byte[][] stypes) { this.methodids = mids; this.bcindexes = cpcs; this.localTypeCodes = ltypes; this.stackTypeCodes = stypes; } /** * Return a new operand that is semantically equivalent to <code>this</code>. * * @return a copy of <code>this</code> */ public Operand copy() { return new InlinedOsrTypeInfoOperand(methodids, bcindexes, localTypeCodes, stackTypeCodes); } /** * Are two operands semantically equivalent? * * @param op other operand * @return <code>true</code> if <code>this</code> and <code>op</code> * are semantically equivalent or <code>false</code> * if they are not. */ public boolean similar(Operand op) { boolean result = true; if (!(op instanceof InlinedOsrTypeInfoOperand)) { return false; } InlinedOsrTypeInfoOperand other = (InlinedOsrTypeInfoOperand) op; result = Arrays.equals(this.methodids, other.methodids) && Arrays.equals(this.bcindexes, other.bcindexes) && Arrays.equals(this.localTypeCodes, other.localTypeCodes) && Arrays.equals(this.stackTypeCodes, other.stackTypeCodes); return result; } /** * Returns the string representation of this operand. * * @return a string representation of this operand. */ public String toString() { StringBuffer buf = new StringBuffer("("); for (int i = 0, n = methodids.length; i < n; i++) { buf.append(bcindexes[i]).append("@").append(MemberReference.getMemberRef(methodids[i]).getName()).append(" : "); for (int j = 0, m = localTypeCodes[i].length; j < m; j++) { buf.append((char) localTypeCodes[i][j]); } buf.append(","); for (int j = 0, m = stackTypeCodes[i].length; j < m; j++) { buf.append((char) stackTypeCodes[i][j]); } if (i != n - 1) { buf.append(" | "); } } buf.append(")"); return new String(buf); } }