@@ -188,20 +188,8 @@ findPrimitiveArrayClass(J9JavaVM* vm, jchar sigChar)
188
188
}
189
189
}
190
190
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 )
205
193
{
206
194
J9Class * result = NULL ;
207
195
j9object_t heapClass = J9VM_J9CLASS_TO_HEAPCLASS (elementClass );
@@ -217,8 +205,12 @@ internalCreateArrayClassWithOptions(J9VMThread *vmThread, J9ROMArrayClass *romCl
217
205
* creating an instance of the array. Element class init must be done
218
206
* before the arrayClass is created so that in the case of an init failure
219
207
* 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.
220
210
*/
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
+ ) {
222
214
UDATA initStatus = elementClass -> initializeStatus ;
223
215
if ((J9ClassInitSucceeded != initStatus ) && ((UDATA )vmThread != initStatus )) {
224
216
initializeClass (vmThread , elementClass );
@@ -267,6 +259,31 @@ internalCreateArrayClassWithOptions(J9VMThread *vmThread, J9ROMArrayClass *romCl
267
259
return result ;
268
260
}
269
261
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
+
270
287
/**
271
288
* Peek the classHashTable to see if the `className` class has already been loaded by `classLoader`.
272
289
*
0 commit comments