Skip to content

Commit 22421bd

Browse files
authored
Merge pull request #22762 from theresa-m/strictfields_5
Instance strict field support
2 parents 543cd8b + c4139f7 commit 22421bd

File tree

12 files changed

+358
-20
lines changed

12 files changed

+358
-20
lines changed

runtime/bcverify/bcverify.c

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ static IDATA simulateStack (J9BytecodeVerificationData * verifyData);
8686
static IDATA parseOptions (J9JavaVM *vm, char *optionValues, const char **errorString);
8787
static IDATA setVerifyState ( J9JavaVM *vm, char *option, const char **errorString );
8888

89+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
90+
static UDATA strictFieldHashFn(void *key, void *userData);
91+
static UDATA strictFieldHashEqualFn(void *leftKey, void *rightKey, void *userData);
92+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
8993

9094
/**
9195
* Walk the J9-format stack maps and set the uninitialized_this flag appropriately
@@ -2302,9 +2306,12 @@ j9bcv_freeVerificationData (J9PortLibrary * portLib, J9BytecodeVerificationData
23022306
{
23032307
PORT_ACCESS_FROM_PORT(portLib);
23042308
if (verifyData) {
2309+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
2310+
hashTableFree(verifyData->strictFields);
2311+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
23052312
#ifdef J9VM_THR_PREEMPTIVE
23062313
JavaVM* jniVM = (JavaVM*)verifyData->javaVM;
2307-
J9ThreadEnv* threadEnv;
2314+
J9ThreadEnv* threadEnv;
23082315
(*jniVM)->GetEnv(jniVM, (void**)&threadEnv, J9THREAD_VERSION_1_1);
23092316

23102317
threadEnv->monitor_destroy( verifyData->verifierMutex );
@@ -2344,6 +2351,22 @@ j9bcv_initializeVerificationData(J9JavaVM* javaVM)
23442351
goto error_no_memory;
23452352
}
23462353
#endif
2354+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
2355+
verifyData->strictFieldsUnsetCount = 0;
2356+
verifyData->strictFields = hashTableNew(
2357+
OMRPORT_FROM_J9PORT(PORTLIB),
2358+
J9_GET_CALLSITE(),
2359+
0,
2360+
sizeof(J9StrictFieldEntry),
2361+
0, 0,
2362+
J9MEM_CATEGORY_CLASSES,
2363+
strictFieldHashFn,
2364+
strictFieldHashEqualFn,
2365+
NULL, javaVM);
2366+
if (NULL == verifyData->strictFields) {
2367+
goto error_no_memory;
2368+
}
2369+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
23472370

23482371
verifyData->verifyBytecodesFunction = j9bcv_verifyBytecodes;
23492372
verifyData->checkClassLoadingConstraintForNameFunction = j9bcv_checkClassLoadingConstraintForName;
@@ -2417,6 +2440,9 @@ j9bcv_verifyBytecodes (J9PortLibrary * portLib, J9Class * clazz, J9ROMClass * ro
24172440
BOOLEAN classVersionRequiresStackmaps = romClass->majorVersion >= CFR_MAJOR_VERSION_REQUIRING_STACKMAPS;
24182441
BOOLEAN newFormat = (classVersionRequiresStackmaps || hasStackMaps);
24192442
BOOLEAN verboseVerification = (J9_VERIFY_VERBOSE_VERIFICATION == (verifyData->verificationFlags & J9_VERIFY_VERBOSE_VERIFICATION));
2443+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
2444+
BOOLEAN addToStrictFieldTable = TRUE;
2445+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
24202446

24212447
PORT_ACCESS_FROM_PORT(portLib);
24222448

@@ -2575,6 +2601,11 @@ j9bcv_verifyBytecodes (J9PortLibrary * portLib, J9Class * clazz, J9ROMClass * ro
25752601
if (isInitMethod) {
25762602
/* CMVC 199785: Jazz103 45899: Only run this when the stack has been built correctly */
25772603
setInitializedThisStatus(verifyData);
2604+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
2605+
if (J9_CLASSFILE_OR_ROMCLASS_SUPPORTS_STRICT_FIELDS(romClass)) {
2606+
createOrResetStrictFieldsList(verifyData, &addToStrictFieldTable);
2607+
}
2608+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
25782609
}
25792610

25802611
if (newFormat && verboseVerification) {
@@ -2869,4 +2900,19 @@ bcvHookClassesUnload(J9HookInterface** hook, UDATA eventNum, void* eventData, vo
28692900
}
28702901
#endif /* J9VM_GC_DYNAMIC_CLASS_UNLOADING */
28712902

2903+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
2904+
static UDATA strictFieldHashFn(void *key, void *userData)
2905+
{
2906+
J9StrictFieldEntry *entry = key;
2907+
J9JavaVM *vm = userData;
2908+
return J9_VM_FUNCTION_VIA_JAVAVM(vm, computeHashForUTF8)(J9UTF8_DATA(entry->nameutf8), J9UTF8_LENGTH(entry->nameutf8));
2909+
}
2910+
2911+
static UDATA strictFieldHashEqualFn(void *leftKey, void *rightKey, void *userData) {
2912+
J9StrictFieldEntry *leftEntry = leftKey;
2913+
J9StrictFieldEntry *rightEntry = rightKey;
2914+
return J9UTF8_EQUALS(leftEntry->nameutf8, rightEntry->nameutf8);
2915+
}
2916+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
2917+
28722918

runtime/bcverify/rtverify.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,9 @@ verifyBytecodes (J9BytecodeVerificationData * verifyData)
471471
UDATA errorStackIndex = (UDATA)-1;
472472
UDATA errorTempData = (UDATA)-1;
473473
BOOLEAN isNextStack = FALSE;
474+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
475+
BOOLEAN anotherInstanceInitCalled = FALSE;
476+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
474477

475478
Trc_RTV_verifyBytecodes_Entry(verifyData->vmStruct,
476479
(UDATA) J9UTF8_LENGTH(J9ROMMETHOD_NAME(romMethod)),
@@ -1457,7 +1460,11 @@ verifyBytecodes (J9BytecodeVerificationData * verifyData)
14571460
stackTop = pushFieldType(verifyData, utf8string, stackTop);
14581461
}
14591462

1460-
rc = isFieldAccessCompatible (verifyData, (J9ROMFieldRef *) info, bc, receiver, &reasonCode);
1463+
rc = isFieldAccessCompatible (verifyData, (J9ROMFieldRef *) info, bc, receiver, &reasonCode
1464+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
1465+
, isInitMethod, anotherInstanceInitCalled
1466+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
1467+
);
14611468
if (BCV_ERR_INSUFFICIENT_MEMORY == reasonCode) {
14621469
goto _outOfMemoryError;
14631470
}
@@ -1676,8 +1683,8 @@ verifyBytecodes (J9BytecodeVerificationData * verifyData)
16761683
}
16771684
}
16781685

1679-
/* Ensure the <init> method is either for this class or its direct super class */
16801686
if (type & BCV_SPECIAL_INIT) {
1687+
/* Ensure the <init> method is either for this class or its direct super class. */
16811688
UDATA superClassIndex = 0;
16821689

16831690
utf8string = J9ROMSTRINGREF_UTF8DATA(classRef);
@@ -1695,6 +1702,23 @@ verifyBytecodes (J9BytecodeVerificationData * verifyData)
16951702
errorStackIndex = stackTop - liveStack->stackElements;
16961703
goto _inconsistentStack2;
16971704
}
1705+
1706+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
1707+
if (J9_CLASSFILE_OR_ROMCLASS_SUPPORTS_STRICT_FIELDS(verifyData->romClass)) {
1708+
if (classIndex == superClassIndex) {
1709+
/* All strict instance fields must be assigned before
1710+
* invoking the <init> method of a superclass.
1711+
*/
1712+
if (verifyData->strictFieldsUnsetCount > 0) {
1713+
errorType = J9NLS_BCV_ERR_BAD_INVOKESPECIAL__ID;
1714+
verboseErrorCode = BCV_ERR_STRICT_FIELDS_UNASSIGNED;
1715+
goto _miscError;
1716+
}
1717+
} else {
1718+
anotherInstanceInitCalled = TRUE;
1719+
}
1720+
}
1721+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
16981722
}
16991723

17001724
/* This invoke special will make all copies of this "type" on the stack a real

runtime/bcverify/vrfyhelp.c

Lines changed: 84 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -888,14 +888,27 @@ j9bcv_createVerifyErrorString(J9PortLibrary * portLib, J9BytecodeVerificationDat
888888
/*
889889
* Validates field access compatibility
890890
*
891+
* Update strictFields map for putfield
892+
* bytecode of strict final fields.
893+
*
891894
* returns TRUE if class are compatible
892895
* returns FALSE it not compatible
893896
* reasonCode (set by isClassCompatibleByName) is:
894897
* BCV_ERR_INSUFFICIENT_MEMORY :in OOM error case
895898
*/
896899
IDATA
897-
isFieldAccessCompatible(J9BytecodeVerificationData *verifyData, J9ROMFieldRef *fieldRef, UDATA bytecode, UDATA receiver, IDATA *reasonCode)
898-
{
900+
isFieldAccessCompatible(
901+
J9BytecodeVerificationData *verifyData,
902+
J9ROMFieldRef *fieldRef,
903+
UDATA bytecode,
904+
UDATA receiver,
905+
IDATA *reasonCode
906+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
907+
,
908+
BOOLEAN isInitMethod,
909+
BOOLEAN anotherInstanceInitCalled
910+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
911+
) {
899912
J9ROMClass *romClass = verifyData->romClass;
900913
J9ROMConstantPoolItem *constantPool = (J9ROMConstantPoolItem *)(romClass + 1);
901914
J9UTF8 *utf8string = J9ROMCLASSREF_NAME((J9ROMClassRef *)&constantPool[fieldRef->classRefCPIndex]);
@@ -907,14 +920,32 @@ isFieldAccessCompatible(J9BytecodeVerificationData *verifyData, J9ROMFieldRef *f
907920
J9ROMFieldShape *field = findFieldFromCurrentRomClass(romClass, fieldRef);
908921

909922
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
910-
/* A field declared by the current class with ACC_FINAL and ACC_STRICT flags
911-
* can't be set unless the initialization state is early larval.
912-
*/
913-
if ((NULL != field)
914-
&& J9ROMFIELD_IS_STRICT_FINAL(romClass, field->modifiers)
915-
&& (FALSE == liveStack->uninitializedThis)
923+
if (J9_CLASSFILE_OR_ROMCLASS_SUPPORTS_STRICT_FIELDS(verifyData->romClass)
924+
&& (NULL != field) && J9ROMFIELD_IS_STRICT(field->modifiers)
916925
) {
917-
return (IDATA)FALSE;
926+
/* A strict final field cannot be set in the following cases:
927+
* - the initialization state is not early larval
928+
* - another instance initialization method has been called
929+
*/
930+
if (J9_ARE_ALL_BITS_SET(field->modifiers, J9AccFinal)) {
931+
if ((FALSE == liveStack->uninitializedThis)
932+
|| (TRUE == anotherInstanceInitCalled)
933+
) {
934+
return (IDATA)FALSE;
935+
}
936+
}
937+
938+
if (isInitMethod && (TRUE == liveStack->uninitializedThis)) {
939+
J9UTF8 *fieldName = J9ROMNAMEANDSIGNATURE_NAME(J9ROMFIELDREF_NAMEANDSIGNATURE(fieldRef));
940+
J9StrictFieldEntry query = {0};
941+
query.nameutf8 = fieldName;
942+
J9StrictFieldEntry *entry = hashTableFind(verifyData->strictFields, &query);
943+
if ((NULL != entry) && (FALSE == entry->isSet)) {
944+
Assert_RTV_true(verifyData->strictFieldsUnsetCount > 0);
945+
entry->isSet = TRUE;
946+
verifyData->strictFieldsUnsetCount--;
947+
}
948+
}
918949
}
919950
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
920951

@@ -1259,3 +1290,47 @@ findFieldFromCurrentRomClass(J9ROMClass *romClass, J9ROMFieldRef *field)
12591290

12601291
return currentField;
12611292
}
1293+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
1294+
1295+
void
1296+
createOrResetStrictFieldsList(J9BytecodeVerificationData *verifyData, BOOLEAN *addToStrictFieldTable)
1297+
{
1298+
if (*addToStrictFieldTable) {
1299+
/* Fields only need to be added to the hash table once per class. */
1300+
*addToStrictFieldTable = FALSE;
1301+
1302+
/* Clear map entries from the last class. */
1303+
J9HashTableState hashTableState = {0};
1304+
J9StrictFieldEntry *entry = (J9StrictFieldEntry *)hashTableStartDo(verifyData->strictFields, &hashTableState);
1305+
while (NULL != entry) {
1306+
hashTableDoRemove(&hashTableState);
1307+
entry = hashTableNextDo(&hashTableState);
1308+
}
1309+
1310+
/* Create strictFields map of all strict instance fields. */
1311+
J9ROMFieldWalkState fieldWalkState = {0};
1312+
J9ROMFieldShape *field = romFieldsStartDo(verifyData->romClass, &fieldWalkState);
1313+
while (NULL != field) {
1314+
if (J9ROMFIELD_IS_STRICT(field->modifiers) && J9_ARE_NO_BITS_SET(field->modifiers, J9AccStatic)) {
1315+
J9UTF8 *fieldName = J9ROMFIELDSHAPE_NAME(field);
1316+
J9StrictFieldEntry newEntry = {0};
1317+
newEntry.nameutf8 = fieldName;
1318+
newEntry.isSet = FALSE;
1319+
hashTableAdd(verifyData->strictFields, &newEntry);
1320+
}
1321+
field = romFieldsNextDo(&fieldWalkState);
1322+
}
1323+
} else {
1324+
/* Reset strictFields map and counter to be reused by another <init> method
1325+
* by marking all isSet flags as false.
1326+
*/
1327+
J9HashTableState hashTableState = {0};
1328+
J9StrictFieldEntry *entry = (J9StrictFieldEntry *)hashTableStartDo(verifyData->strictFields, &hashTableState);
1329+
while (NULL != entry) {
1330+
entry->isSet = FALSE;
1331+
entry = hashTableNextDo(&hashTableState);
1332+
}
1333+
}
1334+
verifyData->strictFieldsUnsetCount = hashTableGetCount(verifyData->strictFields);
1335+
}
1336+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */

runtime/oti/bcverify.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ typedef struct J9BranchTargetStack {
5353
UDATA stackElements[1];
5454
} J9BranchTargetStack;
5555

56+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
57+
typedef struct J9StrictFieldEntry {
58+
J9UTF8* nameutf8;
59+
BOOLEAN isSet; /* isSet is not used for a query. */
60+
} J9StrictFieldEntry;
61+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
62+
5663
#define BCV_TARGET_STACK_HEADER_UDATA_SIZE 4
5764
#define BCV_STACK_OVERFLOW_BUFFER_UDATA_SIZE 2
5865

runtime/oti/bcverify_api.h

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,10 +414,26 @@ isClassCompatibleByName(J9BytecodeVerificationData *verifyData, UDATA sourceClas
414414
* @param receiver
415415
* @param reasonCode
416416
* output parameter denoting error conditions
417+
* @param isInitMethod
418+
* true if the current method is <init>
419+
* @param anotherInstanceInitCalled
420+
* true if the current method is <init> and another
421+
* instance <init> has been called in this method
417422
* @return IDATA
418423
*/
419424
IDATA
420-
isFieldAccessCompatible(J9BytecodeVerificationData * verifyData, J9ROMFieldRef * fieldRef, UDATA bytecode, UDATA receiver, IDATA *reasonCode);
425+
isFieldAccessCompatible(
426+
J9BytecodeVerificationData *verifyData,
427+
J9ROMFieldRef *fieldRef,
428+
UDATA bytecode,
429+
UDATA receiver,
430+
IDATA *reasonCode
431+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
432+
,
433+
BOOLEAN isInitMethod,
434+
BOOLEAN anotherInstanceInitCalled
435+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
436+
);
421437

422438
/**
423439
* @brief
@@ -494,6 +510,20 @@ pushLdcType(J9BytecodeVerificationData *verifyData, J9ROMClass * romClass, UDATA
494510
UDATA*
495511
pushReturnType(J9BytecodeVerificationData *verifyData, J9UTF8 * utf8string, UDATA * stackTop);
496512

513+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
514+
/**
515+
* Create or reset the list of strict instance fields for the class being
516+
* verified. This list is used to track which strict fields have been
517+
* set during the early larval state.
518+
*
519+
* @param verifyData information about the class being verified.
520+
* @param addToStrictFieldTable true if this is the first <init> found in the class, false otherwise.
521+
* @return void
522+
*/
523+
void
524+
createOrResetStrictFieldsList(J9BytecodeVerificationData *verifyData, BOOLEAN *addToStrictFieldTable);
525+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
526+
497527
/**
498528
* Classification of Unicode characters for use in Java identifiers.
499529
*/

runtime/oti/j9.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -373,10 +373,7 @@ static const struct { \
373373
#define IS_CLASS_SIGNATURE(firstChar) ('L' == (firstChar))
374374

375375
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
376-
/* TODO Update the class version check if strict fields is released before value types. */
377-
#define J9ROMFIELD_IS_STRICT_FINAL(romClassOrClassfile, fieldModifiers) \
378-
(J9_IS_CLASSFILE_OR_ROMCLASS_VALUETYPE_VERSION(romClassOrClassfile) \
379-
&& J9_ARE_ALL_BITS_SET(fieldModifiers, J9AccStrictInit | J9AccFinal))
376+
#define J9ROMFIELD_IS_STRICT(fieldModifiers) J9_ARE_ALL_BITS_SET(fieldModifiers, J9AccStrictInit)
380377
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
381378

382379
#if defined(J9VM_OPT_CRIU_SUPPORT)

runtime/oti/j9consts.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,9 @@ extern "C" {
600600
#define BCV_ERR_BYTECODE_ERROR -34
601601
#define BCV_ERR_NEW_OJBECT_MISMATCH -35
602602
#define BCV_ERR_INIT_FLAGS_MISMATCH -36
603+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
604+
#define BCV_ERR_STRICT_FIELDS_UNASSIGNED -37
605+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
603606

604607
#define J9_GC_OBJ_HEAP_HOLE 0x1
605608
#define J9_GC_MULTI_SLOT_HOLE 0x1
@@ -984,6 +987,7 @@ extern "C" {
984987
#define VALUE_TYPES_MAJOR_VERSION (44 + 26)
985988
#define PREVIEW_MINOR_VERSION 65535
986989
#define J9_IS_CLASSFILE_OR_ROMCLASS_VALUETYPE_VERSION(classfileOrRomClass) (((classfileOrRomClass)->majorVersion >= VALUE_TYPES_MAJOR_VERSION) && (PREVIEW_MINOR_VERSION == (classfileOrRomClass)->minorVersion))
990+
#define J9_CLASSFILE_OR_ROMCLASS_SUPPORTS_STRICT_FIELDS(classfileOrRomClass) J9_IS_CLASSFILE_OR_ROMCLASS_VALUETYPE_VERSION(classfileOrRomClass)
987991

988992
#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)
989993
/* Constants for java.lang.reflect.Field flags */

runtime/oti/j9nonbuilder.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2189,6 +2189,10 @@ typedef struct J9BytecodeVerificationData {
21892189
struct J9PortLibrary * portLib;
21902190
struct J9JavaVM* javaVM;
21912191
BOOLEAN createdStackMap;
2192+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
2193+
J9HashTable *strictFields;
2194+
UDATA strictFieldsUnsetCount;
2195+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
21922196
} J9BytecodeVerificationData;
21932197

21942198
typedef struct J9BytecodeOffset {

runtime/verbose/errormessageframeworkrtv.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,11 @@ generateJ9RtvExceptionDetails(J9BytecodeVerificationData* verifyData, U_8* initM
947947
case BCV_ERR_NEW_OJBECT_MISMATCH:
948948
printMessage(&msgBuf, "The arity (0x%x) of the new object is greater than zero", verifyData->errorTempData);
949949
break;
950+
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
951+
case BCV_ERR_STRICT_FIELDS_UNASSIGNED:
952+
printMessage(&msgBuf, "All strict final fields must be initialized before super().");
953+
break;
954+
#endif /* defined(J9VM_OPT_VALHALLA_STRICT_FIELDS) */
950955
default:
951956
Assert_VRB_ShouldNeverHappen();
952957
break;

runtime/vm/createramclass.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3697,8 +3697,7 @@ internalCreateRAMClassFromROMClassImpl(J9VMThread *vmThread, J9ClassLoader *clas
36973697
}
36983698

36993699
#if defined(J9VM_OPT_VALHALLA_STRICT_FIELDS)
3700-
/* TODO Update the class version check if strict fields is released before value types. */
3701-
if (J9_IS_CLASSFILE_OR_ROMCLASS_VALUETYPE_VERSION(romClass)) {
3700+
if (J9_CLASSFILE_OR_ROMCLASS_SUPPORTS_STRICT_FIELDS(romClass)) {
37023701
J9ROMFieldWalkState fieldWalkState = {0};
37033702
J9ROMFieldShape *field = romFieldsStartDo(romClass, &fieldWalkState);
37043703
while (NULL != field) {

0 commit comments

Comments
 (0)