diff a/src/hotspot/share/prims/jvmtiManageCapabilities.cpp b/src/hotspot/share/prims/jvmtiManageCapabilities.cpp --- a/src/hotspot/share/prims/jvmtiManageCapabilities.cpp +++ b/src/hotspot/share/prims/jvmtiManageCapabilities.cpp @@ -1,7 +1,7 @@ /* - * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. @@ -54,10 +54,11 @@ // all capabilities ever acquired jvmtiCapabilities JvmtiManageCapabilities::acquired_capabilities; int JvmtiManageCapabilities::_can_support_virtual_threads_count = 0; +int JvmtiManageCapabilities::_can_support_value_objects_count = 0; Mutex* JvmtiManageCapabilities::_capabilities_lock = nullptr; void JvmtiManageCapabilities::initialize() { _capabilities_lock = new Mutex(Mutex::nosafepoint, "Capabilities_lock"); @@ -101,10 +102,11 @@ jc.can_tag_objects = 1; jc.can_generate_object_free_events = 1; jc.can_generate_resource_exhaustion_heap_events = 1; jc.can_generate_resource_exhaustion_threads_events = 1; jc.can_support_virtual_threads = 1; + jc.can_support_value_objects = 1; return jc; } jvmtiCapabilities JvmtiManageCapabilities::init_onload_capabilities() { jvmtiCapabilities jc; @@ -275,10 +277,13 @@ exclude(&onload_solo_remaining_capabilities, desired, &onload_solo_remaining_capabilities); if (desired->can_support_virtual_threads != 0 && current->can_support_virtual_threads == 0) { _can_support_virtual_threads_count++; } + if (desired->can_support_value_objects != 0 && current->can_support_value_objects == 0) { + _can_support_value_objects_count++; + } // return the result either(current, desired, result); update(); @@ -307,10 +312,15 @@ if (to_trash.can_support_virtual_threads != 0) { assert(current->can_support_virtual_threads != 0, "sanity check"); assert(_can_support_virtual_threads_count > 0, "sanity check"); _can_support_virtual_threads_count--; } + if (to_trash.can_support_value_objects != 0) { + assert(current->can_support_value_objects != 0, "sanity check"); + assert(_can_support_value_objects_count > 0, "sanity check"); + _can_support_value_objects_count--; + } update(); // return the result exclude(current, unwanted, result); @@ -391,10 +401,11 @@ avail.can_generate_frame_pop_events); JvmtiExport::set_can_post_frame_pop(avail.can_generate_frame_pop_events); JvmtiExport::set_can_pop_frame(avail.can_pop_frame); JvmtiExport::set_can_force_early_return(avail.can_force_early_return); JvmtiExport::set_can_support_virtual_threads(_can_support_virtual_threads_count != 0); + JvmtiExport::set_can_support_value_objects(_can_support_value_objects_count != 0); JvmtiExport::set_should_clean_up_heap_objects(avail.can_generate_breakpoint_events); JvmtiExport::set_can_get_owned_monitor_info(avail.can_get_owned_monitor_info || avail.can_get_owned_monitor_stack_depth_info); } @@ -486,8 +497,10 @@ log_trace(jvmti)("can_generate_early_vmstart"); if (cap->can_generate_early_class_hook_events) log_trace(jvmti)("can_generate_early_class_hook_events"); if (cap->can_support_virtual_threads) log_trace(jvmti)("can_support_virtual_threads"); + if (cap->can_support_value_objects) + log_trace(jvmti)("can_support_value_objects"); } #endif