On Mon, 29 May 2023 10:09:15 GMT, Johan Sjölen <jsjo...@openjdk.org> wrote:
> A final sweep of Hotspot to remove all re-added NULLs. With only 110 changes > I'd appreciate if this was considered trivial. All of the stuff to actually keep. src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp line 125: > 123: > 124: void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &cbuf, > methodHandle& method, jint pc_offset, JVMCI_TRAPS) { > 125: NativeCall* call = nullptr; T src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp line 158: > 156: // Check for proper post_call_nop > 157: NativePostCallNop* nop = > nativePostCallNop_at(call->next_instruction_address()); > 158: if (nop == nullptr) { T src/hotspot/cpu/ppc/templateTable_ppc_64.cpp line 2297: > 2295: __ ld_ptr(method, array_base_offset + > in_bytes(ResolvedIndyEntry::method_offset()), cache); > 2296: > 2297: // The invokedynamic is unresolved iff method is null T src/hotspot/cpu/riscv/gc/shared/barrierSetAssembler_riscv.cpp line 374: > 372: // Make sure klass is 'reasonable', which is not zero. > 373: __ load_klass(obj, obj, tmp1); // get klass > 374: __ beqz(obj, error); // if klass is null it is broken T src/hotspot/cpu/riscv/stubGenerator_riscv.cpp line 4019: > 4017: StubRoutines::_forward_exception_entry = > generate_forward_exception(); > 4018: > 4019: if (UnsafeCopyMemory::_table == nullptr) { T src/hotspot/cpu/riscv/stubGenerator_riscv.cpp line 4077: > 4075: > 4076: BarrierSetNMethod* bs_nm = > BarrierSet::barrier_set()->barrier_set_nmethod(); > 4077: if (bs_nm != nullptr) { T src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp line 489: > 487: __ load_klass(obj, obj, tmp1); // get klass > 488: __ testptr(obj, obj); > 489: __ jcc(Assembler::zero, error); // if klass is null it is broken T src/hotspot/cpu/x86/interp_masm_x86.cpp line 303: > 301: jcc(Assembler::equal, L); > 302: stop("InterpreterMacroAssembler::call_VM_base:" > 303: " last_sp != null"); T src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp line 191: > 189: // Check for proper post_call_nop > 190: NativePostCallNop* nop = > nativePostCallNop_at(call->next_instruction_address()); > 191: if (nop == nullptr) { T src/hotspot/share/adlc/output_c.cpp line 279: > 277: int max_stage = 0; > 278: i = 0; > 279: for (pipeline->_reslist.reset(); (resource = > pipeline->_reslist.iter()) != nullptr;) { T src/hotspot/share/adlc/output_c.cpp line 305: > 303: templen = 0; > 304: i = 0; > 305: for (pipeline->_reslist.reset(); (resource = > pipeline->_reslist.iter()) != nullptr;) { T src/hotspot/share/adlc/output_c.cpp line 368: > 366: const char* resource; > 367: i = 0; > 368: for (pipeline->_reslist.reset(); (resource = > pipeline->_reslist.iter()) != nullptr;) { T src/hotspot/share/adlc/output_c.cpp line 393: > 391: > 392: i = 0; > 393: for (pipeline->_reslist.reset(); (resource = > pipeline->_reslist.iter()) != nullptr;) { T src/hotspot/share/adlc/output_c.cpp line 1009: > 1007: const char* resource; > 1008: i = 0; > 1009: for (_pipeline->_reslist.reset(); (resource = > _pipeline->_reslist.iter()) != nullptr;) { T src/hotspot/share/cds/filemap.cpp line 363: > 361: > 362: void SharedClassPathEntry::copy_from(SharedClassPathEntry* ent, > ClassLoaderData* loader_data, TRAPS) { > 363: assert(ent != nullptr, "sanity"); T src/hotspot/share/classfile/stringTable.hpp line 150: > 148: static size_t shared_entry_count() NOT_CDS_JAVA_HEAP_RETURN_(0); > 149: static void allocate_shared_strings_array(TRAPS) > NOT_CDS_JAVA_HEAP_RETURN; > 150: static oop init_shared_table(const DumpedInternedStrings* > dumped_interned_strings) NOT_CDS_JAVA_HEAP_RETURN_(nullptr); T src/hotspot/share/code/compiledIC.hpp line 93: > 91: CompiledICHolder* claim_cached_icholder() { > 92: assert(_is_icholder, ""); > 93: assert(_cached_value != nullptr, "must be non-null"); T src/hotspot/share/code/compiledIC.hpp line 342: > 340: // Code > 341: > 342: // Returns null if CodeBuffer::expand fails T src/hotspot/share/compiler/compileBroker.cpp line 388: > 386: > 387: MonitorLocker locker(MethodCompileQueue_lock); > 388: // If _first is null we have no more compile jobs. There are two > reasons for T src/hotspot/share/gc/x/xBarrier.cpp line 242: > 240: oop XBarrier::weak_load_barrier_on_oop_field_preloaded(volatile > narrowOop* p, oop o) { > 241: ShouldNotReachHere(); > 242: return nullptr; T src/hotspot/share/gc/x/xBarrierSet.inline.hpp line 187: > 185: // No check cast, bulk barrier and bulk copy > 186: XBarrier::load_barrier_on_oop_array(src, length); > 187: return Raw::oop_arraycopy_in_heap(nullptr, 0, src, nullptr, 0, dst, > length); T src/hotspot/share/gc/x/xPageTable.inline.hpp line 43: > 41: inline bool XPageTableIterator::next(XPage** page) { > 42: for (XPage* entry; _iter.next(&entry);) { > 43: if (entry != nullptr && entry != _prev) { T src/hotspot/share/gc/z/zHeap.cpp line 383: > 381: > 382: if (addr == zaddress::null) { > 383: st->print_raw_cr("null"); T src/hotspot/share/gc/z/zHeap.cpp line 438: > 436: > 437: if (addr == zaddress::null) { > 438: st->print_raw_cr("null"); T src/hotspot/share/interpreter/linkResolver.cpp line 816: > 814: st->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, > access_flags: ", > 815: prefix, > 816: (klass == nullptr ? "<null>" : klass->internal_name()), T src/hotspot/share/jfr/dcmd/jfrDcmds.hpp line 162: > 160: } > 161: static const JavaPermission permission() { > 162: JavaPermission p = {"java.lang.management.ManagementPermission", > "monitor", nullptr}; T src/hotspot/share/jfr/dcmd/jfrDcmds.hpp line 187: > 185: } > 186: static const JavaPermission permission() { > 187: JavaPermission p = {"java.lang.management.ManagementPermission", > "monitor", nullptr}; T src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadState.cpp line 125: > 123: } > 124: } > 125: assert(name_str != nullptr, "unexpected null thread name"); T src/hotspot/share/jfr/recorder/repository/jfrRepository.cpp line 147: > 145: const char* const canonical_chunk_path = JfrJavaSupport::c_str(path, > jt); > 146: if (nullptr == canonical_chunk_path && !_chunkwriter->is_valid()) { > 147: // new output is null and current output is null T src/hotspot/share/jfr/recorder/stringpool/jfrStringPool.cpp line 119: > 117: } > 118: release(old, thread); > 119: return new_buffer; // might be null T src/hotspot/share/jvmci/jvmciEnv.cpp line 366: > 364: JNIAccessMark jni(this, THREAD); > 365: jthrowable ex = jni()->ExceptionOccurred(); > 366: if (ex != nullptr) { T src/hotspot/share/logging/logAsyncWriter.cpp line 195: > 193: if (self->_initialized) { > 194: Atomic::release_store_fence(&AsyncLogWriter::_instance, self); > 195: // All readers of _instance after the fence see non-null. T src/hotspot/share/logging/logConfiguration.cpp line 481: > 479: const char* output_options, > 480: outputStream* errstream) { > 481: assert(errstream != nullptr, "errstream can not be null"); T src/hotspot/share/logging/logConfiguration.hpp line 64: > 62: static bool _async_mode; > 63: > 64: // Create a new output. Returns null if failed. T src/hotspot/share/logging/logMessageBuffer.hpp line 112: > 110: // using set_prefix(). Lines added to the LogMessageBuffer after a > prefix > 111: // function has been set will be prefixed automatically. > 112: // Setting this to null will disable prefixing. T src/hotspot/share/logging/logStream.hpp line 103: > 101: : LogStreamImpl(LogTargetHandle(level, LogTagSetMapping<T0, T1, T2, > T3, T4>::tagset())) {} > 102: > 103: // Constructor to support creation from typed (likely null) pointer. > Mostly used by the logging framework. T src/hotspot/share/memory/metaspace.cpp line 878: > 876: "allocation size too large (" SIZE_FORMAT ")", word_size); > 877: > 878: assert(loader_data != nullptr, "Should never pass around a null > loader_data. " T src/hotspot/share/memory/metaspace/metachunk.cpp line 280: > 278: > 279: // Test base pointer > 280: assert(base() != nullptr, "Base pointer null"); T src/hotspot/share/memory/metaspace/metaspaceArena.cpp line 346: > 344: > 345: if (p == nullptr) { > 346: UL(info, "allocation failed, returned null."); T src/hotspot/share/memory/universe.cpp line 469: > 467: if (!is_reference_type((BasicType)i)) { > 468: oop m = _basic_type_mirrors[i].resolve(); > 469: assert(m != nullptr, "archived mirrors should not be null"); T src/hotspot/share/memory/virtualspace.cpp line 598: > 596: // Last, desperate try without any placement. > 597: if (_base == nullptr) { > 598: log_trace(gc, heap, coops)("Trying to allocate at address null > heap of size " SIZE_FORMAT_X, size + noaccess_prefix); T src/hotspot/share/oops/cpCache.cpp line 888: > 886: const bool has_appendix = appendix.not_null(); > 887: > 888: LogStream* log_stream = nullptr; T src/hotspot/share/oops/cpCache.cpp line 906: > 904: objArrayOop resolved_references = > constant_pool()->resolved_references(); > 905: assert(appendix_index >= 0 && appendix_index < > resolved_references->length(), "oob"); > 906: assert(resolved_references->obj_at(appendix_index) == nullptr, "init > just once"); T src/hotspot/share/oops/cpCache.cpp line 914: > 912: resolved_indy_entry_at(index)->fill_in(adapter, > adapter->size_of_parameters(), as_TosState(adapter->result_type()), > has_appendix); > 913: > 914: if (log_stream != nullptr) { T src/hotspot/share/prims/jvmtiAgent.cpp line 375: > 373: HandleMark hm(thread); > 374: extern struct JavaVM_ main_vm; > 375: const jint err = (*on_load_entry)(&main_vm, > const_cast<char*>(agent->options()), nullptr); T src/hotspot/share/prims/jvmtiThreadState.cpp line 248: > 246: > 247: // disable VTMS transitions for one virtual thread > 248: // no-op if thread is non-null and not a virtual thread T src/hotspot/share/prims/whitebox.cpp line 1885: > 1883: InstanceKlass* ik = > InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); > 1884: ConstantPool* cp = ik->constants(); > 1885: if (cp->cache() == nullptr) { T src/hotspot/share/prims/whitebox.cpp line 1894: > 1892: InstanceKlass* ik = > InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); > 1893: ConstantPool* cp = ik->constants(); > 1894: if (cp->cache() == nullptr) { T src/hotspot/share/runtime/fieldDescriptor.cpp line 164: > 162: obj->obj_field(offset())->print_value_on(st); > 163: } else { > 164: st->print("null"); T src/hotspot/share/runtime/fieldDescriptor.cpp line 171: > 169: obj->obj_field(offset())->print_value_on(st); > 170: } else { > 171: st->print("null"); T src/hotspot/share/runtime/globals.hpp line 632: > 630: > \ > 631: develop(bool, InterceptOSException, false, > \ > 632: "Start debugger when an implicit OS (e.g. null) " > \ T src/hotspot/share/runtime/handles.hpp line 71: > 69: protected: > 70: oop obj() const { return _handle == > nullptr ? (oop)nullptr : *_handle; } > 71: oop non_null_obj() const { assert(_handle != > nullptr, "resolving null handle"); return *_handle; } T src/hotspot/share/runtime/handles.hpp line 147: > 145: protected: \ > 146: type* obj() const { return _value; } \ > 147: type* non_null_obj() const { assert(_value != > nullptr, "resolving null _value"); return _value; } \ T src/hotspot/share/runtime/jniHandles.cpp line 381: > 379: JNIHandleBlock* next = block->_next; > 380: Atomic::dec(&_blocks_allocated); > 381: assert(block->pop_frame_link() == nullptr, "pop_frame_link should > be null"); T src/hotspot/share/runtime/jniHandles.inline.hpp line 116: > 114: assert(handle != nullptr, "JNI handle should not be null"); > 115: oop result = resolve_impl<DECORATORS_NONE, false /* external_guard > */>(handle); > 116: assert(result != nullptr, "null read from jni handle"); T src/hotspot/share/runtime/objectMonitor.cpp line 539: > 537: // Attempt async deflation protocol. > 538: > 539: // Set a null owner to DEFLATER_MARKER to force any contending thread T src/hotspot/share/runtime/objectMonitor.cpp line 564: > 562: if (Atomic::cmpxchg(&_contentions, 0, INT_MIN) != 0) { > 563: // Contentions was no longer 0 so we lost the race since the > 564: // ObjectMonitor is now busy. Restore owner to null if it is T src/hotspot/share/runtime/objectMonitor.cpp line 669: > 667: ss->print("owner=" INTPTR_FORMAT, p2i(owner_raw())); > 668: } else { > 669: // We report null instead of DEFLATER_MARKER here because is_busy() T src/hotspot/share/runtime/os.cpp line 1131: > 1129: // Handle null first, so later checks don't need to protect against > it. > 1130: if (addr == nullptr) { > 1131: st->print_cr("0x0 is null"); T src/hotspot/share/runtime/safepoint.cpp line 235: > 233: for (; JavaThread *cur = jtiwh.next(); ) { > 234: ThreadSafepointState *cur_tss = cur->safepoint_state(); > 235: assert(cur_tss->get_next() == nullptr, "Must be null"); T src/hotspot/share/runtime/thread.cpp line 269: > 267: delete metadata_handles(); > 268: > 269: // osthread() can be null, if creation of thread failed. T src/hotspot/share/runtime/thread.hpp line 343: > 341: virtual const char* type_name() const { return "Thread"; } > 342: > 343: // Returns the current thread (ASSERTS if null) T src/hotspot/share/runtime/threadSMR.cpp line 623: > 621: // Shared singleton data for all ThreadsList(0) instances. > 622: // Used by _bootstrap_list to avoid static init time heap allocation. > 623: // No real entries, just the final null terminator. T src/hotspot/share/runtime/threadSMR.cpp line 849: > 847: _protected_java_thread = java_lang_Thread::thread(thread_oop); > 848: assert(_protected_java_thread == nullptr || > _tlh.includes(_protected_java_thread), "must be"); > 849: // If we captured a non-null JavaThread* after the _tlh was created T src/hotspot/share/runtime/vmOperations.cpp line 335: > 333: jt->is_exiting() || > 334: jt->is_hidden_from_external_view()) { > 335: // add a null snapshot if skipped T src/hotspot/share/services/threadService.cpp line 1071: > 1069: oop ownerObj = > java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(waitingToLockBlocker); > 1070: currentThread = java_lang_Thread::thread(ownerObj); > 1071: assert(currentThread != nullptr, "AbstractOwnableSynchronizer > owning thread is unexpectedly null"); T src/hotspot/share/utilities/concurrentHashTable.inline.hpp line 1295: > 1293: return false; > 1294: } > 1295: assert(_new_table == nullptr || _new_table == POISON_PTR, "Must be > null"); T src/hotspot/share/utilities/copy.cpp line 73: > 71: assert(src != nullptr, "address must not be null"); > 72: assert(dst != nullptr, "address must not be null"); > 73: assert(elem_size == 2 || elem_size == 4 || elem_size == 8, T src/hotspot/share/utilities/elfFile.cpp line 1827: > 1825: } > 1826: > 1827: // If result is a null, we do not care about the content of the string > being read. T src/hotspot/share/utilities/elfFuncDescTable.hpp line 135: > 133: ~ElfFuncDescTable(); > 134: > 135: // return the function address for the function descriptor at 'index' > or null on error T src/hotspot/share/utilities/exceptions.cpp line 138: > 136: // therefore the exception oop should be in the oopmap. > 137: void Exceptions::_throw_oop(JavaThread* thread, const char* file, int > line, oop exception) { > 138: assert(exception != nullptr, "exception should not be null"); T src/hotspot/share/utilities/exceptions.cpp line 145: > 143: void Exceptions::_throw(JavaThread* thread, const char* file, int line, > Handle h_exception, const char* message) { > 144: ResourceMark rm(thread); > 145: assert(h_exception() != nullptr, "exception should not be null"); T src/hotspot/share/utilities/globalDefinitions.cpp line 162: > 160: static_assert((size_t)HeapWordSize >= sizeof(juint), > 161: "HeapWord should be at least as large as juint"); > 162: static_assert(sizeof(nullptr) == sizeof(char*), "null must be same > size as pointer"); T src/hotspot/share/utilities/globalDefinitions_gcc.hpp line 135: > 133: > 134: // gcc warns about applying offsetof() to non-POD object or calculating > 135: // offset directly when base address is null. The -Wno-invalid-offsetof T src/hotspot/share/utilities/linkedlist.hpp line 174: > 172: > 173: virtual void add(LinkedListNode<E>* node) { > 174: assert(node != nullptr, "null pointer"); T src/hotspot/share/utilities/linkedlist.hpp line 388: > 386: > 387: virtual void add(LinkedListNode<E>* node) { > 388: assert(node != nullptr, "null pointer"); T src/hotspot/share/utilities/lockFreeStack.hpp line 79: > 77: > 78: // Atomically removes the top object from this stack and returns a > 79: // pointer to that object, or null if this stack is empty. Acts as a T src/hotspot/share/utilities/lockFreeStack.hpp line 100: > 98: } > 99: > 100: // Atomically exchange the list of elements with null, returning the > old T src/hotspot/share/utilities/lockFreeStack.hpp line 146: > 144: bool empty() const { return top() == nullptr; } > 145: > 146: // Return the most recently pushed element, or null if the stack is > empty. T src/hotspot/share/utilities/nonblockingQueue.hpp line 48: > 46: // A queue may temporarily appear to be empty even though elements have > been > 47: // added and not removed. For example, after running the following > program, > 48: // the value of r may be null. T src/hotspot/share/utilities/nonblockingQueue.hpp line 108: > 106: // Thread-safe attempt to remove and return the first object in the > queue. > 107: // Returns true if successful. If successful then *node_ptr is the > former > 108: // first object, or null if the queue was empty. If unsuccessful, > because T src/hotspot/share/utilities/nonblockingQueue.hpp line 114: > 112: inline bool try_pop(T** node_ptr); > 113: > 114: // Thread-safe remove and return the first object in the queue, or null T src/hotspot/share/utilities/nonblockingQueue.hpp line 116: > 114: // Thread-safe remove and return the first object in the queue, or null > 115: // if the queue was empty. This just iterates on try_pop() until it > 116: // succeeds, returning the (possibly null) element obtained from that. T src/hotspot/share/utilities/nonblockingQueue.inline.hpp line 88: > 86: // An append operation atomically exchanges the new tail with the queue > tail. > 87: // It then sets the "next" value of the old tail to the head of the list > being > 88: // appended. If the old tail is null then the queue was empty, then the T src/hotspot/share/utilities/nonblockingQueue.inline.hpp line 111: > 109: if (old_tail == nullptr) { > 110: // If old_tail is null then the queue was empty, and _head must also > be > 111: // null. The correctness of this assertion depends on try_pop > clearing T src/hotspot/share/utilities/nonblockingQueue.inline.hpp line 129: > 127: } else { > 128: // A concurrent try_pop has claimed old_tail, so it is no longer in > the > 129: // list. The queue was logically empty. _head is either null or T src/hotspot/share/utilities/nonblockingQueue.inline.hpp line 155: > 153: // There are several cases for next_node. > 154: // (1) next_node is the extension of the queue's list. > 155: // (2) next_node is null, because a competing try_pop took old_head. T src/hotspot/share/utilities/nonblockingQueue.inline.hpp line 178: > 176: // report it as such for consistency, though we could report the > queue > 177: // was empty. We don't attempt to further help [Clause 2] by also > 178: // trying to set _tail to nullptr, as that would just ensure that > one or T src/hotspot/share/utilities/nonblockingQueue.inline.hpp line 194: > 192: // [Clause 2] > 193: // Old_head was the last entry and we've claimed it by setting its > next > 194: // value to null. However, this leaves the queue in disarray. Fix > up T src/hotspot/share/utilities/nonblockingQueue.inline.hpp line 203: > 201: // also consistent with [Clause 1b]. > 202: > 203: // Attempt to change the queue head from old_head to null. Failure > of T src/hotspot/share/utilities/nonblockingQueue.inline.hpp line 208: > 206: Atomic::cmpxchg(&_head, old_head, (T*)nullptr); > 207: > 208: // Attempt to change the queue tail from old_head to null. Failure > of T src/hotspot/share/utilities/ostream.cpp line 709: > 707: start_log(); > 708: } else { > 709: // and leave xtty as null T src/hotspot/share/utilities/ostream.cpp line 771: > 769: text->print_raw(p->key()); > 770: text->put('='); > 771: assert(p->value() != nullptr, "p->value() is null"); T src/hotspot/share/utilities/unsigned5.hpp line 327: > 325: Writer(const ARR& array) > 326: : _array(const_cast<ARR&>(array)), _limit_ptr(nullptr), > _position(0) { > 327: // Note: if _limit_ptr is null, the ARR& is never reassigned, T src/hotspot/share/utilities/utf8.hpp line 76: > 74: // Utility methods > 75: > 76: // Returns null if 'c' it not found. This only works as long T src/hotspot/share/utilities/vmError.hpp line 45: > 43: static char _detail_msg[1024]; > 44: > 45: static Thread* _thread; // null if it's native thread T ------------- PR Review: https://git.openjdk.org/jdk/pull/14198#pullrequestreview-1449252066 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209159785 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209159872 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209160289 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209160378 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209160527 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209160578 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209161770 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209160686 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209160791 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209161299 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209161367 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209161415 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209161470 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162033 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162094 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162234 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162319 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162344 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162424 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162602 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162648 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162687 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162835 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209162873 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163006 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163074 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163111 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163185 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163220 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163248 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163287 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163352 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163396 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163558 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163605 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163642 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163724 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163763 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163811 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163873 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209163927 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209164027 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209164087 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209164125 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209164508 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209164848 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209164910 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209164940 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165038 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165073 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165280 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165354 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165423 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165533 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165626 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165671 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165736 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165819 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209165977 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166087 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166196 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166250 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166340 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166433 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166563 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166748 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166817 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166925 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209166991 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167061 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167105 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167139 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167208 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167536 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167644 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167683 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167736 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167787 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167918 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209167968 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168014 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168057 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168094 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168142 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168185 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168230 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168252 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168310 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168372 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168414 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168454 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168522 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168564 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168609 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168655 PR Review Comment: https://git.openjdk.org/jdk/pull/14198#discussion_r1209168750