< prev index next >
src/share/vm/oops/fieldInfo.hpp
Print this page
@@ -43,16 +43,18 @@
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_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_MASK 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,11 +103,11 @@
}
u2 access_flags() const { return _shorts[access_flags_offset]; }
u4 offset() const {
u2 lo = _shorts[low_packed_offset];
- switch(lo & FIELDINFO_TAG_MASK) {
+ 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,11 +121,11 @@
return 0;
}
bool is_contended() const {
u2 lo = _shorts[low_packed_offset];
- switch(lo & FIELDINFO_TAG_MASK) {
+ switch(lo & FIELDINFO_TAG_TYPE_MASK) {
case FIELDINFO_TAG_TYPE_PLAIN:
return false;
case FIELDINFO_TAG_TYPE_CONTENDED:
return true;
#ifndef PRODUCT
@@ -137,11 +139,11 @@
return false;
}
u2 contended_group() const {
u2 lo = _shorts[low_packed_offset];
- switch(lo & FIELDINFO_TAG_MASK) {
+ 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,11 +157,11 @@
return 0;
}
u2 allocation_type() const {
u2 lo = _shorts[low_packed_offset];
- switch(lo & FIELDINFO_TAG_MASK) {
+ 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,11 +173,11 @@
ShouldNotReachHere();
return 0;
}
bool is_offset_set() const {
- return (_shorts[low_packed_offset] & FIELDINFO_TAG_MASK) == FIELDINFO_TAG_OFFSET;
+ 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,21 +195,26 @@
}
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_MASK) {
+ 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_MASK;
+ _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,13 +222,25 @@
#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_MASK) {
+ 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 >