@@ -3987,24 +3987,30 @@ bool java_lang_ref_Reference::is_referent_field(oop obj, ptrdiff_t offset) {
3987
3987
return is_reference;
3988
3988
}
3989
3989
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);
3998
4001
3999
4002
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);
4003
4005
BOXING_FIELDS_DO (FIELD_COMPUTE_OFFSET);
4004
4006
}
4005
4007
4006
4008
#if INCLUDE_CDS
4007
4009
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
+ }
4008
4014
BOXING_FIELDS_DO (FIELD_SERIALIZE_OFFSET);
4009
4015
}
4010
4016
#endif
@@ -4025,28 +4031,28 @@ oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {
4025
4031
if (box == nullptr ) return nullptr ;
4026
4032
switch (type) {
4027
4033
case T_BOOLEAN:
4028
- box->bool_field_put (_sub32bits_value_offset , value->z );
4034
+ box->bool_field_put (value_offset (type) , value->z );
4029
4035
break ;
4030
4036
case T_CHAR:
4031
- box->char_field_put (_sub32bits_value_offset , value->c );
4037
+ box->char_field_put (value_offset (type) , value->c );
4032
4038
break ;
4033
4039
case T_FLOAT:
4034
- box->float_field_put (_32bits_value_offset , value->f );
4040
+ box->float_field_put (value_offset (type) , value->f );
4035
4041
break ;
4036
4042
case T_DOUBLE:
4037
- box->double_field_put (_64bits_value_offset , value->d );
4043
+ box->double_field_put (value_offset (type) , value->d );
4038
4044
break ;
4039
4045
case T_BYTE:
4040
- box->byte_field_put (_sub32bits_value_offset , value->b );
4046
+ box->byte_field_put (value_offset (type) , value->b );
4041
4047
break ;
4042
4048
case T_SHORT:
4043
- box->short_field_put (_sub32bits_value_offset , value->s );
4049
+ box->short_field_put (value_offset (type) , value->s );
4044
4050
break ;
4045
4051
case T_INT:
4046
- box->int_field_put (_32bits_value_offset , value->i );
4052
+ box->int_field_put (value_offset (type) , value->i );
4047
4053
break ;
4048
4054
case T_LONG:
4049
- box->long_field_put (_64bits_value_offset , value->j );
4055
+ box->long_field_put (value_offset (type) , value->j );
4050
4056
break ;
4051
4057
default :
4052
4058
return nullptr ;
@@ -4068,28 +4074,28 @@ BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {
4068
4074
BasicType type = vmClasses::box_klass_type (box->klass ());
4069
4075
switch (type) {
4070
4076
case T_BOOLEAN:
4071
- value->z = box->bool_field (_sub32bits_value_offset );
4077
+ value->z = box->bool_field (value_offset (type) );
4072
4078
break ;
4073
4079
case T_CHAR:
4074
- value->c = box->char_field (_sub32bits_value_offset );
4080
+ value->c = box->char_field (value_offset (type) );
4075
4081
break ;
4076
4082
case T_FLOAT:
4077
- value->f = box->float_field (_32bits_value_offset );
4083
+ value->f = box->float_field (value_offset (type) );
4078
4084
break ;
4079
4085
case T_DOUBLE:
4080
- value->d = box->double_field (_64bits_value_offset );
4086
+ value->d = box->double_field (value_offset (type) );
4081
4087
break ;
4082
4088
case T_BYTE:
4083
- value->b = box->byte_field (_sub32bits_value_offset );
4089
+ value->b = box->byte_field (value_offset (type) );
4084
4090
break ;
4085
4091
case T_SHORT:
4086
- value->s = box->short_field (_sub32bits_value_offset );
4092
+ value->s = box->short_field (value_offset (type) );
4087
4093
break ;
4088
4094
case T_INT:
4089
- value->i = box->int_field (_32bits_value_offset );
4095
+ value->i = box->int_field (value_offset (type) );
4090
4096
break ;
4091
4097
case T_LONG:
4092
- value->j = box->long_field (_64bits_value_offset );
4098
+ value->j = box->long_field (value_offset (type) );
4093
4099
break ;
4094
4100
default :
4095
4101
return T_ILLEGAL;
@@ -4102,28 +4108,28 @@ BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
4102
4108
BasicType type = vmClasses::box_klass_type (box->klass ());
4103
4109
switch (type) {
4104
4110
case T_BOOLEAN:
4105
- box->bool_field_put (_sub32bits_value_offset , value->z );
4111
+ box->bool_field_put (value_offset (type) , value->z );
4106
4112
break ;
4107
4113
case T_CHAR:
4108
- box->char_field_put (_sub32bits_value_offset , value->c );
4114
+ box->char_field_put (value_offset (type) , value->c );
4109
4115
break ;
4110
4116
case T_FLOAT:
4111
- box->float_field_put (_32bits_value_offset , value->f );
4117
+ box->float_field_put (value_offset (type) , value->f );
4112
4118
break ;
4113
4119
case T_DOUBLE:
4114
- box->double_field_put (_64bits_value_offset , value->d );
4120
+ box->double_field_put (value_offset (type) , value->d );
4115
4121
break ;
4116
4122
case T_BYTE:
4117
- box->byte_field_put (_sub32bits_value_offset , value->b );
4123
+ box->byte_field_put (value_offset (type) , value->b );
4118
4124
break ;
4119
4125
case T_SHORT:
4120
- box->short_field_put (_sub32bits_value_offset , value->s );
4126
+ box->short_field_put (value_offset (type) , value->s );
4121
4127
break ;
4122
4128
case T_INT:
4123
- box->int_field_put (_32bits_value_offset , value->i );
4129
+ box->int_field_put (value_offset (type) , value->i );
4124
4130
break ;
4125
4131
case T_LONG:
4126
- box->long_field_put (_64bits_value_offset , value->j );
4132
+ box->long_field_put (value_offset (type) , value->j );
4127
4133
break ;
4128
4134
default :
4129
4135
return T_ILLEGAL;
@@ -5523,26 +5529,17 @@ bool JavaClasses::check_offset(const char *klass_name, int deserialized_offset,
5523
5529
void JavaClasses::check_offsets () {
5524
5530
bool valid = true ;
5525
5531
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" );
5546
5543
5547
5544
if (!valid) vm_exit_during_initialization (" Field offset verification failed" );
5548
5545
}
0 commit comments