diff src/share/vm/prims/jvmtiTagMap.cpp @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1 37f87013dfd8
line wrap: on
line diff
--- a/src/share/vm/prims/jvmtiTagMap.cpp	Fri Apr 11 09:56:35 2008 -0400
+++ b/src/share/vm/prims/jvmtiTagMap.cpp	Sun Apr 13 17:43:42 2008 -0400
@@ -2662,6 +2662,7 @@
     _continue = CallbackInvoker::report_simple_root(kind, o);
 
   }
+  virtual void do_oop(narrowOop* obj_p) { ShouldNotReachHere(); }
 };
 
 // A supporting closure used to process JNI locals
@@ -2704,6 +2705,7 @@
     // invoke the callback
     _continue = CallbackInvoker::report_jni_local_root(_thread_tag, _tid, _depth, _method, o);
   }
+  virtual void do_oop(narrowOop* obj_p) { ShouldNotReachHere(); }
 };
 
 
@@ -2878,9 +2880,11 @@
 }
 
 // verify that a static oop field is in range
-static inline bool verify_static_oop(instanceKlass* ik, oop* obj_p) {
-  oop* start = ik->start_of_static_fields();
-  oop* end = start + ik->static_oop_field_size();
+static inline bool verify_static_oop(instanceKlass* ik,
+                                     klassOop k, int offset) {
+  address obj_p = (address)k + offset;
+  address start = (address)ik->start_of_static_fields();
+  address end = start + (ik->static_oop_field_size() * heapOopSize);
   assert(end >= start, "sanity check");
 
   if (obj_p >= start && obj_p < end) {
@@ -2981,10 +2985,8 @@
       ClassFieldDescriptor* field = field_map->field_at(i);
       char type = field->field_type();
       if (!is_primitive_field_type(type)) {
-        address addr = (address)k + field->field_offset();
-        oop* f = (oop*)addr;
-        assert(verify_static_oop(ik, f), "sanity check");
-        oop fld_o = *f;
+        oop fld_o = k->obj_field(field->field_offset());
+        assert(verify_static_oop(ik, k, field->field_offset()), "sanity check");
         if (fld_o != NULL) {
           int slot = field->field_index();
           if (!CallbackInvoker::report_static_field_reference(mirror, fld_o, slot)) {
@@ -3026,9 +3028,7 @@
     ClassFieldDescriptor* field = field_map->field_at(i);
     char type = field->field_type();
     if (!is_primitive_field_type(type)) {
-      address addr = (address)o + field->field_offset();
-      oop* f = (oop*)addr;
-      oop fld_o = *f;
+      oop fld_o = o->obj_field(field->field_offset());
       if (fld_o != NULL) {
         // reflection code may have a reference to a klassOop.
         // - see sun.reflect.UnsafeStaticFieldAccessorImpl and sun.misc.Unsafe