30 #include "oops/instanceKlass.hpp"
31
32 // objArrayKlass is the klass for objArrays
33
34 class objArrayKlass : public arrayKlass {
35 friend class VMStructs;
36 private:
37 klassOop _element_klass; // The klass of the elements of this array type
38 klassOop _bottom_klass; // The one-dimensional type (instanceKlass or typeArrayKlass)
39 public:
40 // Instance variables
41 klassOop element_klass() const { return _element_klass; }
42 void set_element_klass(klassOop k) { oop_store_without_check((oop*) &_element_klass, (oop) k); }
43 oop* element_klass_addr() { return (oop*)&_element_klass; }
44
45 klassOop bottom_klass() const { return _bottom_klass; }
46 void set_bottom_klass(klassOop k) { oop_store_without_check((oop*) &_bottom_klass, (oop) k); }
47 oop* bottom_klass_addr() { return (oop*)&_bottom_klass; }
48
49 // Compiler/Interpreter offset
50 static int element_klass_offset_in_bytes() { return offset_of(objArrayKlass, _element_klass); }
51
52 // Dispatched operation
53 bool can_be_primary_super_slow() const;
54 objArrayOop compute_secondary_supers(int num_extra_slots, TRAPS);
55 bool compute_is_subtype_of(klassOop k);
56 bool oop_is_objArray_slow() const { return true; }
57 int oop_size(oop obj) const;
58 int klass_oop_size() const { return object_size(); }
59
60 // Allocation
61 DEFINE_ALLOCATE_PERMANENT(objArrayKlass);
62 objArrayOop allocate(int length, TRAPS);
63 oop multi_allocate(int rank, jint* sizes, TRAPS);
64
65 // Copying
66 void copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS);
67
68 // Compute protection domain
69 oop protection_domain() { return Klass::cast(bottom_klass())->protection_domain(); }
70 // Compute class loader
|
30 #include "oops/instanceKlass.hpp"
31
32 // objArrayKlass is the klass for objArrays
33
34 class objArrayKlass : public arrayKlass {
35 friend class VMStructs;
36 private:
37 klassOop _element_klass; // The klass of the elements of this array type
38 klassOop _bottom_klass; // The one-dimensional type (instanceKlass or typeArrayKlass)
39 public:
40 // Instance variables
41 klassOop element_klass() const { return _element_klass; }
42 void set_element_klass(klassOop k) { oop_store_without_check((oop*) &_element_klass, (oop) k); }
43 oop* element_klass_addr() { return (oop*)&_element_klass; }
44
45 klassOop bottom_klass() const { return _bottom_klass; }
46 void set_bottom_klass(klassOop k) { oop_store_without_check((oop*) &_bottom_klass, (oop) k); }
47 oop* bottom_klass_addr() { return (oop*)&_bottom_klass; }
48
49 // Compiler/Interpreter offset
50 static ByteSize element_klass_offset() { return in_ByteSize(sizeof(klassOopDesc) + offset_of(objArrayKlass, _element_klass)); }
51
52 // Dispatched operation
53 bool can_be_primary_super_slow() const;
54 objArrayOop compute_secondary_supers(int num_extra_slots, TRAPS);
55 bool compute_is_subtype_of(klassOop k);
56 bool oop_is_objArray_slow() const { return true; }
57 int oop_size(oop obj) const;
58 int klass_oop_size() const { return object_size(); }
59
60 // Allocation
61 DEFINE_ALLOCATE_PERMANENT(objArrayKlass);
62 objArrayOop allocate(int length, TRAPS);
63 oop multi_allocate(int rank, jint* sizes, TRAPS);
64
65 // Copying
66 void copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS);
67
68 // Compute protection domain
69 oop protection_domain() { return Klass::cast(bottom_klass())->protection_domain(); }
70 // Compute class loader
|