< prev index next >

src/share/vm/classfile/javaClasses.cpp

Print this page

        

@@ -833,28 +833,46 @@
     // set the classLoader field in the java_lang_Class instance
     assert(class_loader() == k->class_loader(), "should be same");
     set_class_loader(mirror(), class_loader());
 
     // set the module field in the java_lang_Class instance
-    // This may be null during bootstrap but will get fixed up later on.
-    set_module(mirror(), module());
-
-    // Setup indirection from klass->mirror last
-    // after any exceptions can happen during allocations.
-    if (!k.is_null()) {
-      k->set_java_mirror(mirror());
-    }
-
-    // Keep list of classes needing java.base module fixup.
+    if (module.is_null()) {
+      // During startup, the module may be NULL only if java.base has not been defined yet.
+      // Put the class on the fixup_module_list to patch later when the java.lang.reflect.Module
+      // for java.base is known.
+      assert(!Universe::is_module_initialized(), "Incorrect java.lang.reflect.Module pre module system initialization");
+      MutexLocker m1(Module_lock, THREAD);
+      // Keep list of classes needing java.base module fixup
     if (!ModuleEntryTable::javabase_defined()) {
       if (fixup_module_field_list() == NULL) {
         GrowableArray<Klass*>* list =
           new (ResourceObj::C_HEAP, mtModule) GrowableArray<Klass*>(500, true);
         set_fixup_module_field_list(list);
       }
       k->class_loader_data()->inc_keep_alive();
       fixup_module_field_list()->push(k());
+      } else {
+        // java.base was defined at some point between calling create_mirror()
+        // and obtaining the Module_lock, patch this particular class with java.base.
+        ModuleEntry *javabase_entry = ModuleEntryTable::javabase_moduleEntry();
+        assert(javabase_entry != NULL && javabase_entry->module() != NULL,
+               "Setting class module field, java.base should be defined");
+        Handle javabase_handle(THREAD, JNIHandles::resolve(javabase_entry->module()));
+        set_module(mirror(), javabase_handle());
+      }
+    } else {
+      assert(Universe::is_module_initialized() ||
+             (ModuleEntryTable::javabase_defined() &&
+              (module() == JNIHandles::resolve(ModuleEntryTable::javabase_moduleEntry()->module()))),
+             "Incorrect java.lang.reflect.Module specification while creating mirror");
+      set_module(mirror(), module());
+    }
+
+    // Setup indirection from klass->mirror last
+    // after any exceptions can happen during allocations.
+    if (!k.is_null()) {
+      k->set_java_mirror(mirror());
     }
   } else {
     if (fixup_mirror_list() == NULL) {
       GrowableArray<Klass*>* list =
        new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, true);
< prev index next >