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
|