Skip to content

Commit

Permalink
Removes nestmates host loading from class loading
Browse files Browse the repository at this point in the history
Earlier nest mates spec draft loaded a class's nest host during class
loading. More recent nest mates spec puts off host loading until
required for an access check. This commit removes the nest host loading
and verification from class loading and class verification respectively.

Signed-off-by: Talia McCormick <Talia.McCormick@ibm.com>
  • Loading branch information
Talia McCormick authored and Talia McCormick committed Apr 6, 2018
1 parent f9a7c39 commit 6d6bc09
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 105 deletions.
65 changes: 1 addition & 64 deletions runtime/vm/ClassInitialization.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,6 @@ static char const *statusNames[] = {

static j9object_t setInitStatus(J9VMThread *currentThread, J9Class *clazz, UDATA status, j9object_t initializationLock);
static void classInitStateMachine(J9VMThread *currentThread, J9Class *clazz, J9ClassInitState desiredState);
#if defined(J9VM_OPT_VALHALLA_NESTMATES)
static bool verifyNestHost(J9Class *clazz, J9VMThread *vmThread);
#endif /* J9VM_OPT_VALHALLA_NESTMATES */

void
initializeImpl(J9VMThread *currentThread, J9Class *clazz)
Expand Down Expand Up @@ -175,11 +172,7 @@ performVerification(J9VMThread *currentThread, J9Class *clazz)
setCurrentException(currentThread, J9VMCONSTANTPOOL_JAVALANGVERIFYERROR, (UDATA*)verifyErrorStringObject);
goto done;
}
#if defined(J9VM_OPT_VALHALLA_NESTMATES)
if (false == verifyNestHost(clazz, currentThread)) {
goto done;
}
#endif /* J9VM_OPT_VALHALLA_NESTMATES */

Trc_VM_verification_End(currentThread, J9UTF8_LENGTH(J9ROMCLASS_CLASSNAME(clazz->romClass)), J9UTF8_DATA(J9ROMCLASS_CLASSNAME(clazz->romClass)), clazz->classLoader);
} else {
Trc_VM_performVerification_unverifiable(currentThread);
Expand Down Expand Up @@ -619,60 +612,4 @@ classInitStateMachine(J9VMThread *currentThread, J9Class *clazz, J9ClassInitStat
Trc_VM_classInitStateMachine_Exit(currentThread);
return;
}

#if defined(J9VM_OPT_VALHALLA_NESTMATES)
static bool
verifyNestHost(J9Class *clazz, J9VMThread *vmThread)
{
J9Class *nestHost = clazz->nestHost;
bool verified = false;

/* Verification only needed if class's nest host is not itself */
if (clazz == nestHost) {
verified = true;
} else {
J9ROMClass *romClass = clazz->romClass;
J9UTF8 *className = J9ROMCLASS_CLASSNAME(romClass);
U_32 moduleName = 0;
U_32 nlsNumber = 0;

/* Nest host must have same classloader & package */
if (clazz->classLoader != nestHost->classLoader) {
Trc_VM_CreateRAMClassFromROMClass_nestHostNotSameClassLoader(vmThread, nestHost, nestHost->classLoader, clazz->classLoader);
moduleName = J9NLS_VM_NEST_HOST_HAS_DIFFERENT_CLASSLOADER__MODULE;
nlsNumber = J9NLS_VM_NEST_HOST_HAS_DIFFERENT_CLASSLOADER__ID;
} else if (clazz->packageID != nestHost->packageID) {
Trc_VM_CreateRAMClassFromROMClass_nestHostNotSamePackage(vmThread, nestHost, nestHost->classLoader, clazz->classLoader);
moduleName = J9NLS_VM_NEST_HOST_HAS_DIFFERENT_PACKAGE__MODULE;
nlsNumber = J9NLS_VM_NEST_HOST_HAS_DIFFERENT_PACKAGE__ID;
} else {
/* The nest host must have a nestmembers attribute that includes this class. */
J9SRP *nestMembers = J9ROMCLASS_NESTMEMBERS(nestHost->romClass);
U_16 nestMemberCount = nestHost->romClass->nestMemberCount;
for (U_16 i = 0; i < nestMemberCount; i++) {
J9UTF8 *nestMemberName = NNSRP_GET(nestMembers[i], J9UTF8*);
if (J9UTF8_EQUALS(className, nestMemberName)) {
verified = true;
break;
}
}
if (!verified) {
Trc_VM_CreateRAMClassFromROMClass_nestHostNotVerified(vmThread, nestHost, nestHost->classLoader, clazz->classLoader, className);
moduleName = J9NLS_VM_NEST_MEMBER_NOT_CLAIMED_BY_NEST_HOST__MODULE;
nlsNumber = J9NLS_VM_NEST_MEMBER_NOT_CLAIMED_BY_NEST_HOST__ID;
}
}

if (!verified) {
J9UTF8 *nestHostName = J9ROMCLASS_NESTHOSTNAME(romClass);
setCurrentExceptionNLSWithArgs(vmThread,
moduleName, nlsNumber,
J9VMCONSTANTPOOL_JAVALANGVERIFYERROR,
J9UTF8_LENGTH(className),J9UTF8_DATA(className),
J9UTF8_LENGTH(nestHostName), J9UTF8_DATA(className));
}
}
return verified;
}
#endif /* J9VM_OPT_VALHALLA_NESTMATES */
} /* extern "C" */
41 changes: 0 additions & 41 deletions runtime/vm/createramclass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,6 @@ static void setCurrentExceptionForBadClass(J9VMThread *vmThread, J9UTF8 *badClas
static BOOLEAN verifyClassLoadingStack(J9VMThread *vmThread, J9ClassLoader *classLoader, J9ROMClass *romClass);
static void popFromClassLoadingStack(J9VMThread *vmThread);
static VMINLINE BOOLEAN loadSuperClassAndInterfaces(J9VMThread *vmThread, J9ClassLoader *classLoader, J9ROMClass *romClass, J9Class *elementClass, UDATA packageID, BOOLEAN hotswapping, UDATA classPreloadFlags, J9Class **superclassOut, J9Module *module);
#if defined(J9VM_OPT_VALHALLA_NESTMATES)
static J9Class *loadNestHost(J9VMThread *vmThread, J9ClassLoader *classLoader, J9UTF8 *nestHostName, UDATA classPreloadFlags);
#endif /* defined(J9VM_OPT_VALHALLA_NESTMATES) */
static J9Class* internalCreateRAMClassDropAndReturn(J9VMThread *vmThread, J9ROMClass *romClass, J9CreateRAMClassState *state);
static J9Class* internalCreateRAMClassDoneNoMutex(J9VMThread *vmThread, J9ROMClass *romClass, UDATA options, J9CreateRAMClassState *state);
static J9Class* internalCreateRAMClassDone(J9VMThread *vmThread, J9ClassLoader *classLoader, J9ROMClass *romClass, UDATA options, J9Class *elementClass,
Expand Down Expand Up @@ -1613,16 +1610,6 @@ loadSuperClassAndInterfaces(J9VMThread *vmThread, J9ClassLoader *classLoader, J9
return TRUE;
}

#if defined(J9VM_OPT_VALHALLA_NESTMATES)
static J9Class *
loadNestHost(J9VMThread *vmThread, J9ClassLoader *classLoader, J9UTF8 *nestHostName, UDATA classPreloadFlags)
{
J9Class *nestHost = internalFindClassUTF8(vmThread, J9UTF8_DATA(nestHostName), J9UTF8_LENGTH(nestHostName), classLoader, classPreloadFlags);
Trc_VM_CreateRAMClassFromROMClass_nestHostLoaded(vmThread, J9UTF8_LENGTH(nestHostName), J9UTF8_DATA(nestHostName), nestHost);
return nestHost;
}
#endif

static J9Class*
internalCreateRAMClassDropAndReturn(J9VMThread *vmThread, J9ROMClass *romClass, J9CreateRAMClassState *state)
{
Expand Down Expand Up @@ -2324,34 +2311,6 @@ internalCreateRAMClassFromROMClassImpl(J9VMThread *vmThread, J9ClassLoader *clas
ramClass->hostClass = ramClass;
}

#if defined(J9VM_OPT_VALHALLA_NESTMATES)
{
J9Class *nestHost = NULL;
J9UTF8 *nestHostName = J9ROMCLASS_NESTHOSTNAME(romClass);

/* If no nest host is named, class is own nest host */
if (NULL == nestHostName) {
nestHost = ramClass;
} else {
UDATA nestHostClassPreloadFlags = 0;
if (hotswapping) {
nestHostClassPreloadFlags = J9_FINDCLASS_FLAG_EXISTING_ONLY;
} else {
nestHostClassPreloadFlags = J9_FINDCLASS_FLAG_THROW_ON_FAIL;
if (classLoader != javaVM->systemClassLoader) {
nestHostClassPreloadFlags |= J9_FINDCLASS_FLAG_CHECK_PKG_ACCESS;
}
}
nestHost = loadNestHost(vmThread, hostClassLoader, nestHostName, nestHostClassPreloadFlags);
}
/* If nest host loading failed, an exception has been set; end loading early */
if (NULL == nestHost) {
return internalCreateRAMClassDone(vmThread, classLoader, romClass, options, elementClass, className, state);
}
ramClass->nestHost = nestHost;
}
#endif /* defined(J9VM_OPT_VALHALLA_NESTMATES) */

/* Initialize the methods. */
if (romClass->romMethodCount != 0) {
J9Method *currentRAMMethod = ramClass->ramMethods;
Expand Down

0 comments on commit 6d6bc09

Please sign in to comment.