src/share/vm/classfile/javaClasses.cpp
Print this page
rev 3 : [mq]: anonk.patch
*** 1823,1954 ****
compute_offset(_base_offset, k,
vmSymbols::base_name(), vmSymbols::object_signature());
}
}
! oop java_lang_boxing_object::initialize_and_allocate(klassOop k, TRAPS) {
instanceKlassHandle h (THREAD, k);
if (!h->is_initialized()) h->initialize(CHECK_0);
return h->allocate_instance(THREAD);
}
oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {
! oop box;
switch (type) {
case T_BOOLEAN:
- box = initialize_and_allocate(SystemDictionary::boolean_klass(), CHECK_0);
box->bool_field_put(value_offset, value->z);
break;
case T_CHAR:
- box = initialize_and_allocate(SystemDictionary::char_klass(), CHECK_0);
box->char_field_put(value_offset, value->c);
break;
case T_FLOAT:
- box = initialize_and_allocate(SystemDictionary::float_klass(), CHECK_0);
box->float_field_put(value_offset, value->f);
break;
case T_DOUBLE:
- box = initialize_and_allocate(SystemDictionary::double_klass(), CHECK_0);
box->double_field_put(value_offset, value->d);
break;
case T_BYTE:
- box = initialize_and_allocate(SystemDictionary::byte_klass(), CHECK_0);
box->byte_field_put(value_offset, value->b);
break;
case T_SHORT:
- box = initialize_and_allocate(SystemDictionary::short_klass(), CHECK_0);
box->short_field_put(value_offset, value->s);
break;
case T_INT:
- box = initialize_and_allocate(SystemDictionary::int_klass(), CHECK_0);
box->int_field_put(value_offset, value->i);
break;
case T_LONG:
- box = initialize_and_allocate(SystemDictionary::long_klass(), CHECK_0);
box->long_field_put(value_offset, value->j);
break;
default:
return NULL;
}
return box;
}
BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {
! klassOop k = box->klass();
! if (k == SystemDictionary::boolean_klass()) {
value->z = box->bool_field(value_offset);
! return T_BOOLEAN;
! }
! if (k == SystemDictionary::char_klass()) {
value->c = box->char_field(value_offset);
! return T_CHAR;
! }
! if (k == SystemDictionary::float_klass()) {
value->f = box->float_field(value_offset);
! return T_FLOAT;
! }
! if (k == SystemDictionary::double_klass()) {
value->d = box->double_field(value_offset);
! return T_DOUBLE;
! }
! if (k == SystemDictionary::byte_klass()) {
value->b = box->byte_field(value_offset);
! return T_BYTE;
! }
! if (k == SystemDictionary::short_klass()) {
value->s = box->short_field(value_offset);
! return T_SHORT;
! }
! if (k == SystemDictionary::int_klass()) {
value->i = box->int_field(value_offset);
! return T_INT;
! }
! if (k == SystemDictionary::long_klass()) {
value->j = box->long_field(value_offset);
! return T_LONG;
! }
return T_ILLEGAL;
}
BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
! klassOop k = box->klass();
! if (k == SystemDictionary::boolean_klass()) {
box->bool_field_put(value_offset, value->z);
! return T_BOOLEAN;
! }
! if (k == SystemDictionary::char_klass()) {
box->char_field_put(value_offset, value->c);
! return T_CHAR;
! }
! if (k == SystemDictionary::float_klass()) {
box->float_field_put(value_offset, value->f);
! return T_FLOAT;
! }
! if (k == SystemDictionary::double_klass()) {
box->double_field_put(value_offset, value->d);
! return T_DOUBLE;
! }
! if (k == SystemDictionary::byte_klass()) {
box->byte_field_put(value_offset, value->b);
! return T_BYTE;
! }
! if (k == SystemDictionary::short_klass()) {
box->short_field_put(value_offset, value->s);
! return T_SHORT;
! }
! if (k == SystemDictionary::int_klass()) {
box->int_field_put(value_offset, value->i);
! return T_INT;
! }
! if (k == SystemDictionary::long_klass()) {
box->long_field_put(value_offset, value->j);
! return T_LONG;
! }
return T_ILLEGAL;
}
// Support for java_lang_ref_Reference
--- 1823,1950 ----
compute_offset(_base_offset, k,
vmSymbols::base_name(), vmSymbols::object_signature());
}
}
! oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) {
! klassOop k = SystemDictionary::box_klass(type);
! if (k == NULL) return NULL;
instanceKlassHandle h (THREAD, k);
if (!h->is_initialized()) h->initialize(CHECK_0);
return h->allocate_instance(THREAD);
}
oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {
! oop box = initialize_and_allocate(type, CHECK_0);
! if (box == NULL) return NULL;
switch (type) {
case T_BOOLEAN:
box->bool_field_put(value_offset, value->z);
break;
case T_CHAR:
box->char_field_put(value_offset, value->c);
break;
case T_FLOAT:
box->float_field_put(value_offset, value->f);
break;
case T_DOUBLE:
box->double_field_put(value_offset, value->d);
break;
case T_BYTE:
box->byte_field_put(value_offset, value->b);
break;
case T_SHORT:
box->short_field_put(value_offset, value->s);
break;
case T_INT:
box->int_field_put(value_offset, value->i);
break;
case T_LONG:
box->long_field_put(value_offset, value->j);
break;
default:
return NULL;
}
return box;
}
+ BasicType java_lang_boxing_object::basic_type(oop box) {
+ if (box == NULL) return T_ILLEGAL;
+ BasicType type = SystemDictionary::box_klass_type(box->klass());
+ if (type == T_OBJECT) // 'unknown' value returned by SD::bkt
+ return T_ILLEGAL;
+ return type;
+ }
+
+
BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {
! BasicType type = SystemDictionary::box_klass_type(box->klass());
! switch (type) {
! case T_BOOLEAN:
value->z = box->bool_field(value_offset);
! break;
! case T_CHAR:
value->c = box->char_field(value_offset);
! break;
! case T_FLOAT:
value->f = box->float_field(value_offset);
! break;
! case T_DOUBLE:
value->d = box->double_field(value_offset);
! break;
! case T_BYTE:
value->b = box->byte_field(value_offset);
! break;
! case T_SHORT:
value->s = box->short_field(value_offset);
! break;
! case T_INT:
value->i = box->int_field(value_offset);
! break;
! case T_LONG:
value->j = box->long_field(value_offset);
! break;
! default:
return T_ILLEGAL;
+ } // end switch
+ return type;
}
BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
! BasicType type = SystemDictionary::box_klass_type(box->klass());
! switch (type) {
! case T_BOOLEAN:
box->bool_field_put(value_offset, value->z);
! break;
! case T_CHAR:
box->char_field_put(value_offset, value->c);
! break;
! case T_FLOAT:
box->float_field_put(value_offset, value->f);
! break;
! case T_DOUBLE:
box->double_field_put(value_offset, value->d);
! break;
! case T_BYTE:
box->byte_field_put(value_offset, value->b);
! break;
! case T_SHORT:
box->short_field_put(value_offset, value->s);
! break;
! case T_INT:
box->int_field_put(value_offset, value->i);
! break;
! case T_LONG:
box->long_field_put(value_offset, value->j);
! break;
! default:
return T_ILLEGAL;
+ } // end switch
+ return type;
}
// Support for java_lang_ref_Reference