src/share/vm/oops/valueArrayKlass.inline.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File valhalla Sdiff src/share/vm/oops

src/share/vm/oops/valueArrayKlass.inline.hpp

Print this page




  31 #include "oops/oop.inline.hpp"
  32 #include "oops/valueArrayKlass.hpp"
  33 #include "oops/valueArrayOop.hpp"
  34 #include "oops/valueKlass.hpp"
  35 #include "oops/valueKlass.inline.hpp"
  36 #include "utilities/macros.hpp"
  37 
  38 /*
  39  * Warning incomplete: requires embedded oops, not yet enabled, so consider this a "sketch-up" of oop iterators
  40  */
  41 
  42 template <bool nv, typename T, class OopClosureType>
  43 void ValueArrayKlass::oop_oop_iterate_elements_specialized(valueArrayOop a,
  44                                                            OopClosureType* closure) {
  45   assert(contains_oops(), "Nothing to iterate");
  46 
  47   const int shift = Klass::layout_helper_log2_element_size(layout_helper());
  48   const int addr_incr = 1 << shift;
  49   uintptr_t elem_addr = (uintptr_t) a->base();
  50   const uintptr_t stop_addr = elem_addr + ((uintptr_t)a->length() << shift);
  51   const int oop_offset = element_klass()->first_field_offset();
  52 
  53   while (elem_addr < stop_addr) {
  54     element_klass()->oop_iterate_specialized<nv, T>((address)(elem_addr - oop_offset), closure);
  55     elem_addr += addr_incr;
  56   }
  57 }
  58 
  59 template <bool nv, typename T, class OopClosureType>
  60 void ValueArrayKlass::oop_oop_iterate_elements_specialized_bounded(valueArrayOop a,
  61                                                                    OopClosureType* closure,
  62                                                                    void* lo, void* hi) {
  63   assert(contains_oops(), "Nothing to iterate");
  64 
  65   const int shift = Klass::layout_helper_log2_element_size(layout_helper());
  66   const int addr_incr = 1 << shift;
  67   uintptr_t elem_addr = (uintptr_t)a->base();
  68   uintptr_t stop_addr = elem_addr + ((uintptr_t)a->length() << shift);
  69   const int oop_offset = element_klass()->first_field_offset();
  70 
  71   if (elem_addr < (uintptr_t) lo) {
  72     uintptr_t diff = ((uintptr_t) lo) - elem_addr;
  73     elem_addr += (diff >> shift) << shift;
  74   }
  75   if (stop_addr > (uintptr_t) hi) {
  76     uintptr_t diff = stop_addr - ((uintptr_t) hi);
  77     stop_addr -= (diff >> shift) << shift;
  78   }
  79 
  80   const uintptr_t end = stop_addr;
  81   while (elem_addr < end) {
  82     element_klass()->oop_iterate_specialized_bounded<nv, T>((address)(elem_addr - oop_offset), closure, lo, hi);
  83     elem_addr += addr_incr;
  84   }
  85 }
  86 
  87 template <bool nv, class OopClosureType>
  88 void ValueArrayKlass::oop_oop_iterate_elements(valueArrayOop a, OopClosureType* closure) {
  89   if (contains_oops()) {
  90     if (UseCompressedOops) {
  91       oop_oop_iterate_elements_specialized<nv, narrowOop>(a, closure);
  92     } else {
  93       oop_oop_iterate_elements_specialized<nv, oop>(a, closure);
  94     }
  95   }
  96 }
  97 
  98 template <bool nv, typename OopClosureType>
  99 void ValueArrayKlass::oop_oop_iterate(oop obj, OopClosureType* closure) {
 100   assert(obj->is_valueArray(),"must be a value array");
 101 
 102   if (Devirtualizer<nv>::do_metadata(closure)) {




  31 #include "oops/oop.inline.hpp"
  32 #include "oops/valueArrayKlass.hpp"
  33 #include "oops/valueArrayOop.hpp"
  34 #include "oops/valueKlass.hpp"
  35 #include "oops/valueKlass.inline.hpp"
  36 #include "utilities/macros.hpp"
  37 
  38 /*
  39  * Warning incomplete: requires embedded oops, not yet enabled, so consider this a "sketch-up" of oop iterators
  40  */
  41 
  42 template <bool nv, typename T, class OopClosureType>
  43 void ValueArrayKlass::oop_oop_iterate_elements_specialized(valueArrayOop a,
  44                                                            OopClosureType* closure) {
  45   assert(contains_oops(), "Nothing to iterate");
  46 
  47   const int shift = Klass::layout_helper_log2_element_size(layout_helper());
  48   const int addr_incr = 1 << shift;
  49   uintptr_t elem_addr = (uintptr_t) a->base();
  50   const uintptr_t stop_addr = elem_addr + ((uintptr_t)a->length() << shift);
  51   const int oop_offset = ((ValueKlass*)element_klass())->first_field_offset();
  52 
  53   while (elem_addr < stop_addr) {
  54     ((ValueKlass*)element_klass())->oop_iterate_specialized<nv, T>((address)(elem_addr - oop_offset), closure);
  55     elem_addr += addr_incr;
  56   }
  57 }
  58 
  59 template <bool nv, typename T, class OopClosureType>
  60 void ValueArrayKlass::oop_oop_iterate_elements_specialized_bounded(valueArrayOop a,
  61                                                                    OopClosureType* closure,
  62                                                                    void* lo, void* hi) {
  63   assert(contains_oops(), "Nothing to iterate");
  64 
  65   const int shift = Klass::layout_helper_log2_element_size(layout_helper());
  66   const int addr_incr = 1 << shift;
  67   uintptr_t elem_addr = (uintptr_t)a->base();
  68   uintptr_t stop_addr = elem_addr + ((uintptr_t)a->length() << shift);
  69   const int oop_offset = ((ValueKlass*)element_klass())->first_field_offset();
  70 
  71   if (elem_addr < (uintptr_t) lo) {
  72     uintptr_t diff = ((uintptr_t) lo) - elem_addr;
  73     elem_addr += (diff >> shift) << shift;
  74   }
  75   if (stop_addr > (uintptr_t) hi) {
  76     uintptr_t diff = stop_addr - ((uintptr_t) hi);
  77     stop_addr -= (diff >> shift) << shift;
  78   }
  79 
  80   const uintptr_t end = stop_addr;
  81   while (elem_addr < end) {
  82     ((ValueKlass*)element_klass())->oop_iterate_specialized_bounded<nv, T>((address)(elem_addr - oop_offset), closure, lo, hi);
  83     elem_addr += addr_incr;
  84   }
  85 }
  86 
  87 template <bool nv, class OopClosureType>
  88 void ValueArrayKlass::oop_oop_iterate_elements(valueArrayOop a, OopClosureType* closure) {
  89   if (contains_oops()) {
  90     if (UseCompressedOops) {
  91       oop_oop_iterate_elements_specialized<nv, narrowOop>(a, closure);
  92     } else {
  93       oop_oop_iterate_elements_specialized<nv, oop>(a, closure);
  94     }
  95   }
  96 }
  97 
  98 template <bool nv, typename OopClosureType>
  99 void ValueArrayKlass::oop_oop_iterate(oop obj, OopClosureType* closure) {
 100   assert(obj->is_valueArray(),"must be a value array");
 101 
 102   if (Devirtualizer<nv>::do_metadata(closure)) {


src/share/vm/oops/valueArrayKlass.inline.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File