/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Common Public License (CPL); * 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/cpl1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.jikesrvm.osr; import org.jikesrvm.classloader.VM_Method; import org.jikesrvm.classloader.VM_TypeReference; import org.jikesrvm.compilers.common.VM_CompiledMethod; import org.jikesrvm.compilers.common.VM_CompiledMethods; /** * invoke a compiled method */ public class BC_InvokeCompiledMethod extends OSR_PseudoBytecode { private static int bsize = 10; private int cmid; // the bc index of referred call site private int origIdx; public BC_InvokeCompiledMethod(int cmethId, int origBCIndex) { this.cmid = cmethId; this.origIdx = origBCIndex; } public byte[] getBytes() { byte[] codes = initBytes(bsize, PSEUDO_InvokeCompiledMethod); int2bytes(codes, 2, cmid); int2bytes(codes, 6, origIdx); return codes; } public int getSize() { return bsize; } public int stackChanges() { VM_CompiledMethod cm = VM_CompiledMethods.getCompiledMethod(cmid); VM_Method callee = cm.getMethod(); int psize = callee.getParameterWords(); int schanges = -psize; // pop receiver if (!callee.isStatic()) { schanges--; } VM_TypeReference rtype = callee.getReturnType(); byte tcode = rtype.getName().parseForTypeCode(); if (tcode == VoidTypeCode) { // do nothing } else { if ((tcode == LongTypeCode) || (tcode == DoubleTypeCode)) { schanges++; } schanges++; } return schanges; } public String toString() { //VM_CompiledMethod cm = VM_CompiledMethods.getCompiledMethod(cmid); return "InvokeCompiledMethod (0x" + Integer.toHexString(cmid) + ") " + "@" + origIdx; } }