From e1680b1cdd80a8a319f8bdbc8453162aaf019b72 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Thu, 18 Sep 2025 13:58:52 +0000 Subject: [PATCH 1/3] 8367989: Remove InstanceKlass::allocate_objArray --- src/hotspot/share/memory/oopFactory.cpp | 4 ++-- src/hotspot/share/oops/instanceKlass.cpp | 9 --------- src/hotspot/share/oops/instanceKlass.hpp | 1 - src/hotspot/share/oops/objArrayKlass.hpp | 7 +++---- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/hotspot/share/memory/oopFactory.cpp b/src/hotspot/share/memory/oopFactory.cpp index e0b94a8caf8f4..fa47d4b77332d 100644 --- a/src/hotspot/share/memory/oopFactory.cpp +++ b/src/hotspot/share/memory/oopFactory.cpp @@ -104,12 +104,12 @@ typeArrayOop oopFactory::new_typeArray_nozero(BasicType type, int length, TRAPS) return klass->allocate_common(length, false, THREAD); } - objArrayOop oopFactory::new_objArray(Klass* klass, int length, TRAPS) { if (klass->is_array_klass()) { return ArrayKlass::cast(klass)->allocate_arrayArray(1, length, THREAD); } else { - return InstanceKlass::cast(klass)->allocate_objArray(1, length, THREAD); + ArrayKlass* ak = InstanceKlass::cast(klass)->array_klass(CHECK_NULL); + return ObjArrayKlass::cast(ak)->allocate_instance(length, THREAD); } } diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index f5e5628c99a08..98837c5289d98 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -1561,15 +1561,6 @@ bool InstanceKlass::is_same_or_direct_interface(Klass *k) const { return false; } -objArrayOop InstanceKlass::allocate_objArray(int n, int length, TRAPS) { - check_array_allocation_length(length, arrayOopDesc::max_array_length(T_OBJECT), CHECK_NULL); - size_t size = objArrayOopDesc::object_size(length); - ArrayKlass* ak = array_klass(n, CHECK_NULL); - objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length, - /* do_zero */ true, CHECK_NULL); - return o; -} - instanceOop InstanceKlass::register_finalizer(instanceOop i, TRAPS) { if (TraceFinalizerRegistration) { tty->print("Registered "); diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp index c2d5e9cc09818..aa9221179152e 100644 --- a/src/hotspot/share/oops/instanceKlass.hpp +++ b/src/hotspot/share/oops/instanceKlass.hpp @@ -812,7 +812,6 @@ class InstanceKlass: public Klass { // additional member function to return a handle instanceHandle allocate_instance_handle(TRAPS); - objArrayOop allocate_objArray(int n, int length, TRAPS); // Helper function static instanceOop register_finalizer(instanceOop i, TRAPS); diff --git a/src/hotspot/share/oops/objArrayKlass.hpp b/src/hotspot/share/oops/objArrayKlass.hpp index 6db6630cff467..1a4f7f657d2e3 100644 --- a/src/hotspot/share/oops/objArrayKlass.hpp +++ b/src/hotspot/share/oops/objArrayKlass.hpp @@ -64,7 +64,9 @@ class ObjArrayKlass : public ArrayKlass { // Instance variables Klass* element_klass() const { return _element_klass; } void set_element_klass(Klass* k) { _element_klass = k; } - Klass** element_klass_addr() { return &_element_klass; } + + // Compiler/Interpreter offset + static ByteSize element_klass_offset() { return byte_offset_of(ObjArrayKlass, _element_klass); } Klass* bottom_klass() const { return _bottom_klass; } void set_bottom_klass(Klass* k) { _bottom_klass = k; } @@ -73,9 +75,6 @@ class ObjArrayKlass : public ArrayKlass { ModuleEntry* module() const; PackageEntry* package() const; - // Compiler/Interpreter offset - static ByteSize element_klass_offset() { return byte_offset_of(ObjArrayKlass, _element_klass); } - // Dispatched operation bool can_be_primary_super_slow() const; GrowableArray* compute_secondary_supers(int num_extra_slots, From f4f1d2899ccd27d3d9ab1b313cc6c7cac30d54ee Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Fri, 19 Sep 2025 12:17:25 +0000 Subject: [PATCH 2/3] Stefan's suggestion #1. --- src/hotspot/share/memory/oopFactory.cpp | 7 ++++--- src/hotspot/share/oops/arrayKlass.cpp | 10 ---------- src/hotspot/share/oops/arrayKlass.hpp | 3 +-- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/hotspot/share/memory/oopFactory.cpp b/src/hotspot/share/memory/oopFactory.cpp index fa47d4b77332d..036ee349932d7 100644 --- a/src/hotspot/share/memory/oopFactory.cpp +++ b/src/hotspot/share/memory/oopFactory.cpp @@ -105,12 +105,13 @@ typeArrayOop oopFactory::new_typeArray_nozero(BasicType type, int length, TRAPS) } objArrayOop oopFactory::new_objArray(Klass* klass, int length, TRAPS) { + ArrayKlass* ak; if (klass->is_array_klass()) { - return ArrayKlass::cast(klass)->allocate_arrayArray(1, length, THREAD); + ak = ArrayKlass::cast(klass)->array_klass(CHECK_NULL); } else { - ArrayKlass* ak = InstanceKlass::cast(klass)->array_klass(CHECK_NULL); - return ObjArrayKlass::cast(ak)->allocate_instance(length, THREAD); + ak = InstanceKlass::cast(klass)->array_klass(CHECK_NULL); } + return ObjArrayKlass::cast(ak)->allocate_instance(length, THREAD); } objArrayHandle oopFactory::new_objArray_handle(Klass* klass, int length, TRAPS) { diff --git a/src/hotspot/share/oops/arrayKlass.cpp b/src/hotspot/share/oops/arrayKlass.cpp index 32a86c7ab244d..5e5dbf0ec5d98 100644 --- a/src/hotspot/share/oops/arrayKlass.cpp +++ b/src/hotspot/share/oops/arrayKlass.cpp @@ -187,16 +187,6 @@ GrowableArray* ArrayKlass::compute_secondary_supers(int num_extra_slots, return nullptr; } -objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) { - check_array_allocation_length(length, arrayOopDesc::max_array_length(T_ARRAY), CHECK_NULL); - size_t size = objArrayOopDesc::object_size(length); - ArrayKlass* ak = array_klass(n + dimension(), CHECK_NULL); - objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length, - /* do_zero */ true, CHECK_NULL); - // initialization to null not necessary, area already cleared - return o; -} - // JVMTI support jint ArrayKlass::jvmti_class_status() const { diff --git a/src/hotspot/share/oops/arrayKlass.hpp b/src/hotspot/share/oops/arrayKlass.hpp index 5bfe46573d3f5..3ec1660948292 100644 --- a/src/hotspot/share/oops/arrayKlass.hpp +++ b/src/hotspot/share/oops/arrayKlass.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, 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 @@ -87,7 +87,6 @@ class ArrayKlass: public Klass { // Sizes points to the first dimension of the array, subsequent dimensions // are always in higher memory. The callers of these set that up. virtual oop multi_allocate(int rank, jint* sizes, TRAPS); - objArrayOop allocate_arrayArray(int n, int length, TRAPS); // find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined Klass* find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const; From cfa036b468a1ddaa755233ade6eac055a126cc7d Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Fri, 19 Sep 2025 13:12:24 +0000 Subject: [PATCH 3/3] Use virtual function rather than if statement, still need one cast though. --- src/hotspot/share/memory/oopFactory.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/hotspot/share/memory/oopFactory.cpp b/src/hotspot/share/memory/oopFactory.cpp index 036ee349932d7..d5e958ef29a2b 100644 --- a/src/hotspot/share/memory/oopFactory.cpp +++ b/src/hotspot/share/memory/oopFactory.cpp @@ -105,12 +105,7 @@ typeArrayOop oopFactory::new_typeArray_nozero(BasicType type, int length, TRAPS) } objArrayOop oopFactory::new_objArray(Klass* klass, int length, TRAPS) { - ArrayKlass* ak; - if (klass->is_array_klass()) { - ak = ArrayKlass::cast(klass)->array_klass(CHECK_NULL); - } else { - ak = InstanceKlass::cast(klass)->array_klass(CHECK_NULL); - } + ArrayKlass* ak = klass->array_klass(CHECK_NULL); return ObjArrayKlass::cast(ak)->allocate_instance(length, THREAD); }