On Wed, 22 Jun 2022 21:23:28 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:

>> src/hotspot/share/prims/jvmtiImpl.cpp line 647:
>> 
>>> 645:   }
>>> 646:   if (_set) {
>>> 647:     if (fr.is_heap_frame()) { // we want this check after the check 
>>> for JVMTI_ERROR_INVALID_SLOT
>> 
>> It would be good to elaborate a bit more on this check. Say something about 
>> it being a "safepoint poll on return in the oldest thawed frame", and why 
>> that is a problem.
>
> Okay. I'd suggest this:
> 
>   if (_set) {
>     if (fr.is_heap_frame()) { // we want this check after the check for 
> JVMTI_ERROR_INVALID_SLOT
>       assert(Continuation::is_frame_in_continuation(_jvf->thread(), fr), 
> "sanity check");
>       // The topmost frame of a mounted continuation can still be in the 
> heap. This code is executed at safepoint.
>       // The safepoint could be as we return to the return barrier but before 
> we execute it (poll return).
>       _result = JVMTI_ERROR_OPAQUE_FRAME; // deferred locals currently 
> unsupported in continuations
>       return;
>     }
> 
> Is it more clear?

I guess what I'm not understanding here is how/why "fr.is_heap_frame())" 
translates into "we are not single stepping or at a breakpoint". I know we 
already did the check earlier to make sure we are "depth == 0", and I 
understand that in this code we are handling the special case of "depth == 0" 
possibly not indicating we are truly in the topmost frame. From Ron's 
explanation, the frame has been popped, but the callee frame has not been 
thawed yet. Is the "fr.is_heap_frame())" check telling us the frame hasn't been 
thawed. If so, I would call this out in the comment. Basically say something 
like:

"If the topmost frame is a heap frame, then it hasn't been thawed. This can 
happen if we are executing at a return barrier safepoint. The callee frame has 
been popped, but the caller frame has not been thawed. We can't support a 
setlocal in the callee frame at this point, because we aren't truly in the 
callee yet."

Also, I think the following comment is misleading:

`deferred locals currently unsupported in continuations`

That's not true. They are supported when single stepping and at breakpoints, or 
more accurately, in the topmost frame. Looks like this is copy-n-paste from the 
following code with the same issue:


 613   if (_set && _depth != 0 && 
Continuation::is_frame_in_continuation(_jvf->thread(), fr)) {
 614     _result = JVMTI_ERROR_OPAQUE_FRAME; // deferred locals currently 
unsupported in continuations
 615     return;
 616   }

-------------

PR: https://git.openjdk.org/jdk19/pull/42

Reply via email to