--- a/hotspot/src/share/vm/memory/universe.cpp Thu Jan 27 13:42:28 2011 -0800
+++ b/hotspot/src/share/vm/memory/universe.cpp Thu Jan 27 16:11:27 2011 -0800
@@ -59,7 +59,6 @@
#include "oops/methodKlass.hpp"
#include "oops/objArrayKlassKlass.hpp"
#include "oops/oop.inline.hpp"
-#include "oops/symbolKlass.hpp"
#include "oops/typeArrayKlass.hpp"
#include "oops/typeArrayKlassKlass.hpp"
#include "prims/jvmtiRedefineClassesTrace.hpp"
@@ -108,7 +107,6 @@
klassOop Universe::_doubleArrayKlassObj = NULL;
klassOop Universe::_typeArrayKlassObjs[T_VOID+1] = { NULL /*, NULL...*/ };
klassOop Universe::_objectArrayKlassObj = NULL;
-klassOop Universe::_symbolKlassObj = NULL;
klassOop Universe::_methodKlassObj = NULL;
klassOop Universe::_constMethodKlassObj = NULL;
klassOop Universe::_methodDataKlassObj = NULL;
@@ -155,7 +153,6 @@
oop Universe::_arithmetic_exception_instance = NULL;
oop Universe::_virtual_machine_error_instance = NULL;
oop Universe::_vm_exception = NULL;
-oop Universe::_emptySymbol = NULL;
// These variables are guarded by FullGCALot_lock.
debug_only(objArrayOop Universe::_fullgc_alot_dummy_array = NULL;)
@@ -190,7 +187,6 @@
void Universe::system_classes_do(void f(klassOop)) {
- f(symbolKlassObj());
f(methodKlassObj());
f(constMethodKlassObj());
f(methodDataKlassObj());
@@ -242,7 +238,6 @@
}
}
}
- f->do_oop((oop*)&_symbolKlassObj);
f->do_oop((oop*)&_methodKlassObj);
f->do_oop((oop*)&_constMethodKlassObj);
f->do_oop((oop*)&_methodDataKlassObj);
@@ -279,7 +274,6 @@
f->do_oop((oop*)&_main_thread_group);
f->do_oop((oop*)&_system_thread_group);
f->do_oop((oop*)&_vm_exception);
- f->do_oop((oop*)&_emptySymbol);
debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);)
}
@@ -312,10 +306,6 @@
_instanceKlassKlassObj = instanceKlassKlass::create_klass(CHECK);
_typeArrayKlassKlassObj = typeArrayKlassKlass::create_klass(CHECK);
- _symbolKlassObj = symbolKlass::create_klass(CHECK);
-
- _emptySymbol = oopFactory::new_symbol("", CHECK);
-
_boolArrayKlassObj = typeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK);
_charArrayKlassObj = typeArrayKlass::create_klass(T_CHAR, sizeof(jchar), CHECK);
_singleArrayKlassObj = typeArrayKlass::create_klass(T_FLOAT, sizeof(jfloat), CHECK);
@@ -349,13 +339,6 @@
_the_empty_system_obj_array = oopFactory::new_system_objArray(0, CHECK);
_the_array_interfaces_array = oopFactory::new_system_objArray(2, CHECK);
- _vm_exception = oopFactory::new_symbol("vm exception holder", CHECK);
- } else {
- FileMapInfo *mapinfo = FileMapInfo::current_info();
- char* buffer = mapinfo->region_base(CompactingPermGenGen::md);
- void** vtbl_list = (void**)buffer;
- init_self_patching_vtbl_list(vtbl_list,
- CompactingPermGenGen::vtbl_list_size);
}
}
@@ -449,15 +432,15 @@
if (JDK_Version::is_partially_initialized()) {
uint8_t jdk_version;
klassOop k = SystemDictionary::resolve_or_null(
- vmSymbolHandles::java_lang_management_MemoryUsage(), THREAD);
+ vmSymbols::java_lang_management_MemoryUsage(), THREAD);
CLEAR_PENDING_EXCEPTION; // ignore exceptions
if (k == NULL) {
k = SystemDictionary::resolve_or_null(
- vmSymbolHandles::java_lang_CharSequence(), THREAD);
+ vmSymbols::java_lang_CharSequence(), THREAD);
CLEAR_PENDING_EXCEPTION; // ignore exceptions
if (k == NULL) {
k = SystemDictionary::resolve_or_null(
- vmSymbolHandles::java_lang_Shutdown(), THREAD);
+ vmSymbols::java_lang_Shutdown(), THREAD);
CLEAR_PENDING_EXCEPTION; // ignore exceptions
if (k == NULL) {
jdk_version = 2;
@@ -520,11 +503,16 @@
}
-static inline void add_vtable(void** list, int* n, Klass* o, int count) {
- list[(*n)++] = *(void**)&o->vtbl_value();
- guarantee((*n) <= count, "vtable list too small.");
+static inline void* dereference(void* addr) {
+ return *(void**)addr;
}
+static inline void add_vtable(void** list, int* n, void* o, int count) {
+ guarantee((*n) < count, "vtable list too small");
+ void* vtable = dereference(o);
+ assert(dereference(vtable) != NULL, "invalid vtable");
+ list[(*n)++] = vtable;
+}
void Universe::init_self_patching_vtbl_list(void** list, int count) {
int n = 0;
@@ -535,7 +523,6 @@
{ instanceKlass o; add_vtable(list, &n, &o, count); }
{ instanceRefKlass o; add_vtable(list, &n, &o, count); }
{ typeArrayKlassKlass o; add_vtable(list, &n, &o, count); }
- { symbolKlass o; add_vtable(list, &n, &o, count); }
{ typeArrayKlass o; add_vtable(list, &n, &o, count); }
{ methodKlass o; add_vtable(list, &n, &o, count); }
{ constMethodKlass o; add_vtable(list, &n, &o, count); }
@@ -544,6 +531,11 @@
{ objArrayKlass o; add_vtable(list, &n, &o, count); }
{ methodDataKlass o; add_vtable(list, &n, &o, count); }
{ compiledICHolderKlass o; add_vtable(list, &n, &o, count); }
+#ifndef PRODUCT
+ // In non-product builds CHeapObj is derived from AllocatedObj,
+ // so symbols in CDS archive should have their vtable pointer patched.
+ { Symbol o; add_vtable(list, &n, &o, count); }
+#endif
}
@@ -633,8 +625,8 @@
JavaCalls::call_static(
&result,
finalizer_klass,
- vmSymbolHandles::run_finalizers_on_exit_name(),
- vmSymbolHandles::void_method_signature(),
+ vmSymbols::run_finalizers_on_exit_name(),
+ vmSymbols::void_method_signature(),
THREAD
);
// Ignore any pending exceptions
@@ -1037,7 +1029,7 @@
// Setup preallocated empty java.lang.Class array
Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false);
// Setup preallocated OutOfMemoryError errors
- k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_OutOfMemoryError(), true, CHECK_false);
+ k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_OutOfMemoryError(), true, CHECK_false);
k_h = instanceKlassHandle(THREAD, k);
Universe::_out_of_memory_error_java_heap = k_h->allocate_permanent_instance(CHECK_false);
Universe::_out_of_memory_error_perm_gen = k_h->allocate_permanent_instance(CHECK_false);
@@ -1047,15 +1039,15 @@
// Setup preallocated NullPointerException
// (this is currently used for a cheap & dirty solution in compiler exception handling)
- k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_NullPointerException(), true, CHECK_false);
+ k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_NullPointerException(), true, CHECK_false);
Universe::_null_ptr_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false);
// Setup preallocated ArithmeticException
// (this is currently used for a cheap & dirty solution in compiler exception handling)
- k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_ArithmeticException(), true, CHECK_false);
+ k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ArithmeticException(), true, CHECK_false);
Universe::_arithmetic_exception_instance = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false);
// Virtual Machine Error for when we get into a situation we can't resolve
k = SystemDictionary::resolve_or_fail(
- vmSymbolHandles::java_lang_VirtualMachineError(), true, CHECK_false);
+ vmSymbols::java_lang_VirtualMachineError(), true, CHECK_false);
bool linked = instanceKlass::cast(k)->link_class_or_fail(CHECK_false);
if (!linked) {
tty->print_cr("Unable to link/verify VirtualMachineError class");
@@ -1063,6 +1055,9 @@
}
Universe::_virtual_machine_error_instance =
instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false);
+
+ Universe::_vm_exception = instanceKlass::cast(k)->allocate_permanent_instance(CHECK_false);
+
}
if (!DumpSharedSpaces) {
// These are the only Java fields that are currently set during shared space dumping.
@@ -1117,7 +1112,7 @@
// Note: No race-condition here, since a resolve will always return the same result
// Setup method for security checks
- k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_reflect_Method(), true, CHECK_false);
+ k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_reflect_Method(), true, CHECK_false);
k_h = instanceKlassHandle(THREAD, k);
k_h->link_class(CHECK_false);
m = k_h->find_method(vmSymbols::invoke_name(), vmSymbols::object_object_array_object_signature());