RFR: 8376185: NoSuchFieldError thrown after a record with type annotation retransformed [v2]

Jean-Philippe Bempel jpbempel at openjdk.org
Thu Feb 5 14:41:43 UTC 2026


On Thu, 5 Feb 2026 11:15:04 GMT, Johan Sjölen <jsjolen at openjdk.org> wrote:

>> Hi @jpbempel, I couldn't see the equivalent form in `c_a_n_c_v` (returning early when there may be a pending exception).
>> 
>>> if merge_cp_and_rewrite returns anything else than JVMTI_ERROR_NONE it should be propagated.
>> 
>> Yeah, but you've got a `THREAD` call into a method taking `TRAPS` as an argument. A method taking `TRAPS` can be seen as one being able to throw, but we're doing the stack unwinding manually in the JVM.
>> 
>> As an example, in the code for `merge_cp_and_rewrite` the call to `ConstantPool::allocate` can set a pending exception. You can see this if you dig down into  `MetadataFactory` and so on, look at `metaspace.cpp:33` and see the pending exception there.
>> 
>> So, by returning early, you're not handling the pending exception, which breaks the JVM.
>
> It basically seems like the correct fix is:
> 
> 
> if (HAS_PENDING_EXCEPTION) {
>   // ... same as before
> } else if (res != JVMTI_ERROR_NONE) {
>   return res;
> }

thanks for the explanation I made the change

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

PR Review Comment: https://git.openjdk.org/jdk/pull/29445#discussion_r2769510905


More information about the serviceability-dev mailing list