Skip to content

Commit a85d0a2

Browse files
committed
8353752: [lworld] Remove handcoded offsets of field offsets for boxing classes
1 parent 4f7decd commit a85d0a2

File tree

2 files changed

+56
-60
lines changed

2 files changed

+56
-60
lines changed

src/hotspot/share/classfile/javaClasses.cpp

Lines changed: 52 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3987,24 +3987,30 @@ bool java_lang_ref_Reference::is_referent_field(oop obj, ptrdiff_t offset) {
39873987
return is_reference;
39883988
}
39893989

3990-
int java_lang_boxing_object::_sub32bits_value_offset;
3991-
int java_lang_boxing_object::_32bits_value_offset;
3992-
int java_lang_boxing_object::_64bits_value_offset;
3993-
3994-
#define BOXING_FIELDS_DO(macro) \
3995-
macro(_sub32bits_value_offset, byteKlass, "value", byte_signature, false); \
3996-
macro(_32bits_value_offset, intKlass, "value", int_signature, false); \
3997-
macro(_64bits_value_offset, longKlass, "value", long_signature, false);
3990+
int* java_lang_boxing_object::_offsets;
3991+
3992+
#define BOXING_FIELDS_DO(macro) \
3993+
macro(java_lang_boxing_object::_offsets[T_BOOLEAN - T_BOOLEAN], vmClasses::Boolean_klass(), "value", bool_signature, false); \
3994+
macro(java_lang_boxing_object::_offsets[T_CHAR - T_BOOLEAN], vmClasses::Character_klass(), "value", char_signature, false); \
3995+
macro(java_lang_boxing_object::_offsets[T_FLOAT - T_BOOLEAN], vmClasses::Float_klass(), "value", float_signature, false); \
3996+
macro(java_lang_boxing_object::_offsets[T_DOUBLE - T_BOOLEAN], vmClasses::Double_klass(), "value", double_signature, false); \
3997+
macro(java_lang_boxing_object::_offsets[T_BYTE - T_BOOLEAN], vmClasses::Byte_klass(), "value", byte_signature, false); \
3998+
macro(java_lang_boxing_object::_offsets[T_SHORT - T_BOOLEAN], vmClasses::Short_klass(), "value", short_signature, false); \
3999+
macro(java_lang_boxing_object::_offsets[T_INT - T_BOOLEAN], vmClasses::Integer_klass(), "value", int_signature, false); \
4000+
macro(java_lang_boxing_object::_offsets[T_LONG - T_BOOLEAN], vmClasses::Long_klass(), "value", long_signature, false);
39984001

39994002
void java_lang_boxing_object::compute_offsets() {
4000-
InstanceKlass* byteKlass = vmClasses::Byte_klass();
4001-
InstanceKlass* intKlass = vmClasses::Integer_klass();
4002-
InstanceKlass* longKlass = vmClasses::Long_klass();
4003+
assert(T_LONG - T_BOOLEAN == 7, "Sanity check");
4004+
java_lang_boxing_object::_offsets = NEW_C_HEAP_ARRAY(int, 8, mtInternal);
40034005
BOXING_FIELDS_DO(FIELD_COMPUTE_OFFSET);
40044006
}
40054007

40064008
#if INCLUDE_CDS
40074009
void java_lang_boxing_object::serialize_offsets(SerializeClosure* f) {
4010+
if (f->reading()) {
4011+
assert(T_LONG - T_BOOLEAN == 7, "Sanity check");
4012+
java_lang_boxing_object::_offsets = NEW_C_HEAP_ARRAY(int, 8, mtInternal);
4013+
}
40084014
BOXING_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
40094015
}
40104016
#endif
@@ -4025,28 +4031,28 @@ oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {
40254031
if (box == nullptr) return nullptr;
40264032
switch (type) {
40274033
case T_BOOLEAN:
4028-
box->bool_field_put(_sub32bits_value_offset, value->z);
4034+
box->bool_field_put(value_offset(type), value->z);
40294035
break;
40304036
case T_CHAR:
4031-
box->char_field_put(_sub32bits_value_offset, value->c);
4037+
box->char_field_put(value_offset(type), value->c);
40324038
break;
40334039
case T_FLOAT:
4034-
box->float_field_put(_32bits_value_offset, value->f);
4040+
box->float_field_put(value_offset(type), value->f);
40354041
break;
40364042
case T_DOUBLE:
4037-
box->double_field_put(_64bits_value_offset, value->d);
4043+
box->double_field_put(value_offset(type), value->d);
40384044
break;
40394045
case T_BYTE:
4040-
box->byte_field_put(_sub32bits_value_offset, value->b);
4046+
box->byte_field_put(value_offset(type), value->b);
40414047
break;
40424048
case T_SHORT:
4043-
box->short_field_put(_sub32bits_value_offset, value->s);
4049+
box->short_field_put(value_offset(type), value->s);
40444050
break;
40454051
case T_INT:
4046-
box->int_field_put(_32bits_value_offset, value->i);
4052+
box->int_field_put(value_offset(type), value->i);
40474053
break;
40484054
case T_LONG:
4049-
box->long_field_put(_64bits_value_offset, value->j);
4055+
box->long_field_put(value_offset(type), value->j);
40504056
break;
40514057
default:
40524058
return nullptr;
@@ -4068,28 +4074,28 @@ BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {
40684074
BasicType type = vmClasses::box_klass_type(box->klass());
40694075
switch (type) {
40704076
case T_BOOLEAN:
4071-
value->z = box->bool_field(_sub32bits_value_offset);
4077+
value->z = box->bool_field(value_offset(type));
40724078
break;
40734079
case T_CHAR:
4074-
value->c = box->char_field(_sub32bits_value_offset);
4080+
value->c = box->char_field(value_offset(type));
40754081
break;
40764082
case T_FLOAT:
4077-
value->f = box->float_field(_32bits_value_offset);
4083+
value->f = box->float_field(value_offset(type));
40784084
break;
40794085
case T_DOUBLE:
4080-
value->d = box->double_field(_64bits_value_offset);
4086+
value->d = box->double_field(value_offset(type));
40814087
break;
40824088
case T_BYTE:
4083-
value->b = box->byte_field(_sub32bits_value_offset);
4089+
value->b = box->byte_field(value_offset(type));
40844090
break;
40854091
case T_SHORT:
4086-
value->s = box->short_field(_sub32bits_value_offset);
4092+
value->s = box->short_field(value_offset(type));
40874093
break;
40884094
case T_INT:
4089-
value->i = box->int_field(_32bits_value_offset);
4095+
value->i = box->int_field(value_offset(type));
40904096
break;
40914097
case T_LONG:
4092-
value->j = box->long_field(_64bits_value_offset);
4098+
value->j = box->long_field(value_offset(type));
40934099
break;
40944100
default:
40954101
return T_ILLEGAL;
@@ -4102,28 +4108,28 @@ BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
41024108
BasicType type = vmClasses::box_klass_type(box->klass());
41034109
switch (type) {
41044110
case T_BOOLEAN:
4105-
box->bool_field_put(_sub32bits_value_offset, value->z);
4111+
box->bool_field_put(value_offset(type), value->z);
41064112
break;
41074113
case T_CHAR:
4108-
box->char_field_put(_sub32bits_value_offset, value->c);
4114+
box->char_field_put(value_offset(type), value->c);
41094115
break;
41104116
case T_FLOAT:
4111-
box->float_field_put(_32bits_value_offset, value->f);
4117+
box->float_field_put(value_offset(type), value->f);
41124118
break;
41134119
case T_DOUBLE:
4114-
box->double_field_put(_64bits_value_offset, value->d);
4120+
box->double_field_put(value_offset(type), value->d);
41154121
break;
41164122
case T_BYTE:
4117-
box->byte_field_put(_sub32bits_value_offset, value->b);
4123+
box->byte_field_put(value_offset(type), value->b);
41184124
break;
41194125
case T_SHORT:
4120-
box->short_field_put(_sub32bits_value_offset, value->s);
4126+
box->short_field_put(value_offset(type), value->s);
41214127
break;
41224128
case T_INT:
4123-
box->int_field_put(_32bits_value_offset, value->i);
4129+
box->int_field_put(value_offset(type), value->i);
41244130
break;
41254131
case T_LONG:
4126-
box->long_field_put(_64bits_value_offset, value->j);
4132+
box->long_field_put(value_offset(type), value->j);
41274133
break;
41284134
default:
41294135
return T_ILLEGAL;
@@ -5523,26 +5529,17 @@ bool JavaClasses::check_offset(const char *klass_name, int deserialized_offset,
55235529
void JavaClasses::check_offsets() {
55245530
bool valid = true;
55255531

5526-
#define CHECK_SUB32BITS_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
5527-
valid &= check_offset(klass_name, cpp_klass_name :: _ ##sub32bits_ ## field_name ## _offset, #field_name, field_sig)
5528-
5529-
#define CHECK_32BITS_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
5530-
valid &= check_offset(klass_name, cpp_klass_name :: _##32bits_ ## field_name ## _offset, #field_name, field_sig)
5531-
5532-
#define CHECK_64BITS_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
5533-
valid &= check_offset(klass_name, cpp_klass_name :: _##64bits_ ## field_name ## _offset, #field_name, field_sig)
5534-
5535-
5536-
// Boxed primitive objects (java_lang_boxing_object)
5537-
5538-
CHECK_SUB32BITS_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z");
5539-
CHECK_SUB32BITS_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
5540-
CHECK_32BITS_OFFSET("java/lang/Float", java_lang_boxing_object, value, "F");
5541-
CHECK_64BITS_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D");
5542-
CHECK_SUB32BITS_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B");
5543-
CHECK_SUB32BITS_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S");
5544-
CHECK_32BITS_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I");
5545-
CHECK_64BITS_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J");
5532+
#define CHECK_OFFSET(klass_name, type, field_sig) \
5533+
valid &= check_offset(klass_name, java_lang_boxing_object::value_offset(type), "value", field_sig)
5534+
5535+
CHECK_OFFSET("java/lang/Boolean", T_BOOLEAN, "Z");
5536+
CHECK_OFFSET("java/lang/Character", T_CHAR, "C");
5537+
CHECK_OFFSET("java/lang/Float", T_FLOAT, "F");
5538+
CHECK_OFFSET("java/lang/Double", T_DOUBLE, "D");
5539+
CHECK_OFFSET("java/lang/Byte", T_BYTE, "B");
5540+
CHECK_OFFSET("java/lang/Short", T_SHORT, "S");
5541+
CHECK_OFFSET("java/lang/Integer", T_INT, "I");
5542+
CHECK_OFFSET("java/lang/Long", T_LONG, "J");
55465543

55475544
if (!valid) vm_exit_during_initialization("Field offset verification failed");
55485545
}

src/hotspot/share/classfile/javaClasses.hpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -973,9 +973,7 @@ class reflect_ConstantPool {
973973

974974
class java_lang_boxing_object: AllStatic {
975975
private:
976-
static int _sub32bits_value_offset;
977-
static int _32bits_value_offset;
978-
static int _64bits_value_offset;
976+
static int* _offsets;
979977

980978
static void compute_offsets();
981979
static oop initialize_and_allocate(BasicType type, TRAPS);
@@ -992,8 +990,9 @@ class java_lang_boxing_object: AllStatic {
992990
static void print(BasicType type, jvalue* value, outputStream* st);
993991

994992
static int value_offset(BasicType type) {
995-
if (type == T_INT || type == T_FLOAT) return _32bits_value_offset;
996-
return is_double_word_type(type) ? _64bits_value_offset : _sub32bits_value_offset;
993+
assert(type >= T_BOOLEAN && type <= T_LONG, "BasicType out of range");
994+
assert(_offsets != nullptr, "Uninitialized offsets");
995+
return _offsets[type - T_BOOLEAN];
997996
}
998997

999998
static void serialize_offsets(SerializeClosure* f);

0 commit comments

Comments
 (0)