src/share/vm/classfile/javaClasses.cpp
Print this page
rev 3 : [mq]: anonk.patch
@@ -1823,132 +1823,128 @@
compute_offset(_base_offset, k,
vmSymbols::base_name(), vmSymbols::object_signature());
}
}
-oop java_lang_boxing_object::initialize_and_allocate(klassOop k, TRAPS) {
+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;
+ oop box = initialize_and_allocate(type, CHECK_0);
+ if (box == NULL) return NULL;
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::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) {
- klassOop k = box->klass();
- if (k == SystemDictionary::boolean_klass()) {
+ BasicType type = SystemDictionary::box_klass_type(box->klass());
+ switch (type) {
+ case T_BOOLEAN:
value->z = box->bool_field(value_offset);
- return T_BOOLEAN;
- }
- if (k == SystemDictionary::char_klass()) {
+ break;
+ case T_CHAR:
value->c = box->char_field(value_offset);
- return T_CHAR;
- }
- if (k == SystemDictionary::float_klass()) {
+ break;
+ case T_FLOAT:
value->f = box->float_field(value_offset);
- return T_FLOAT;
- }
- if (k == SystemDictionary::double_klass()) {
+ break;
+ case T_DOUBLE:
value->d = box->double_field(value_offset);
- return T_DOUBLE;
- }
- if (k == SystemDictionary::byte_klass()) {
+ break;
+ case T_BYTE:
value->b = box->byte_field(value_offset);
- return T_BYTE;
- }
- if (k == SystemDictionary::short_klass()) {
+ break;
+ case T_SHORT:
value->s = box->short_field(value_offset);
- return T_SHORT;
- }
- if (k == SystemDictionary::int_klass()) {
+ break;
+ case T_INT:
value->i = box->int_field(value_offset);
- return T_INT;
- }
- if (k == SystemDictionary::long_klass()) {
+ break;
+ case T_LONG:
value->j = box->long_field(value_offset);
- return T_LONG;
- }
+ break;
+ default:
return T_ILLEGAL;
+ } // end switch
+ return type;
}
BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
- klassOop k = box->klass();
- if (k == SystemDictionary::boolean_klass()) {
+ BasicType type = SystemDictionary::box_klass_type(box->klass());
+ switch (type) {
+ case T_BOOLEAN:
box->bool_field_put(value_offset, value->z);
- return T_BOOLEAN;
- }
- if (k == SystemDictionary::char_klass()) {
+ break;
+ case T_CHAR:
box->char_field_put(value_offset, value->c);
- return T_CHAR;
- }
- if (k == SystemDictionary::float_klass()) {
+ break;
+ case T_FLOAT:
box->float_field_put(value_offset, value->f);
- return T_FLOAT;
- }
- if (k == SystemDictionary::double_klass()) {
+ break;
+ case T_DOUBLE:
box->double_field_put(value_offset, value->d);
- return T_DOUBLE;
- }
- if (k == SystemDictionary::byte_klass()) {
+ break;
+ case T_BYTE:
box->byte_field_put(value_offset, value->b);
- return T_BYTE;
- }
- if (k == SystemDictionary::short_klass()) {
+ break;
+ case T_SHORT:
box->short_field_put(value_offset, value->s);
- return T_SHORT;
- }
- if (k == SystemDictionary::int_klass()) {
+ break;
+ case T_INT:
box->int_field_put(value_offset, value->i);
- return T_INT;
- }
- if (k == SystemDictionary::long_klass()) {
+ break;
+ case T_LONG:
box->long_field_put(value_offset, value->j);
- return T_LONG;
- }
+ break;
+ default:
return T_ILLEGAL;
+ } // end switch
+ return type;
}
// Support for java_lang_ref_Reference