--- a/hotspot/src/share/vm/classfile/javaClasses.cpp Fri Apr 11 09:56:35 2008 -0400
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Sun Apr 13 17:43:42 2008 -0400
@@ -520,16 +520,12 @@
JavaThread* java_lang_Thread::thread(oop java_thread) {
- return (JavaThread*) java_thread->obj_field(_eetop_offset);
+ return (JavaThread*)java_thread->address_field(_eetop_offset);
}
void java_lang_Thread::set_thread(oop java_thread, JavaThread* thread) {
- // We are storing a JavaThread* (malloc'ed data) into a long field in the thread
- // object. The store has to be 64-bit wide so we use a pointer store, but we
- // cannot call oopDesc::obj_field_put since it includes a write barrier!
- oop* addr = java_thread->obj_field_addr(_eetop_offset);
- *addr = (oop) thread;
+ java_thread->address_field_put(_eetop_offset, (address)thread);
}
@@ -1038,8 +1034,8 @@
if (_dirty && _methods != NULL) {
BarrierSet* bs = Universe::heap()->barrier_set();
assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt");
- bs->write_ref_array(MemRegion((HeapWord*)_methods->obj_at_addr(0),
- _methods->length() * HeapWordsPerOop));
+ bs->write_ref_array(MemRegion((HeapWord*)_methods->base(),
+ _methods->array_size()));
_dirty = false;
}
}
@@ -1083,8 +1079,9 @@
method = mhandle();
}
- // _methods->obj_at_put(_index, method);
- *_methods->obj_at_addr(_index) = method;
+ _methods->obj_at_put(_index, method);
+ // bad for UseCompressedOops
+ // *_methods->obj_at_addr(_index) = method;
_bcis->ushort_at_put(_index, bci);
_index++;
_dirty = true;
@@ -1973,39 +1970,30 @@
// Support for java_lang_ref_Reference
-
-void java_lang_ref_Reference::set_referent(oop ref, oop value) {
- ref->obj_field_put(referent_offset, value);
-}
-
-oop* java_lang_ref_Reference::referent_addr(oop ref) {
- return ref->obj_field_addr(referent_offset);
-}
-
-void java_lang_ref_Reference::set_next(oop ref, oop value) {
- ref->obj_field_put(next_offset, value);
-}
-
-oop* java_lang_ref_Reference::next_addr(oop ref) {
- return ref->obj_field_addr(next_offset);
+oop java_lang_ref_Reference::pending_list_lock() {
+ instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass());
+ char *addr = (((char *)ik->start_of_static_fields()) + static_lock_offset);
+ if (UseCompressedOops) {
+ return oopDesc::load_decode_heap_oop((narrowOop *)addr);
+ } else {
+ return oopDesc::load_decode_heap_oop((oop*)addr);
+ }
}
-void java_lang_ref_Reference::set_discovered(oop ref, oop value) {
- ref->obj_field_put(discovered_offset, value);
-}
-
-oop* java_lang_ref_Reference::discovered_addr(oop ref) {
- return ref->obj_field_addr(discovered_offset);
+HeapWord *java_lang_ref_Reference::pending_list_addr() {
+ instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass());
+ char *addr = (((char *)ik->start_of_static_fields()) + static_pending_offset);
+ // XXX This might not be HeapWord aligned, almost rather be char *.
+ return (HeapWord*)addr;
}
-oop* java_lang_ref_Reference::pending_list_lock_addr() {
- instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass());
- return (oop*)(((char *)ik->start_of_static_fields()) + static_lock_offset);
-}
-
-oop* java_lang_ref_Reference::pending_list_addr() {
- instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass());
- return (oop *)(((char *)ik->start_of_static_fields()) + static_pending_offset);
+oop java_lang_ref_Reference::pending_list() {
+ char *addr = (char *)pending_list_addr();
+ if (UseCompressedOops) {
+ return oopDesc::load_decode_heap_oop((narrowOop *)addr);
+ } else {
+ return oopDesc::load_decode_heap_oop((oop*)addr);
+ }
}
@@ -2291,8 +2279,11 @@
// Invoked before SystemDictionary::initialize, so pre-loaded classes
// are not available to determine the offset_of_static_fields.
void JavaClasses::compute_hard_coded_offsets() {
- const int x = wordSize;
- const int header = instanceOopDesc::header_size_in_bytes();
+ const int x = heapOopSize;
+ // Objects don't get allocated in the gap in the header with compressed oops
+ // for these special classes because hard coded offsets can't be conditional
+ // so base_offset_in_bytes() is wrong here, allocate after the header.
+ const int header = sizeof(instanceOopDesc);
// Do the String Class
java_lang_String::value_offset = java_lang_String::hc_value_offset * x + header;