--- old/hotspot/src/share/vm/oops/objArrayKlass.cpp 2013-09-17 14:59:09.615626646 +0400 +++ new/hotspot/src/share/vm/oops/objArrayKlass.cpp 2013-09-17 14:59:09.531626644 +0400 @@ -420,6 +420,16 @@ } \ } +#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); \ @@ -443,6 +453,15 @@ 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, \ @@ -577,7 +596,7 @@ #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); \