32 // A ValueKlass is a specialized InstanceKlass for value types.
33
34
35 class ValueKlass: public InstanceKlass {
36 friend class VMStructs;
37 friend class InstanceKlass;
38
39 private:
40
41 // Constructor
42 ValueKlass(const ClassFileParser& parser)
43 : InstanceKlass(parser, InstanceKlass::_misc_kind_value_type) {
44 _adr_valueklass_fixed_block = valueklass_static_bloc();
45 // Addresses used for value type calling convention
46 *((Array<SigEntry>**)adr_extended_sig()) = NULL;
47 *((Array<VMRegPair>**)adr_return_regs()) = NULL;
48 *((address*)adr_pack_handler()) = NULL;
49 *((address*)adr_unpack_handler()) = NULL;
50 assert(pack_handler() == NULL, "pack handler not null");
51 *((int*)adr_default_value_offset()) = 0;
52
53 }
54
55 ValueKlassFixedBlock* valueklass_static_bloc() const {
56 address adr_jf = adr_value_fields_klasses();
57 if (adr_jf != NULL) {
58 return (ValueKlassFixedBlock*)(adr_jf + this->java_fields_count() * sizeof(Klass*));
59 }
60
61 address adr_fing = adr_fingerprint();
62 if (adr_fing != NULL) {
63 return (ValueKlassFixedBlock*)(adr_fingerprint() + sizeof(u8));
64 }
65
66 InstanceKlass** adr_host = adr_host_klass();
67 if (adr_host != NULL) {
68 return (ValueKlassFixedBlock*)(adr_host + 1);
69 }
70
71 Klass** adr_impl = adr_implementor();
72 if (adr_impl != NULL) {
252 int default_value_offset() {
253 int offset = *((int*)adr_default_value_offset());
254 assert(offset != 0, "must not be called if not initialized");
255 return offset;
256 }
257
258 void set_default_value(oop val) {
259 java_mirror()->obj_field_put(default_value_offset(), val);
260 }
261
262 oop default_value() {
263 oop val = java_mirror()->obj_field_acquire(default_value_offset());
264 assert(oopDesc::is_oop(val), "Sanity check");
265 assert(val->is_value(), "Sanity check");
266 assert(val->klass() == this, "sanity check");
267 return val;
268 }
269
270 void deallocate_contents(ClassLoaderData* loader_data);
271 static void cleanup(ValueKlass* ik) ;
272 };
273
274 #endif /* SHARE_VM_OOPS_VALUEKLASS_HPP */
|
32 // A ValueKlass is a specialized InstanceKlass for value types.
33
34
35 class ValueKlass: public InstanceKlass {
36 friend class VMStructs;
37 friend class InstanceKlass;
38
39 private:
40
41 // Constructor
42 ValueKlass(const ClassFileParser& parser)
43 : InstanceKlass(parser, InstanceKlass::_misc_kind_value_type) {
44 _adr_valueklass_fixed_block = valueklass_static_bloc();
45 // Addresses used for value type calling convention
46 *((Array<SigEntry>**)adr_extended_sig()) = NULL;
47 *((Array<VMRegPair>**)adr_return_regs()) = NULL;
48 *((address*)adr_pack_handler()) = NULL;
49 *((address*)adr_unpack_handler()) = NULL;
50 assert(pack_handler() == NULL, "pack handler not null");
51 *((int*)adr_default_value_offset()) = 0;
52 assert(Klass::ptr_is_value_type(this), "Value type klass ptr encoding");
53 set_prototype_header(markOopDesc::always_locked_prototype());
54 }
55
56 ValueKlassFixedBlock* valueklass_static_bloc() const {
57 address adr_jf = adr_value_fields_klasses();
58 if (adr_jf != NULL) {
59 return (ValueKlassFixedBlock*)(adr_jf + this->java_fields_count() * sizeof(Klass*));
60 }
61
62 address adr_fing = adr_fingerprint();
63 if (adr_fing != NULL) {
64 return (ValueKlassFixedBlock*)(adr_fingerprint() + sizeof(u8));
65 }
66
67 InstanceKlass** adr_host = adr_host_klass();
68 if (adr_host != NULL) {
69 return (ValueKlassFixedBlock*)(adr_host + 1);
70 }
71
72 Klass** adr_impl = adr_implementor();
73 if (adr_impl != NULL) {
253 int default_value_offset() {
254 int offset = *((int*)adr_default_value_offset());
255 assert(offset != 0, "must not be called if not initialized");
256 return offset;
257 }
258
259 void set_default_value(oop val) {
260 java_mirror()->obj_field_put(default_value_offset(), val);
261 }
262
263 oop default_value() {
264 oop val = java_mirror()->obj_field_acquire(default_value_offset());
265 assert(oopDesc::is_oop(val), "Sanity check");
266 assert(val->is_value(), "Sanity check");
267 assert(val->klass() == this, "sanity check");
268 return val;
269 }
270
271 void deallocate_contents(ClassLoaderData* loader_data);
272 static void cleanup(ValueKlass* ik) ;
273
274 // Verification
275 void verify_on(outputStream* st);
276 void oop_verify_on(oop obj, outputStream* st);
277
278 };
279
280 #endif /* SHARE_VM_OOPS_VALUEKLASS_HPP */
|