On Thu, 5 Feb 2026 11:15:04 GMT, Johan Sjölen <[email protected]> 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

Reply via email to