hotspot/src/share/vm/oops/objArrayKlass.cpp

Print this page

        

@@ -418,10 +418,20 @@
     do_oop;                         \
     p++;                            \
   }                                 \
 }
 
+#define ObjArrayKlass_SPECIALIZED_OOP_REVERSE_ITERATE(T, a, p, do_oop) \
+{                                   \
+  T* const b = (T*)(a)->base();     \
+  T* p       = b + (a)->length();   \
+  while (b < p) {                   \
+    p--;                            \
+    do_oop;                         \
+  }                                 \
+}
+
 #define ObjArrayKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(T, a, p, low, high, do_oop) \
 {                                   \
   T* const l = (T*)(low);           \
   T* const h = (T*)(high);          \
   T* p       = (T*)(a)->base();     \

@@ -441,10 +451,19 @@
   } else {                                           \
     ObjArrayKlass_SPECIALIZED_OOP_ITERATE(oop,       \
       a, p, do_oop)                                  \
   }
 
+#define ObjArrayKlass_OOP_REVERSE_ITERATE(a, p, do_oop)      \
+  if (UseCompressedOops) {                                     \
+    ObjArrayKlass_SPECIALIZED_OOP_REVERSE_ITERATE(narrowOop, \
+      a, p, do_oop)                                            \
+  } else {                                                     \
+    ObjArrayKlass_SPECIALIZED_OOP_REVERSE_ITERATE(oop,       \
+      a, p, do_oop)                                            \
+  }
+
 #define ObjArrayKlass_BOUNDED_OOP_ITERATE(a, p, low, high, do_oop) \
   if (UseCompressedOops) {                                   \
     ObjArrayKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop, \
       a, p, low, high, do_oop)                               \
   } else {                                                   \

@@ -575,11 +594,11 @@
 }
 
 #if INCLUDE_ALL_GCS
 void ObjArrayKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->is_objArray(), "obj must be obj array");
-  ObjArrayKlass_OOP_ITERATE( \
+  ObjArrayKlass_OOP_REVERSE_ITERATE( \
     objArrayOop(obj), p, \
     if (PSScavenge::should_scavenge(p)) { \
       pm->claim_or_forward_depth(p); \
     })
 }