< prev index next >
src/hotspot/share/oops/valueKlass.hpp
Print this page
*** 26,36 ****
#define SHARE_VM_OOPS_VALUEKLASS_HPP
#include "classfile/javaClasses.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/method.hpp"
! #include "oops/oop.inline.hpp"
// A ValueKlass is a specialized InstanceKlass for value types.
class ValueKlass: public InstanceKlass {
--- 26,36 ----
#define SHARE_VM_OOPS_VALUEKLASS_HPP
#include "classfile/javaClasses.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/method.hpp"
! //#include "oops/oop.inline.hpp"
// A ValueKlass is a specialized InstanceKlass for value types.
class ValueKlass: public InstanceKlass {
*** 38,60 ****
friend class InstanceKlass;
private:
// Constructor
! ValueKlass(const ClassFileParser& parser)
! : InstanceKlass(parser, InstanceKlass::_misc_kind_value_type, InstanceKlass::ID) {
! _adr_valueklass_fixed_block = valueklass_static_block();
! // Addresses used for value type calling convention
! *((Array<SigEntry>**)adr_extended_sig()) = NULL;
! *((Array<VMRegPair>**)adr_return_regs()) = NULL;
! *((address*)adr_pack_handler()) = NULL;
! *((address*)adr_unpack_handler()) = NULL;
! assert(pack_handler() == NULL, "pack handler not null");
! *((int*)adr_default_value_offset()) = 0;
! *((Klass**)adr_value_array_klass()) = NULL;
! set_prototype_header(markWord::always_locked_prototype());
! }
ValueKlassFixedBlock* valueklass_static_block() const {
address adr_jf = adr_value_fields_klasses();
if (adr_jf != NULL) {
return (ValueKlassFixedBlock*)(adr_jf + this->java_fields_count() * sizeof(Klass*));
--- 38,48 ----
friend class InstanceKlass;
private:
// Constructor
! ValueKlass(const ClassFileParser& parser);
ValueKlassFixedBlock* valueklass_static_block() const {
address adr_jf = adr_value_fields_klasses();
if (adr_jf != NULL) {
return (ValueKlassFixedBlock*)(adr_jf + this->java_fields_count() * sizeof(Klass*));
*** 151,161 ****
void set_first_field_offset(int offset) {
*(int*)adr_first_field_offset() = offset;
}
! int get_exact_size_in_bytes() {
return *(int*)adr_exact_size_in_bytes();
}
void set_exact_size_in_bytes(int exact_size) {
*(int*)adr_exact_size_in_bytes() = exact_size;
--- 139,149 ----
void set_first_field_offset(int offset) {
*(int*)adr_first_field_offset() = offset;
}
! int get_exact_size_in_bytes() const {
return *(int*)adr_exact_size_in_bytes();
}
void set_exact_size_in_bytes(int exact_size) {
*(int*)adr_exact_size_in_bytes() = exact_size;
*** 186,199 ****
// value_mirror is the primary mirror
oop value_mirror() const { return java_lang_Class::inline_type_mirror(java_mirror()); }
oop indirect_mirror() const { return java_lang_Class::indirect_type_mirror(java_mirror()); }
// Casting from Klass*
! static ValueKlass* cast(Klass* k) {
! assert(k->is_value(), "cast to ValueKlass");
! return (ValueKlass*) k;
! }
// Use this to return the size of an instance in heap words
// Implementation is currently simple because all value types are allocated
// in Java heap like Java objects.
virtual int size_helper() const {
--- 174,184 ----
// value_mirror is the primary mirror
oop value_mirror() const { return java_lang_Class::inline_type_mirror(java_mirror()); }
oop indirect_mirror() const { return java_lang_Class::indirect_type_mirror(java_mirror()); }
// Casting from Klass*
! static ValueKlass* cast(Klass* k);
// Use this to return the size of an instance in heap words
// Implementation is currently simple because all value types are allocated
// in Java heap like Java objects.
virtual int size_helper() const {
*** 207,245 ****
instanceOop allocate_instance(TRAPS);
// minimum number of bytes occupied by nonstatic fields, HeapWord aligned or pow2
int raw_value_byte_size();
! address data_for_oop(oop o) const {
! return ((address) (void*) o) + first_field_offset();
! }
!
! oop oop_for_data(address data) const {
! oop o = (oop) (data - first_field_offset());
! assert(oopDesc::is_oop(o, false), "Not an oop");
! return o;
! }
// Query if h/w provides atomic load/store
bool is_atomic();
bool flatten_array();
bool contains_oops() const { return nonstatic_oop_map_count() > 0; }
int nonstatic_oop_count();
! // Prototype general store methods...
! // copy the fields, with no concern for GC barriers
! void raw_field_copy(void* src, void* dst, size_t raw_byte_size);
!
! void value_store(void* src, void* dst, bool dst_is_heap, bool dst_uninitialized) {
! value_store(src, dst, nonstatic_field_size() << LogBytesPerHeapOop, dst_is_heap, dst_uninitialized);
! }
!
! // store the value of this klass contained with src into dst, raw data ptr
! void value_store(void* src, void* dst, size_t raw_byte_size, bool dst_is_heap, bool dst_uninitialized);
// oop iterate raw value type data pointer (where oop_addr may not be an oop, but backing/array-element)
template <typename T, class OopClosureType>
inline void oop_iterate_specialized(const address oop_addr, OopClosureType* closure);
--- 192,224 ----
instanceOop allocate_instance(TRAPS);
// minimum number of bytes occupied by nonstatic fields, HeapWord aligned or pow2
int raw_value_byte_size();
! address data_for_oop(oop o) const;
! oop oop_for_data(address data) const;
// Query if h/w provides atomic load/store
bool is_atomic();
bool flatten_array();
bool contains_oops() const { return nonstatic_oop_map_count() > 0; }
int nonstatic_oop_count();
! // General store methods
! //
! // Normally loads and store methods would be found in *Oops classes, but since values can be
! // "in-lined" (flattened) into containing oops, these methods reside here in ValueKlass.
! //
! // "value_copy_*_to_new_*" assume new memory (i.e. IS_DEST_UNINITIALIZED for write barriers)
!
! void value_copy_payload_to_new_oop(void* src, oop dst);
! void value_copy_oop_to_new_oop(oop src, oop dst);
! void value_copy_oop_to_new_payload(oop src, void* dst);
! void value_copy_oop_to_payload(oop src, void* dst);
// oop iterate raw value type data pointer (where oop_addr may not be an oop, but backing/array-element)
template <typename T, class OopClosureType>
inline void oop_iterate_specialized(const address oop_addr, OopClosureType* closure);
*** 296,313 ****
void set_default_value(oop val) {
java_mirror()->obj_field_put(default_value_offset(), val);
indirect_mirror()->obj_field_put(default_value_offset(), val);
}
! oop default_value() {
! oop val = java_mirror()->obj_field_acquire(default_value_offset());
! assert(oopDesc::is_oop(val), "Sanity check");
! assert(val->is_value(), "Sanity check");
! assert(val->klass() == this, "sanity check");
! return val;
! }
!
void deallocate_contents(ClassLoaderData* loader_data);
static void cleanup(ValueKlass* ik) ;
// Verification
void verify_on(outputStream* st);
--- 275,285 ----
void set_default_value(oop val) {
java_mirror()->obj_field_put(default_value_offset(), val);
indirect_mirror()->obj_field_put(default_value_offset(), val);
}
! oop default_value();
void deallocate_contents(ClassLoaderData* loader_data);
static void cleanup(ValueKlass* ik) ;
// Verification
void verify_on(outputStream* st);
< prev index next >