Skip to content

Commit a804738

Browse files
committed
8350283: [lworld] Layout helper can have incorrect is_null_free bit for flat arrays
1 parent d32388f commit a804738

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

src/hotspot/share/oops/flatArrayKlass.cpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,27 +65,31 @@ FlatArrayKlass::FlatArrayKlass(Klass* element_klass, Symbol* name, LayoutKind lk
6565
set_layout_helper(array_layout_helper(InlineKlass::cast(element_klass), lk));
6666
assert(is_array_klass(), "sanity");
6767
assert(is_flatArray_klass(), "sanity");
68-
assert(is_null_free_array_klass(), "sanity");
6968

7069
#ifdef _LP64
7170
set_prototype_header(markWord::flat_array_prototype(lk));
72-
assert(prototype_header().is_flat_array(), "sanity");
7371
#else
7472
fatal("Not supported yet");
7573
set_prototype_header(markWord::inline_type_prototype());
7674
#endif
7775

7876
#ifdef ASSERT
77+
assert(layout_helper_is_array(layout_helper()), "Must be");
78+
assert(layout_helper_is_flatArray(layout_helper()), "Must be");
79+
assert(layout_helper_element_type(layout_helper()) == T_FLAT_ELEMENT, "Must be");
80+
assert(prototype_header().is_flat_array(), "Must be");
7981
switch(lk) {
8082
case NON_ATOMIC_FLAT:
83+
case ATOMIC_FLAT:
8184
assert(layout_helper_is_null_free(layout_helper()), "Must be");
82-
assert(layout_helper_is_array(layout_helper()), "Must be");
83-
assert(layout_helper_is_flatArray(layout_helper()), "Must be");
84-
assert(layout_helper_element_type(layout_helper()) == T_FLAT_ELEMENT, "Must be");
8585
assert(prototype_header().is_null_free_array(), "Must be");
86-
assert(prototype_header().is_flat_array(), "Must be");
86+
break;
87+
case NULLABLE_ATOMIC_FLAT:
88+
assert(!layout_helper_is_null_free(layout_helper()), "Must be");
89+
assert(!prototype_header().is_null_free_array(), "Must be");
8790
break;
8891
default:
92+
ShouldNotReachHere();
8993
break;
9094
}
9195
#endif // ASSERT
@@ -161,15 +165,15 @@ jint FlatArrayKlass::array_layout_helper(InlineKlass* vk, LayoutKind lk) {
161165
BasicType etype = T_FLAT_ELEMENT;
162166
int esize = log2i_exact(round_up_power_of_2(vk->layout_size_in_bytes(lk)));
163167
int hsize = arrayOopDesc::base_offset_in_bytes(etype);
164-
165-
int lh = Klass::array_layout_helper(_lh_array_tag_vt_value, true, hsize, etype, esize);
168+
bool null_free = lk != NULLABLE_ATOMIC_FLAT;
169+
int lh = Klass::array_layout_helper(_lh_array_tag_vt_value, null_free, hsize, etype, esize);
166170

167171
assert(lh < (int)_lh_neutral_value, "must look like an array layout");
168172
assert(layout_helper_is_array(lh), "correct kind");
169173
assert(layout_helper_is_flatArray(lh), "correct kind");
170174
assert(!layout_helper_is_typeArray(lh), "correct kind");
171175
assert(!layout_helper_is_objArray(lh), "correct kind");
172-
assert(layout_helper_is_null_free(lh), "correct kind");
176+
assert(layout_helper_is_null_free(lh) == null_free, "correct kind");
173177
assert(layout_helper_header_size(lh) == hsize, "correct decode");
174178
assert(layout_helper_element_type(lh) == etype, "correct decode");
175179
assert(layout_helper_log2_element_size(lh) == esize, "correct decode");

0 commit comments

Comments
 (0)