Skip to content

Commit eb256de

Browse files
committed
8358326: Use oopFactory array allocation
Reviewed-by: fparain, stefank
1 parent 156187a commit eb256de

File tree

10 files changed

+53
-44
lines changed

10 files changed

+53
-44
lines changed

src/hotspot/share/jvmci/jvmciEnv.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,8 +1463,7 @@ JVMCIPrimitiveArray JVMCIEnv::new_byteArray(int length, JVMCI_TRAPS) {
14631463
JVMCIObjectArray JVMCIEnv::new_byte_array_array(int length, JVMCI_TRAPS) {
14641464
JavaThread* THREAD = JavaThread::current(); // For exception macros.
14651465
if (is_hotspot()) {
1466-
Klass* byteArrayArrayKlass = TypeArrayKlass::cast(Universe::byteArrayKlass())->array_klass(CHECK_(JVMCIObject()));
1467-
objArrayOop result = ObjArrayKlass::cast(byteArrayArrayKlass) ->allocate(length, CHECK_(JVMCIObject()));
1466+
objArrayOop result = oopFactory::new_objArray(Universe::byteArrayKlass(), length, CHECK_(JVMCIObject()));
14681467
return wrap(result);
14691468
} else {
14701469
JNIAccessMark jni(this, THREAD);

src/hotspot/share/memory/oopFactory.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,41 +40,41 @@
4040
#include "utilities/utf8.hpp"
4141

4242
typeArrayOop oopFactory::new_boolArray(int length, TRAPS) {
43-
return Universe::boolArrayKlass()->allocate(length, THREAD);
43+
return Universe::boolArrayKlass()->allocate_instance(length, THREAD);
4444
}
4545

4646
typeArrayOop oopFactory::new_charArray(int length, TRAPS) {
47-
return Universe::charArrayKlass()->allocate(length, THREAD);
47+
return Universe::charArrayKlass()->allocate_instance(length, THREAD);
4848
}
4949

5050
typeArrayOop oopFactory::new_floatArray(int length, TRAPS) {
51-
return Universe::floatArrayKlass()->allocate(length, THREAD);
51+
return Universe::floatArrayKlass()->allocate_instance(length, THREAD);
5252
}
5353

5454
typeArrayOop oopFactory::new_doubleArray(int length, TRAPS) {
55-
return Universe::doubleArrayKlass()->allocate(length, THREAD);
55+
return Universe::doubleArrayKlass()->allocate_instance(length, THREAD);
5656
}
5757

5858
typeArrayOop oopFactory::new_byteArray(int length, TRAPS) {
59-
return Universe::byteArrayKlass()->allocate(length, THREAD);
59+
return Universe::byteArrayKlass()->allocate_instance(length, THREAD);
6060
}
6161

6262
typeArrayOop oopFactory::new_shortArray(int length, TRAPS) {
63-
return Universe::shortArrayKlass()->allocate(length, THREAD);
63+
return Universe::shortArrayKlass()->allocate_instance(length, THREAD);
6464
}
6565

6666
typeArrayOop oopFactory::new_intArray(int length, TRAPS) {
67-
return Universe::intArrayKlass()->allocate(length, THREAD);
67+
return Universe::intArrayKlass()->allocate_instance(length, THREAD);
6868
}
6969

7070
typeArrayOop oopFactory::new_longArray(int length, TRAPS) {
71-
return Universe::longArrayKlass()->allocate(length, THREAD);
71+
return Universe::longArrayKlass()->allocate_instance(length, THREAD);
7272
}
7373

7474
// create java.lang.Object[]
7575
objArrayOop oopFactory::new_objectArray(int length, TRAPS) {
7676
assert(Universe::objectArrayKlass() != nullptr, "Too early?");
77-
return Universe::objectArrayKlass()->allocate(length, THREAD);
77+
return Universe::objectArrayKlass()->allocate_instance(length, THREAD);
7878
}
7979

8080
typeArrayOop oopFactory::new_charArray(const char* utf8_str, TRAPS) {
@@ -88,7 +88,7 @@ typeArrayOop oopFactory::new_charArray(const char* utf8_str, TRAPS) {
8888

8989
typeArrayOop oopFactory::new_typeArray(BasicType type, int length, TRAPS) {
9090
TypeArrayKlass* klass = Universe::typeArrayKlass(type);
91-
return klass->allocate(length, THREAD);
91+
return klass->allocate_instance(length, THREAD);
9292
}
9393

9494
// Create a Java array that points to Symbol.

src/hotspot/share/oops/objArrayKlass.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
#include "runtime/mutexLocker.hpp"
4545
#include "utilities/macros.hpp"
4646

47-
ObjArrayKlass* ObjArrayKlass::allocate(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS) {
47+
ObjArrayKlass* ObjArrayKlass::allocate_klass(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS) {
4848
assert(ObjArrayKlass::header_size() <= InstanceKlass::header_size(),
4949
"array klasses must be same size as InstanceKlass");
5050

@@ -100,7 +100,7 @@ ObjArrayKlass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_da
100100
}
101101

102102
// Initialize instance variables
103-
ObjArrayKlass* oak = ObjArrayKlass::allocate(loader_data, n, element_klass, name, CHECK_NULL);
103+
ObjArrayKlass* oak = ObjArrayKlass::allocate_klass(loader_data, n, element_klass, name, CHECK_NULL);
104104

105105
ModuleEntry* module = oak->module();
106106
assert(module != nullptr, "No module entry for array");
@@ -149,7 +149,7 @@ size_t ObjArrayKlass::oop_size(oop obj) const {
149149
return objArrayOop(obj)->object_size();
150150
}
151151

152-
objArrayOop ObjArrayKlass::allocate(int length, TRAPS) {
152+
objArrayOop ObjArrayKlass::allocate_instance(int length, TRAPS) {
153153
check_array_allocation_length(length, arrayOopDesc::max_array_length(T_OBJECT), CHECK_NULL);
154154
size_t size = objArrayOopDesc::object_size(length);
155155
return (objArrayOop)Universe::heap()->array_allocate(this, size, length,
@@ -160,7 +160,7 @@ oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
160160
int length = *sizes;
161161
ArrayKlass* ld_klass = lower_dimension();
162162
// If length < 0 allocate will throw an exception.
163-
objArrayOop array = allocate(length, CHECK_NULL);
163+
objArrayOop array = allocate_instance(length, CHECK_NULL);
164164
objArrayHandle h_array (THREAD, array);
165165
if (rank > 1) {
166166
if (length != 0) {

src/hotspot/share/oops/objArrayKlass.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ class ClassLoaderData;
3333
// ObjArrayKlass is the klass for objArrays
3434

3535
class ObjArrayKlass : public ArrayKlass {
36-
friend class VMStructs;
36+
friend class Deoptimization;
3737
friend class JVMCIVMStructs;
38+
friend class oopFactory;
39+
friend class VMStructs;
3840

3941
public:
4042
static const KlassKind Kind = ObjArrayKlassKind;
@@ -47,7 +49,9 @@ class ObjArrayKlass : public ArrayKlass {
4749

4850
// Constructor
4951
ObjArrayKlass(int n, Klass* element_klass, Symbol* name);
50-
static ObjArrayKlass* allocate(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS);
52+
static ObjArrayKlass* allocate_klass(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS);
53+
54+
objArrayOop allocate_instance(int length, TRAPS);
5155
public:
5256
// For dummy objects
5357
ObjArrayKlass() {}
@@ -78,7 +82,6 @@ class ObjArrayKlass : public ArrayKlass {
7882
static ObjArrayKlass* allocate_objArray_klass(ClassLoaderData* loader_data,
7983
int n, Klass* element_klass, TRAPS);
8084

81-
objArrayOop allocate(int length, TRAPS);
8285
oop multi_allocate(int rank, jint* sizes, TRAPS);
8386

8487
// Copying

src/hotspot/share/oops/typeArrayKlass.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ TypeArrayKlass* TypeArrayKlass::create_klass(BasicType type,
5050

5151
ClassLoaderData* null_loader_data = ClassLoaderData::the_null_class_loader_data();
5252

53-
TypeArrayKlass* ak = TypeArrayKlass::allocate(null_loader_data, type, sym, CHECK_NULL);
53+
TypeArrayKlass* ak = TypeArrayKlass::allocate_klass(null_loader_data, type, sym, CHECK_NULL);
5454

5555
// Call complete_create_array_klass after all instance variables have been initialized.
5656
complete_create_array_klass(ak, ak->super(), ModuleEntryTable::javabase_moduleEntry(), CHECK_NULL);
@@ -65,7 +65,7 @@ TypeArrayKlass* TypeArrayKlass::create_klass(BasicType type,
6565
return ak;
6666
}
6767

68-
TypeArrayKlass* TypeArrayKlass::allocate(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS) {
68+
TypeArrayKlass* TypeArrayKlass::allocate_klass(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS) {
6969
assert(TypeArrayKlass::header_size() <= InstanceKlass::header_size(),
7070
"array klasses must be same size as InstanceKlass");
7171

@@ -101,7 +101,7 @@ oop TypeArrayKlass::multi_allocate(int rank, jint* last_size, TRAPS) {
101101
// For typeArrays this is only called for the last dimension
102102
assert(rank == 1, "just checking");
103103
int length = *last_size;
104-
return allocate(length, THREAD);
104+
return allocate_instance(length, THREAD);
105105
}
106106

107107

src/hotspot/share/oops/typeArrayKlass.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class ClassLoaderData;
3333
// It contains the type and size of the elements
3434

3535
class TypeArrayKlass : public ArrayKlass {
36+
friend class Deoptimization;
37+
friend class oopFactory;
3638
friend class VMStructs;
3739

3840
public:
@@ -43,7 +45,10 @@ class TypeArrayKlass : public ArrayKlass {
4345

4446
// Constructor
4547
TypeArrayKlass(BasicType type, Symbol* name);
46-
static TypeArrayKlass* allocate(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS);
48+
static TypeArrayKlass* allocate_klass(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS);
49+
50+
typeArrayOop allocate_common(int length, bool do_zero, TRAPS);
51+
typeArrayOop allocate_instance(int length, TRAPS) { return allocate_common(length, true, THREAD); }
4752
public:
4853
TypeArrayKlass() {} // For dummy objects.
4954

@@ -66,8 +71,6 @@ class TypeArrayKlass : public ArrayKlass {
6671
size_t oop_size(oop obj) const;
6772

6873
// Allocation
69-
typeArrayOop allocate_common(int length, bool do_zero, TRAPS);
70-
typeArrayOop allocate(int length, TRAPS) { return allocate_common(length, true, THREAD); }
7174
oop multi_allocate(int rank, jint* sizes, TRAPS);
7275

7376
oop protection_domain() const { return nullptr; }

src/hotspot/share/prims/jni.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2285,9 +2285,11 @@ JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass ele
22852285
jobjectArray ret = nullptr;
22862286
DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret);
22872287
Klass* ek = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass));
2288-
Klass* ak = ek->array_klass(CHECK_NULL);
2289-
ObjArrayKlass::cast(ak)->initialize(CHECK_NULL);
2290-
objArrayOop result = ObjArrayKlass::cast(ak)->allocate(length, CHECK_NULL);
2288+
2289+
// Make sure bottom_klass is initialized.
2290+
ek->initialize(CHECK_NULL);
2291+
objArrayOop result = oopFactory::new_objArray(ek, length, CHECK_NULL);
2292+
22912293
oop initial_value = JNIHandles::resolve(initialElement);
22922294
if (initial_value != nullptr) { // array already initialized with null
22932295
for (int index = 0; index < length; index++) {

src/hotspot/share/prims/vectorSupport.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "code/location.hpp"
2929
#include "jni.h"
3030
#include "jvm.h"
31+
#include "memory/oopFactory.hpp"
3132
#include "oops/klass.inline.hpp"
3233
#include "oops/typeArrayOop.inline.hpp"
3334
#include "prims/vectorSupport.hpp"
@@ -109,9 +110,7 @@ Handle VectorSupport::allocate_vector_payload_helper(InstanceKlass* ik, frame* f
109110
int elem_size = type2aelembytes(elem_bt);
110111

111112
// On-heap vector values are represented as primitive arrays.
112-
TypeArrayKlass* tak = Universe::typeArrayKlass(elem_bt);
113-
114-
typeArrayOop arr = tak->allocate(num_elem, CHECK_NH); // safepoint
113+
typeArrayOop arr = oopFactory::new_typeArray(elem_bt, num_elem, CHECK_NH); // safepoint
115114

116115
if (location.is_register()) {
117116
// Value was in a callee-saved register.

src/hotspot/share/runtime/deoptimization.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,11 +1274,11 @@ bool Deoptimization::realloc_objects(JavaThread* thread, frame* fr, RegisterMap*
12741274
assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length");
12751275
int len = sv->field_size() / type2size[ak->element_type()];
12761276
InternalOOMEMark iom(THREAD);
1277-
obj = ak->allocate(len, THREAD);
1277+
obj = ak->allocate_instance(len, THREAD);
12781278
} else if (k->is_objArray_klass()) {
12791279
ObjArrayKlass* ak = ObjArrayKlass::cast(k);
12801280
InternalOOMEMark iom(THREAD);
1281-
obj = ak->allocate(sv->field_size(), THREAD);
1281+
obj = ak->allocate_instance(sv->field_size(), THREAD);
12821282
}
12831283

12841284
if (obj == nullptr) {

src/hotspot/share/runtime/reflection.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -320,9 +320,16 @@ void Reflection::array_set(jvalue* value, arrayOop a, int index, BasicType value
320320
}
321321
}
322322

323+
324+
// Conversion
325+
static BasicType basic_type_mirror_to_basic_type(oop basic_type_mirror) {
326+
assert(java_lang_Class::is_primitive(basic_type_mirror),
327+
"just checking");
328+
return java_lang_Class::primitive_type(basic_type_mirror);
329+
}
330+
323331
static Klass* basic_type_mirror_to_arrayklass(oop basic_type_mirror, TRAPS) {
324-
assert(java_lang_Class::is_primitive(basic_type_mirror), "just checking");
325-
BasicType type = java_lang_Class::primitive_type(basic_type_mirror);
332+
BasicType type = basic_type_mirror_to_basic_type(basic_type_mirror);
326333
if (type == T_VOID) {
327334
THROW_NULL(vmSymbols::java_lang_IllegalArgumentException());
328335
}
@@ -339,8 +346,11 @@ arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) {
339346
THROW_MSG_NULL(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length));
340347
}
341348
if (java_lang_Class::is_primitive(element_mirror)) {
342-
Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
343-
return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
349+
BasicType type = basic_type_mirror_to_basic_type(element_mirror);
350+
if (type == T_VOID) {
351+
THROW_NULL(vmSymbols::java_lang_IllegalArgumentException());
352+
}
353+
return oopFactory::new_typeArray(type, length, CHECK_NULL);
344354
} else {
345355
Klass* k = java_lang_Class::as_Klass(element_mirror);
346356
if (k->is_array_klass() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
@@ -907,13 +917,6 @@ static methodHandle resolve_interface_call(InstanceKlass* klass,
907917
return methodHandle(THREAD, info.selected_method());
908918
}
909919

910-
// Conversion
911-
static BasicType basic_type_mirror_to_basic_type(oop basic_type_mirror) {
912-
assert(java_lang_Class::is_primitive(basic_type_mirror),
913-
"just checking");
914-
return java_lang_Class::primitive_type(basic_type_mirror);
915-
}
916-
917920
// Narrowing of basic types. Used to create correct jvalues for
918921
// boolean, byte, char and short return return values from interpreter
919922
// which are returned as ints. Throws IllegalArgumentException.

0 commit comments

Comments
 (0)