< prev index next >

src/hotspot/share/oops/valueKlass.hpp

Print this page




  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 */
< prev index next >