< prev index next >

src/hotspot/share/oops/valueKlass.hpp

Print this page

        

@@ -48,10 +48,11 @@
     *((Array<VMRegPair>**)adr_return_regs()) = NULL;
     *((address*)adr_pack_handler()) = NULL;
     *((address*)adr_unpack_handler()) = NULL;
     assert(pack_handler() == NULL, "pack handler not null");
     *((int*)adr_default_value_offset()) = 0;
+    *((Klass**)adr_value_array_klass()) = NULL;
     set_prototype_header(markOopDesc::always_locked_prototype());
   }
 
   ValueKlassFixedBlock* valueklass_static_block() const {
     address adr_jf = adr_value_fields_klasses();

@@ -109,20 +110,38 @@
   address adr_default_value_offset() const {
     assert(_adr_valueklass_fixed_block != NULL, "Should have been initialized");
     return ((address)_adr_valueklass_fixed_block) + in_bytes(default_value_offset_offset());
   }
 
+  address adr_value_array_klass() const {
+    assert(_adr_valueklass_fixed_block != NULL, "Should have been initialized");
+    return ((address)_adr_valueklass_fixed_block) + in_bytes(byte_offset_of(ValueKlassFixedBlock, _value_array_klass));
+  }
+
+  Klass* get_value_array_klass() const {
+    return *(Klass**)adr_value_array_klass();
+  }
+
+  Klass* acquire_value_array_klass() const {
+    return OrderAccess::load_acquire((Klass**)adr_value_array_klass());
+  }
+
+  Klass* allocate_value_array_klass(TRAPS);
+
   int collect_fields(GrowableArray<SigEntry>* sig, int base_off = 0) const;
 
   void cleanup_blobs();
 
  protected:
   // Returns the array class for the n'th dimension
-  Klass* array_klass_impl(bool or_null, int n, TRAPS);
+  Klass* array_klass_impl(ArrayStorageProperties storage_props, bool or_null, int n, TRAPS);
 
   // Returns the array class with this class as element type
-  Klass* array_klass_impl(bool or_null, TRAPS);
+  Klass* array_klass_impl(ArrayStorageProperties storage_props, bool or_null, TRAPS);
+
+  // Specifically flat array klass
+  Klass* value_array_klass(ArrayStorageProperties storage_props, bool or_null, int rank, TRAPS);
 
  public:
   // Type testing
   bool is_value_slow() const        { return true; }
 

@@ -141,10 +160,13 @@
   // in Java heap like Java objects.
   virtual int size_helper() const {
     return layout_helper_to_size_helper(layout_helper());
   }
 
+  // Metadata iterators
+  void array_klasses_do(void f(Klass* k));
+
   // allocate_instance() allocates a stand alone value in the Java heap
   instanceOop allocate_instance(TRAPS);
 
   // minimum number of bytes occupied by nonstatic fields, HeapWord aligned or pow2
   int raw_value_byte_size() const;

@@ -180,11 +202,10 @@
 
   // store the value of this klass contained with src into dst, raw data ptr
   void value_store(void* src, void* dst, size_t raw_byte_size, bool dst_is_heap, bool dst_uninitialized);
 
   // GC support...
-
   void iterate_over_inside_oops(OopClosure* f, oop value);
 
   // oop iterate raw value type data pointer (where oop_addr may not be an oop, but backing/array-element)
   template <typename T, class OopClosureType>
   inline void oop_iterate_specialized(const address oop_addr, OopClosureType* closure);
< prev index next >