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