diff src/share/vm/classfile/systemDictionary.cpp @ 6847:65d07d9ee446

8000263: JSR 292: signature types may appear to be unloaded Reviewed-by: kvn, jrose
author twisti
date Mon, 08 Oct 2012 17:04:00 -0700
parents f6b0eb4e44cf
children 19eb999cb72c
line wrap: on
line diff
--- a/src/share/vm/classfile/systemDictionary.cpp	Mon Oct 08 13:02:13 2012 -0700
+++ b/src/share/vm/classfile/systemDictionary.cpp	Mon Oct 08 17:04:00 2012 -0700
@@ -973,9 +973,12 @@
     if (sid != vmSymbols::NO_SID) {
       Klass* k = NULL;
       switch (sid) {
-        #define WK_KLASS_CASE(name, symbol, ignore_option) \
+        #define WK_KLASS_CASE(name, symbol, option) \
         case vmSymbols::VM_SYMBOL_ENUM_NAME(symbol): \
-          k = WK_KLASS(name); break;
+          if (option == Pre_Link) { \
+            k = WK_KLASS(name); \
+          } \
+          break;
         WK_KLASSES_DO(WK_KLASS_CASE)
         #undef WK_KLASS_CASE
       }
@@ -1955,6 +1958,16 @@
   start_id = limit_id;
 }
 
+#ifdef ASSERT
+void SystemDictionary::check_wk_pre_link_klasses() {
+  #define WK_KLASS_CHECK(name, symbol, option) \
+    if (option == Pre_Link) { \
+      assert(name()->is_public(), ""); \
+    }
+  WK_KLASSES_DO(WK_KLASS_CHECK);
+  #undef WK_KLASS_CHECK
+}
+#endif
 
 void SystemDictionary::initialize_preloaded_classes(TRAPS) {
   assert(WK_KLASS(Object_klass) == NULL, "preloaded classes should only be initialized once");
@@ -2010,6 +2023,8 @@
 
   initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK);
 
+  check_wk_pre_link_klasses();
+
   _box_klasses[T_BOOLEAN] = WK_KLASS(Boolean_klass);
   _box_klasses[T_CHAR]    = WK_KLASS(Character_klass);
   _box_klasses[T_FLOAT]   = WK_KLASS(Float_klass);