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