< prev index next >

src/hotspot/share/oops/instanceMirrorKlass.cpp

Print this page

34 #include "oops/instanceMirrorKlass.hpp"
35 #include "oops/instanceOop.hpp"
36 #include "oops/oop.inline.hpp"
37 #include "oops/symbol.hpp"
38 #include "runtime/handles.inline.hpp"
39 #include "utilities/macros.hpp"
40 
41 int InstanceMirrorKlass::_offset_of_static_fields = 0;
42 
43 InstanceMirrorKlass::InstanceMirrorKlass() {
44   assert(CDSConfig::is_dumping_static_archive() || CDSConfig::is_using_archive(), "only for CDS");
45 }
46 
47 size_t InstanceMirrorKlass::instance_size(Klass* k) {
48   if (k != nullptr && k->is_instance_klass()) {
49     return align_object_size(size_helper() + InstanceKlass::cast(k)->static_field_size());
50   }
51   return size_helper();
52 }
53 
54 instanceOop InstanceMirrorKlass::allocate_instance(Klass* k, TRAPS) {
55   // Query before forming handle.
56   size_t size = instance_size(k);
57   assert(size > 0, "total object size must be non-zero: " SIZE_FORMAT, size);




58 
59   // Since mirrors can be variable sized because of the static fields, store
60   // the size in the mirror itself.
61   return (instanceOop)Universe::heap()->class_allocate(this, size, THREAD);




62 }
63 
64 size_t InstanceMirrorKlass::oop_size(oop obj) const {
65   return java_lang_Class::oop_size(obj);
66 }
67 
68 int InstanceMirrorKlass::compute_static_oop_field_count(oop obj) {
69   Klass* k = java_lang_Class::as_Klass(obj);
70   if (k != nullptr && k->is_instance_klass()) {
71     return InstanceKlass::cast(k)->static_oop_field_count();
72   }
73   return 0;
74 }
75 










76 #if INCLUDE_CDS
77 void InstanceMirrorKlass::serialize_offsets(SerializeClosure* f) {
78   f->do_int(&_offset_of_static_fields);
79 }
80 #endif

34 #include "oops/instanceMirrorKlass.hpp"
35 #include "oops/instanceOop.hpp"
36 #include "oops/oop.inline.hpp"
37 #include "oops/symbol.hpp"
38 #include "runtime/handles.inline.hpp"
39 #include "utilities/macros.hpp"
40 
41 int InstanceMirrorKlass::_offset_of_static_fields = 0;
42 
43 InstanceMirrorKlass::InstanceMirrorKlass() {
44   assert(CDSConfig::is_dumping_static_archive() || CDSConfig::is_using_archive(), "only for CDS");
45 }
46 
47 size_t InstanceMirrorKlass::instance_size(Klass* k) {
48   if (k != nullptr && k->is_instance_klass()) {
49     return align_object_size(size_helper() + InstanceKlass::cast(k)->static_field_size());
50   }
51   return size_helper();
52 }
53 
54 instanceOop InstanceMirrorKlass::allocate_instance(Klass* k, bool extend, TRAPS) {
55   // Query before forming handle.
56   size_t base_size = instance_size(k);
57   size_t size = base_size;
58   if (extend && UseCompactObjectHeaders) {
59     size = align_object_size(size + 1);
60   }
61   assert(base_size > 0, "base object size must be non-zero: " SIZE_FORMAT, base_size);
62 
63   // Since mirrors can be variable sized because of the static fields, store
64   // the size in the mirror itself.
65   instanceOop obj = (instanceOop)Universe::heap()->class_allocate(this, size, base_size, THREAD);
66   if (extend && UseCompactObjectHeaders) {
67     obj->set_mark(obj->mark().set_not_hashed_expanded());
68   }
69   return obj;
70 }
71 
72 size_t InstanceMirrorKlass::oop_size(oop obj, markWord mark) const {
73   return java_lang_Class::oop_size(obj);
74 }
75 
76 int InstanceMirrorKlass::compute_static_oop_field_count(oop obj) {
77   Klass* k = java_lang_Class::as_Klass(obj);
78   if (k != nullptr && k->is_instance_klass()) {
79     return InstanceKlass::cast(k)->static_oop_field_count();
80   }
81   return 0;
82 }
83 
84 int InstanceMirrorKlass::hash_offset_in_bytes(oop obj) const {
85   assert(UseCompactObjectHeaders, "only with compact i-hash");
86   // TODO: There may be gaps that we could use, e.g. in the fields of Class,
87   // between the fields of Class and the static fields or in or at the end of
88   // the static fields block.
89   // When implementing any change here, make sure that allocate_instance()
90   // and corresponding code in InstanceMirrorKlass.java are in sync.
91   return checked_cast<int>(obj->base_size_given_klass(obj->mark(), this) * BytesPerWord);
92 }
93 
94 #if INCLUDE_CDS
95 void InstanceMirrorKlass::serialize_offsets(SerializeClosure* f) {
96   f->do_int(&_offset_of_static_fields);
97 }
98 #endif
< prev index next >