< prev index next >

src/share/vm/oops/fieldInfo.hpp

Print this page

        

*** 43,58 **** public: // fields // Field info extracted from the class file and stored // as an array of 6 shorts. ! #define FIELDINFO_TAG_SIZE 2 #define FIELDINFO_TAG_BLANK 0 #define FIELDINFO_TAG_OFFSET 1 #define FIELDINFO_TAG_TYPE_PLAIN 2 #define FIELDINFO_TAG_TYPE_CONTENDED 3 ! #define FIELDINFO_TAG_MASK 3 // Packed field has the tag, and can be either of: // hi bits <--------------------------- lo bits // |---------high---------|---------low---------| // ..........................................00 - blank --- 43,60 ---- public: // fields // Field info extracted from the class file and stored // as an array of 6 shorts. ! #define FIELDINFO_TAG_SIZE 3 #define FIELDINFO_TAG_BLANK 0 #define FIELDINFO_TAG_OFFSET 1 #define FIELDINFO_TAG_TYPE_PLAIN 2 #define FIELDINFO_TAG_TYPE_CONTENDED 3 ! #define FIELDINFO_TAG_TYPE_MASK 3 ! #define FIELDINFO_TAG_MASK 7 ! #define FIELDINFO_FLATTENING_OFFSET 2 // Packed field has the tag, and can be either of: // hi bits <--------------------------- lo bits // |---------high---------|---------low---------| // ..........................................00 - blank
*** 101,111 **** } u2 access_flags() const { return _shorts[access_flags_offset]; } u4 offset() const { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_MASK) { case FIELDINFO_TAG_OFFSET: return build_int_from_shorts(_shorts[low_packed_offset], _shorts[high_packed_offset]) >> FIELDINFO_TAG_SIZE; #ifndef PRODUCT case FIELDINFO_TAG_TYPE_PLAIN: fatal("Asking offset for the plain type field"); --- 103,113 ---- } u2 access_flags() const { return _shorts[access_flags_offset]; } u4 offset() const { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_TYPE_MASK) { case FIELDINFO_TAG_OFFSET: return build_int_from_shorts(_shorts[low_packed_offset], _shorts[high_packed_offset]) >> FIELDINFO_TAG_SIZE; #ifndef PRODUCT case FIELDINFO_TAG_TYPE_PLAIN: fatal("Asking offset for the plain type field");
*** 119,129 **** return 0; } bool is_contended() const { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_MASK) { case FIELDINFO_TAG_TYPE_PLAIN: return false; case FIELDINFO_TAG_TYPE_CONTENDED: return true; #ifndef PRODUCT --- 121,131 ---- return 0; } bool is_contended() const { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_TYPE_MASK) { case FIELDINFO_TAG_TYPE_PLAIN: return false; case FIELDINFO_TAG_TYPE_CONTENDED: return true; #ifndef PRODUCT
*** 137,147 **** return false; } u2 contended_group() const { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_MASK) { case FIELDINFO_TAG_TYPE_PLAIN: return 0; case FIELDINFO_TAG_TYPE_CONTENDED: return _shorts[high_packed_offset]; #ifndef PRODUCT --- 139,149 ---- return false; } u2 contended_group() const { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_TYPE_MASK) { case FIELDINFO_TAG_TYPE_PLAIN: return 0; case FIELDINFO_TAG_TYPE_CONTENDED: return _shorts[high_packed_offset]; #ifndef PRODUCT
*** 155,165 **** return 0; } u2 allocation_type() const { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_MASK) { case FIELDINFO_TAG_TYPE_PLAIN: case FIELDINFO_TAG_TYPE_CONTENDED: return (lo >> FIELDINFO_TAG_SIZE); #ifndef PRODUCT case FIELDINFO_TAG_OFFSET: --- 157,167 ---- return 0; } u2 allocation_type() const { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_TYPE_MASK) { case FIELDINFO_TAG_TYPE_PLAIN: case FIELDINFO_TAG_TYPE_CONTENDED: return (lo >> FIELDINFO_TAG_SIZE); #ifndef PRODUCT case FIELDINFO_TAG_OFFSET:
*** 171,181 **** ShouldNotReachHere(); return 0; } bool is_offset_set() const { ! return (_shorts[low_packed_offset] & FIELDINFO_TAG_MASK) == FIELDINFO_TAG_OFFSET; } Symbol* name(const constantPoolHandle& cp) const { int index = name_index(); if (is_internal()) { --- 173,183 ---- ShouldNotReachHere(); return 0; } bool is_offset_set() const { ! return (_shorts[low_packed_offset] & FIELDINFO_TAG_TYPE_MASK) == FIELDINFO_TAG_OFFSET; } Symbol* name(const constantPoolHandle& cp) const { int index = name_index(); if (is_internal()) {
*** 193,213 **** } void set_access_flags(u2 val) { _shorts[access_flags_offset] = val; } void set_offset(u4 val) { val = val << FIELDINFO_TAG_SIZE; // make room for tag _shorts[low_packed_offset] = extract_low_short_from_int(val) | FIELDINFO_TAG_OFFSET; _shorts[high_packed_offset] = extract_high_short_from_int(val); } void set_allocation_type(int type) { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_MASK) { case FIELDINFO_TAG_BLANK: ! _shorts[low_packed_offset] = ((type << FIELDINFO_TAG_SIZE)) & 0xFFFF; ! _shorts[low_packed_offset] &= ~FIELDINFO_TAG_MASK; _shorts[low_packed_offset] |= FIELDINFO_TAG_TYPE_PLAIN; return; #ifndef PRODUCT case FIELDINFO_TAG_TYPE_PLAIN: case FIELDINFO_TAG_TYPE_CONTENDED: case FIELDINFO_TAG_OFFSET: --- 195,220 ---- } void set_access_flags(u2 val) { _shorts[access_flags_offset] = val; } void set_offset(u4 val) { val = val << FIELDINFO_TAG_SIZE; // make room for tag + bool flatten = is_flatten(); _shorts[low_packed_offset] = extract_low_short_from_int(val) | FIELDINFO_TAG_OFFSET; + if (flatten) set_flattening(true); _shorts[high_packed_offset] = extract_high_short_from_int(val); + assert(is_flatten() || !flatten, "just checking"); } void set_allocation_type(int type) { + bool b = is_flatten(); u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_TYPE_MASK) { case FIELDINFO_TAG_BLANK: ! _shorts[low_packed_offset] |= ((type << FIELDINFO_TAG_SIZE)) & 0xFFFF; ! _shorts[low_packed_offset] &= ~FIELDINFO_TAG_TYPE_MASK; _shorts[low_packed_offset] |= FIELDINFO_TAG_TYPE_PLAIN; + assert(is_flatten() || !b, "Just checking"); return; #ifndef PRODUCT case FIELDINFO_TAG_TYPE_PLAIN: case FIELDINFO_TAG_TYPE_CONTENDED: case FIELDINFO_TAG_OFFSET:
*** 215,227 **** #endif } ShouldNotReachHere(); } void set_contended_group(u2 val) { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_MASK) { case FIELDINFO_TAG_TYPE_PLAIN: _shorts[low_packed_offset] |= FIELDINFO_TAG_TYPE_CONTENDED; _shorts[high_packed_offset] = val; return; #ifndef PRODUCT --- 222,246 ---- #endif } ShouldNotReachHere(); } + void set_flattening(bool b) { + if (b) { + _shorts[low_packed_offset] |= 1 << FIELDINFO_FLATTENING_OFFSET; + } else { + _shorts[low_packed_offset] &= ~(1 << FIELDINFO_FLATTENING_OFFSET); + } + } + + bool is_flatten() { + return ((_shorts[low_packed_offset] >> FIELDINFO_FLATTENING_OFFSET) & 1) != 0; + } + void set_contended_group(u2 val) { u2 lo = _shorts[low_packed_offset]; ! switch(lo & FIELDINFO_TAG_TYPE_MASK) { case FIELDINFO_TAG_TYPE_PLAIN: _shorts[low_packed_offset] |= FIELDINFO_TAG_TYPE_CONTENDED; _shorts[high_packed_offset] = val; return; #ifndef PRODUCT
< prev index next >