/*
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.runtime;
import java.util.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.interpreter.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.utilities.*;
public class InterpretedVFrame extends JavaVFrame {
JVM state /** JVM state */
public Method getMethod() {
return getFrame().getInterpreterFrameMethod();
}
public StackValueCollection getLocals() {
Method m = getMethod();
int length = (int) m.getMaxLocals();
if (m.isNative()) {
// If the method is native, getMaxLocals is not telling the truth.
// maxlocals then equals the size of parameters
length = (int) m.getSizeOfParameters();
}
StackValueCollection result = new StackValueCollection(length);
// Get oopmap describing oops and int for current bci
OopMapCacheEntry oopMask = getMethod().getMaskFor(getBCI());
// handle locals
for(int i = 0; i < length; i++) {
// Find stack location
Address addr = addressOfLocalAt(i);
// Depending on oop/int put it in the right package
StackValue sv;
if (oopMask.isOop(i)) {
// oop value
sv = new StackValue(addr.getOopHandleAt(0), 0);
} else {
// integer
// Fetch a signed integer the size of a stack slot
sv = new StackValue(addr.getCIntegerAt(0, VM.getVM().getAddressSize(), false));
}
result.add(sv);
}
return result;
}
public StackValueCollection getExpressions() {
int length = getFrame().getInterpreterFrameExpressionStackSize();
if (getMethod().isNative()) {
// If the method is native, there is no expression stack
length = 0;
}
int nofLocals = (int) getMethod().getMaxLocals();
StackValueCollection result = new StackValueCollection(length);
// Get oopmap describing oops and int for current bci
OopMapCacheEntry oopMask = getMethod().getMaskFor(getBCI());
for(int i = 0; i < length; i++) {
// Find stack location
Address addr = addressOfExpressionStackAt(i);
// Depending on oop/int put it in the right package
StackValue sv;
if (oopMask.isOop(i + nofLocals)) {
// oop value
sv = new StackValue(addr.getOopHandleAt(0), 0);
} else {
// integer
// Fetch a signed integer the size of a stack slot
sv = new StackValue(addr.getCIntegerAt(0, VM.getVM().getAddressSize(), false));
}
result.add(sv);
}
return result;
}
Returns List /** Returns List<MonitorInfo> */
public List<MonitorInfo> getMonitors() {
List<MonitorInfo> result = new ArrayList<>(5);
for (BasicObjectLock current = getFrame().interpreterFrameMonitorEnd();
current.address().lessThan(getFrame().interpreterFrameMonitorBegin().address());
current = getFrame().nextMonitorInInterpreterFrame(current)) {
result.add(new MonitorInfo(current.obj(), current.lock(), false, false));
}
return result;
}
Test operation /** Test operation */
public boolean isInterpretedFrame() { return true; }
Package-internal constructor /** Package-internal constructor */
InterpretedVFrame(Frame fr, RegisterMap regMap, JavaThread thread) {
super(fr, regMap, thread);
}
Accessor for Byte Code Index (NOTE: access to BCP is not allowed
in this system; see Frame.java) /** Accessor for Byte Code Index (NOTE: access to BCP is not allowed
in this system; see Frame.java) */
public int getBCI() {
return getFrame().getInterpreterFrameBCI();
}
Setter for Byte Code Index /** Setter for Byte Code Index */
// FIXME: not yet implementable
// public void setBCI(int bci) {
// getFrame().setInterpreterFrameBCI(bci);
// }
public void verify() {
}
//--------------------------------------------------------------------------------
// Internals only below this point
//
private Address addressOfLocalAt(int index) {
if (Assert.ASSERTS_ENABLED) {
Assert.that(getFrame().isInterpretedFrame(), "frame should be an interpreted frame");
}
return fr.addressOfInterpreterFrameLocal(index);
}
private Address addressOfExpressionStackAt(int index) {
return fr.addressOfInterpreterFrameExpressionStackSlot(index);
}
}