Skip to content

Commit

Permalink
Merge pull request #19625 from theresa-m/vttests_3
Browse files Browse the repository at this point in the history
VM updates for NullRestricted value types
  • Loading branch information
hangshao0 authored Jun 5, 2024
2 parents d7e7d5d + 57fc747 commit ae3e20a
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 73 deletions.
10 changes: 1 addition & 9 deletions jcl/src/java.base/share/classes/java/lang/Class.java
Original file line number Diff line number Diff line change
Expand Up @@ -5608,15 +5608,7 @@ public String descriptorString() {
name = name.substring(0, index)+ '.' + name.substring(index + 1,name.length());
}
/*[ENDIF] JAVA_SPEC_VERSION >= 15 */
if (this.isArray()) {
}
/*[IF INLINE-TYPES]*/
else if (this.isPrimitiveClass()) {
name = new StringBuilder(name.length() + 2).
append('Q').append(name).append(';').toString();
}
/*[ENDIF] INLINE-TYPES */
else {
if (!this.isArray()) {
name = new StringBuilder(name.length() + 2).
append('L').append(name).append(';').toString();
}
Expand Down
18 changes: 3 additions & 15 deletions runtime/bcutil/cfreader.c
Original file line number Diff line number Diff line change
Expand Up @@ -1876,22 +1876,10 @@ checkMethods(J9PortLibrary* portLib, J9CfrClassFile* classfile, U_8* segment, U_
}

if (nameIndexOK && utf8Equal(&classfile->constantPool[method->nameIndex], "<init>", 6)) {
#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)
/**
* The spec says a method of a value class cannot be <init>. A method of an abstract class cannot be <vnew>.
* For a value abstract class, its constructor is compiled into <init> now, so allow <init> in abstract classes.
*/
if (J9_IS_CLASSFILE_VALUETYPE(classfile) && J9_ARE_NO_BITS_SET(classfile->accessFlags, CFR_ACC_ABSTRACT)) {
errorCode = J9NLS_CFR_ERR_INIT_ON_VALUE_CLASS__ID;
/* check no invalid flags set */
if (value & ~CFR_INIT_METHOD_ACCESS_MASK) {
errorCode = J9NLS_CFR_ERR_INIT_METHOD__ID;
goto _errorFound;
} else
#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */
{
/* check no invalid flags set */
if (value & ~CFR_INIT_METHOD_ACCESS_MASK) {
errorCode = J9NLS_CFR_ERR_INIT_METHOD__ID;
goto _errorFound;
}
}

/* Java SE 9 Edition:
Expand Down
14 changes: 3 additions & 11 deletions runtime/jcl/common/java_lang_invoke_MethodHandleNatives.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -345,11 +345,7 @@ getClassSignature(J9VMThread *currentThread, J9Class * clazz)
if (J9ROMCLASS_IS_ARRAY(clazz->romClass)) {
vm->internalVMFunctions->copyStringToUTF8Helper(currentThread, sigString, J9_STR_NULL_TERMINATE_RESULT | J9_STR_XLAT, 0, J9VMJAVALANGSTRING_LENGTH(currentThread, sigString), (U_8*)sig, utfLength);
} else {
if (J9_IS_J9CLASS_PRIMITIVE_VALUETYPE(clazz)) {
sig[0] = 'Q';
} else {
sig[0] = 'L';
}
sig[0] = 'L';
vm->internalVMFunctions->copyStringToUTF8Helper(currentThread, sigString, J9_STR_XLAT, 0, J9VMJAVALANGSTRING_LENGTH(currentThread, sigString), (U_8*)(sig + 1), utfLength - 1);
sig[utfLength - 2] = ';';
sig[utfLength - 1] = '\0';
Expand Down Expand Up @@ -385,11 +381,7 @@ getClassSignature(J9VMThread *currentThread, J9Class * clazz)
}

if (*name != '[') {
if (J9_IS_J9CLASS_PRIMITIVE_VALUETYPE(myClass)) {
sig[i++] = 'Q';
} else {
sig[i++] = 'L';
}
sig[i++] = 'L';
}

memcpy(sig+i, name, nameLength);
Expand Down Expand Up @@ -1103,7 +1095,7 @@ Java_java_lang_invoke_MethodHandleNatives_resolve(
J9BytecodeVerificationData *verifyData = vm->bytecodeVerificationData;
U_16 sigOffset = 0;

/* Skip the '[', 'L', or 'Q' prefix */
/* Skip the '[' or 'L' prefix */
while ('[' == J9UTF8_DATA(signature)[sigOffset]) {
sigOffset += 1;
}
Expand Down
39 changes: 1 addition & 38 deletions runtime/vm/createramclass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1955,43 +1955,6 @@ loadFlattenableFieldValueClasses(J9VMThread *currentThread, J9ClassLoader *class
UDATA signatureLength = J9UTF8_LENGTH(signature);
if (J9_ARE_NO_BITS_SET(modifiers, J9AccStatic)) {
switch (signatureChars[0]) {
case 'Q':
{
J9Class *valueClass = internalFindClassUTF8(currentThread, signatureChars + 1, signatureLength - 2, classLoader, classPreloadFlags);
if (NULL == valueClass) {
result = FALSE;
goto done;
} else {
J9ROMClass *valueROMClass = valueClass->romClass;
/* This restriction has been relaxed from J9ROMCLASS_IS_PRIMITIVE_VALUE_TYPE
* to prevent errors while using the J9ClassAllowsInitialDefaultValue flag, which
* is reusing the value forJ9ClassIsPrimitiveValueType, to indicate
* flattening eligibility for nullrestricted fields. Eventually this case will be
* removed with Q types.
*/
if (!J9ROMCLASS_IS_VALUE(valueROMClass)) {
J9UTF8 *badClass = NNSRP_GET(valueROMClass->className, J9UTF8*);
setCurrentExceptionNLSWithArgs(currentThread, J9NLS_VM_ERROR_QTYPE_NOT_VALUE_TYPE, J9VMCONSTANTPOOL_JAVALANGINCOMPATIBLECLASSCHANGEERROR, J9UTF8_LENGTH(badClass), J9UTF8_DATA(badClass));
result = FALSE;
goto done;
}

if (!J9_IS_FIELD_FLATTENED(valueClass, field)) {
*valueTypeFlags |= (J9ClassContainsUnflattenedFlattenables | J9ClassHasReferences);
eligibleForFastSubstitutability = false;
} else if (J9_ARE_NO_BITS_SET(valueClass->classFlags, J9ClassCanSupportFastSubstitutability)) {
eligibleForFastSubstitutability = false;
}

J9FlattenedClassCacheEntry *entry = J9_VM_FCC_ENTRY_FROM_FCC(flattenedClassCache, flattenableFieldCount);
entry->clazz = valueClass;
entry->field = field;
entry->offset = UDATA_MAX;
flattenableFieldCount += 1;
}
*valueTypeFlags |= (valueClass->classFlags & (J9ClassLargestAlignmentConstraintDouble | J9ClassLargestAlignmentConstraintReference | J9ClassHasReferences));
break;
}
case 'D':
/* Fall through */
case 'J':
Expand Down Expand Up @@ -2049,7 +2012,7 @@ loadFlattenableFieldValueClasses(J9VMThread *currentThread, J9ClassLoader *class
break;
}
} else {
if ('Q' == signatureChars[0] || J9_ARE_ALL_BITS_SET(modifiers, J9FieldFlagIsNullRestricted)) {
if (J9_ARE_ALL_BITS_SET(modifiers, J9FieldFlagIsNullRestricted)) {
J9FlattenedClassCacheEntry *entry = J9_VM_FCC_ENTRY_FROM_FCC(flattenedClassCache, flattenableFieldCount);
entry->clazz = (J9Class *) J9_VM_FCC_CLASS_FLAGS_STATIC_FIELD;
entry->field = field;
Expand Down

0 comments on commit ae3e20a

Please sign in to comment.