Skip to content

Commit 97e1657

Browse files
author
Tom Rodriguez
committed
8261846: [JVMCI] c2v_iterateFrames can get out of sync with the StackFrameStream
Reviewed-by: kvn
1 parent b8fd614 commit 97e1657

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,7 +1230,7 @@ C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, job
12301230
jobjectArray methods = initial_methods;
12311231

12321232
int frame_number = 0;
1233-
vframe* vf = vframe::new_vframe(fst.current(), fst.register_map(), thread);
1233+
vframe* vf = vframe::new_vframe(fst, thread);
12341234

12351235
while (true) {
12361236
// look for the given method
@@ -1340,7 +1340,7 @@ C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, job
13401340
if (fst.current()->sp() != stack_pointer) {
13411341
THROW_MSG_NULL(vmSymbols::java_lang_IllegalStateException(), "stack frame not found after deopt")
13421342
}
1343-
vf = vframe::new_vframe(fst.current(), fst.register_map(), thread);
1343+
vf = vframe::new_vframe(fst, thread);
13441344
if (!vf->is_compiled_frame()) {
13451345
THROW_MSG_NULL(vmSymbols::java_lang_IllegalStateException(), "compiled stack frame expected")
13461346
}
@@ -1367,7 +1367,7 @@ C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, job
13671367
break;
13681368
}
13691369
fst.next();
1370-
vf = vframe::new_vframe(fst.current(), fst.register_map(), thread);
1370+
vf = vframe::new_vframe(fst, thread);
13711371
frame_number = 0;
13721372
} // end of frame loop
13731373

src/hotspot/share/runtime/vframe.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ vframe::vframe(const frame* fr, JavaThread* thread)
6363
_fr = *fr;
6464
}
6565

66+
vframe* vframe::new_vframe(StackFrameStream& fst, JavaThread* thread) {
67+
if (fst.current()->is_runtime_frame()) {
68+
fst.next();
69+
}
70+
guarantee(!fst.is_done(), "missing caller");
71+
return new_vframe(fst.current(), fst.register_map(), thread);
72+
}
73+
6674
vframe* vframe::new_vframe(const frame* f, const RegisterMap* reg_map, JavaThread* thread) {
6775
// Interpreter frame
6876
if (f->is_interpreted_frame()) {

src/hotspot/share/runtime/vframe.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -60,8 +60,9 @@ class vframe: public ResourceObj {
6060
vframe(const frame* fr, const RegisterMap* reg_map, JavaThread* thread);
6161
vframe(const frame* fr, JavaThread* thread);
6262
public:
63-
// Factory method for creating vframes
63+
// Factory methods for creating vframes
6464
static vframe* new_vframe(const frame* f, const RegisterMap *reg_map, JavaThread* thread);
65+
static vframe* new_vframe(StackFrameStream& fst, JavaThread* thread);
6566

6667
// Accessors
6768
frame fr() const { return _fr; }

0 commit comments

Comments
 (0)