Skip to content

Commit dc9157d

Browse files
authored
Merge pull request #20139 from theresa-m/nr_array_2
Always create nullable array before null-restricted
2 parents cf5af08 + ff1d09b commit dc9157d

File tree

3 files changed

+35
-21
lines changed

3 files changed

+35
-21
lines changed

runtime/oti/j9.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ static const struct { \
362362
#define J9_IS_NULL_RESTRICTED_FIELD_FLATTENED(fieldClazz, romFieldShape) FALSE
363363
#define J9_VALUETYPE_FLATTENED_SIZE(clazz)((UDATA) 0) /* It is not possible for this macro to be used since we always check J9_IS_J9CLASS_FLATTENED before ever using it. */
364364
#define J9_IS_J9ARRAYCLASS_NULL_RESTRICTED(clazz) FALSE
365+
#define J9CLASS_GET_NULLRESTRICTED_ARRAY(clazz) NULL
365366
#endif /* defined(J9VM_OPT_VALHALLA_FLATTENABLE_VALUE_TYPES) */
366367
#define IS_REF_OR_VAL_SIGNATURE(firstChar) ('L' == (firstChar))
367368

runtime/vm/classsupport.c

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -188,20 +188,8 @@ findPrimitiveArrayClass(J9JavaVM* vm, jchar sigChar)
188188
}
189189
}
190190

191-
192-
/**
193-
* @internal
194-
*
195-
* Allocates and fills in the relevant fields of an array class
196-
*/
197-
J9Class *
198-
internalCreateArrayClass(J9VMThread *vmThread, J9ROMArrayClass *romClass, J9Class *elementClass)
199-
{
200-
return internalCreateArrayClassWithOptions(vmThread, romClass, elementClass, 0);
201-
}
202-
203-
J9Class *
204-
internalCreateArrayClassWithOptions(J9VMThread *vmThread, J9ROMArrayClass *romClass, J9Class *elementClass, UDATA options)
191+
static J9Class *
192+
internalCreateArrayClassHelper(J9VMThread *vmThread, J9ROMArrayClass *romClass, J9Class *elementClass, UDATA options)
205193
{
206194
J9Class *result = NULL;
207195
j9object_t heapClass = J9VM_J9CLASS_TO_HEAPCLASS(elementClass);
@@ -217,8 +205,12 @@ internalCreateArrayClassWithOptions(J9VMThread *vmThread, J9ROMArrayClass *romCl
217205
* creating an instance of the array. Element class init must be done
218206
* before the arrayClass is created so that in the case of an init failure
219207
* the arrayClass is not temporarily exposed.
208+
* Don't try to initialize class for null-restricted array creation since
209+
* the regular arrayClass will always be created first.
220210
*/
221-
if (J9_IS_J9CLASS_ALLOW_DEFAULT_VALUE(elementClass)) {
211+
if (J9_IS_J9CLASS_ALLOW_DEFAULT_VALUE(elementClass)
212+
&& J9_ARE_NO_BITS_SET(options, J9_FINDCLASS_FLAG_CLASS_OPTION_NULL_RESTRICTED_ARRAY)
213+
) {
222214
UDATA initStatus = elementClass->initializeStatus;
223215
if ((J9ClassInitSucceeded != initStatus) && ((UDATA)vmThread != initStatus)) {
224216
initializeClass(vmThread, elementClass);
@@ -267,6 +259,31 @@ internalCreateArrayClassWithOptions(J9VMThread *vmThread, J9ROMArrayClass *romCl
267259
return result;
268260
}
269261

262+
/**
263+
* @internal
264+
*
265+
* Allocates and fills in the relevant fields of an array class
266+
*/
267+
J9Class *
268+
internalCreateArrayClass(J9VMThread *vmThread, J9ROMArrayClass *romClass, J9Class *elementClass)
269+
{
270+
return internalCreateArrayClassHelper(vmThread, romClass, elementClass, 0);
271+
}
272+
273+
J9Class *
274+
internalCreateArrayClassWithOptions(J9VMThread *vmThread, J9ROMArrayClass *romClass, J9Class *elementClass, UDATA options)
275+
{
276+
/* Create elementClass's arrayClass as a prerequisite to nullRestrictedArrayClass */
277+
if (J9_ARE_ALL_BITS_SET(options, J9_FINDCLASS_FLAG_CLASS_OPTION_NULL_RESTRICTED_ARRAY)
278+
&& (NULL == elementClass->arrayClass)
279+
) {
280+
if (NULL == internalCreateArrayClassHelper(vmThread, romClass, elementClass, 0)) {
281+
return NULL;
282+
}
283+
}
284+
return internalCreateArrayClassHelper(vmThread, romClass, elementClass, options);
285+
}
286+
270287
/**
271288
* Peek the classHashTable to see if the `className` class has already been loaded by `classLoader`.
272289
*

runtime/vm/createramclass.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2404,18 +2404,14 @@ internalCreateRAMClassDone(J9VMThread *vmThread, J9ClassLoader *classLoader, J9C
24042404
if (J9ROMCLASS_IS_ARRAY(romClass)) {
24052405
#if defined(J9VM_OPT_VALHALLA_FLATTENABLE_VALUE_TYPES)
24062406
if (J9_ARE_ALL_BITS_SET(options, J9_FINDCLASS_FLAG_CLASS_OPTION_NULL_RESTRICTED_ARRAY)) {
2407+
((J9ArrayClass *)state->ramClass)->companionArray = elementClass->arrayClass;
24072408
elementClass->nullRestrictedArrayClass = state->ramClass;
2409+
((J9ArrayClass *)elementClass->arrayClass)->companionArray = elementClass->nullRestrictedArrayClass;
24082410
} else
24092411
#endif /* defined(J9VM_OPT_VALHALLA_FLATTENABLE_VALUE_TYPES) */
24102412
{
24112413
((J9ArrayClass *)elementClass)->arrayClass = state->ramClass;
24122414
}
2413-
#if defined(J9VM_OPT_VALHALLA_FLATTENABLE_VALUE_TYPES)
2414-
if ((NULL != elementClass->nullRestrictedArrayClass) && (NULL != elementClass->arrayClass)) {
2415-
((J9ArrayClass *)elementClass->arrayClass)->companionArray = elementClass->nullRestrictedArrayClass;
2416-
((J9ArrayClass *)elementClass->nullRestrictedArrayClass)->companionArray = elementClass->arrayClass;
2417-
}
2418-
#endif /* defined(J9VM_OPT_VALHALLA_FLATTENABLE_VALUE_TYPES) */
24192415
/* Assigning into the arrayClass field creates an implicit reference to the class from its class loader */
24202416
javaVM->memoryManagerFunctions->j9gc_objaccess_postStoreClassToClassLoader(vmThread, classLoader, state->ramClass);
24212417
}

0 commit comments

Comments
 (0)