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