--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Mon Oct 08 13:02:13 2012 -0700
+++ b/hotspot/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);