/*
* 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.osr.bytecodes;
import static org.jikesrvm.classloader.ClassLoaderConstants.DoubleTypeCode;
import static org.jikesrvm.classloader.ClassLoaderConstants.LongTypeCode;
import static org.jikesrvm.classloader.ClassLoaderConstants.VoidTypeCode;
import static org.jikesrvm.osr.OSRConstants.PSEUDO_InvokeCompiledMethod;
import org.jikesrvm.classloader.RVMMethod;
import org.jikesrvm.classloader.TypeReference;
import org.jikesrvm.compilers.common.CompiledMethod;
import org.jikesrvm.compilers.common.CompiledMethods;
/**
* invoke a compiled method
*/
public class InvokeCompiledMethod extends PseudoBytecode {
private static int bsize = 10;
private final int cmid;
// the bc index of referred call site
private final int origIdx;
public InvokeCompiledMethod(int cmethId, int origBCIndex) {
this.cmid = cmethId;
this.origIdx = origBCIndex;
}
@Override
public byte[] getBytes() {
byte[] codes = initBytes(bsize, PSEUDO_InvokeCompiledMethod);
int2bytes(codes, 2, cmid);
int2bytes(codes, 6, origIdx);
return codes;
}
@Override
public int getSize() {
return bsize;
}
@Override
public int stackChanges() {
CompiledMethod cm = CompiledMethods.getCompiledMethod(cmid);
RVMMethod callee = cm.getMethod();
int psize = callee.getParameterWords();
int schanges = -psize;
// pop receiver
if (!callee.isStatic()) {
schanges--;
}
TypeReference rtype = callee.getReturnType();
byte tcode = rtype.getName().parseForTypeCode();
if (tcode == VoidTypeCode) {
// do nothing
} else {
if ((tcode == LongTypeCode) || (tcode == DoubleTypeCode)) {
schanges++;
}
schanges++;
}
return schanges;
}
@Override
public String toString() {
//CompiledMethod cm = CompiledMethods.getCompiledMethod(cmid);
return "InvokeCompiledMethod (0x" + Integer.toHexString(cmid) + ") " + "@" + origIdx;
}
}