/* * 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.VM; import org.jikesrvm.adaptive.VM_AosEntrypoints; import org.jikesrvm.classloader.VM_Method; import org.jikesrvm.classloader.VM_TypeReference; /** * Special invokestatic, with only two possible target * OSR_ObjectHolder.getRefAt and OSR_ObjectHolder.cleanRefs * indiced by GETREFAT and CLEANREFS. */ public class BC_InvokeStatic extends OSR_PseudoBytecode { private static final int bsize = 6; private final int tid; // target INDEX public BC_InvokeStatic(int targetId) { this.tid = targetId; } public byte[] getBytes() { byte[] codes = initBytes(bsize, PSEUDO_InvokeStatic); int2bytes(codes, 2, tid); return codes; } public int getSize() { return bsize; } public int stackChanges() { VM_Method callee = null; switch (tid) { case GETREFAT: callee = VM_AosEntrypoints.osrGetRefAtMethod; break; case CLEANREFS: callee = VM_AosEntrypoints.osrCleanRefsMethod; break; default: if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); break; } int psize = callee.getParameterWords(); int schanges = -psize; 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() { return "InvokeStatic " + tid; } }