< prev index next >

src/hotspot/share/memory/oopFactory.cpp

Print this page

        

*** 31,43 **** --- 31,46 ---- #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.hpp" #include "oops/instanceKlass.hpp" #include "oops/instanceOop.hpp" + #include "oops/objArrayOop.inline.hpp" #include "oops/objArrayOop.hpp" #include "oops/oop.inline.hpp" #include "oops/typeArrayOop.inline.hpp" + #include "oops/valueKlass.hpp" + #include "oops/valueArrayKlass.hpp" #include "runtime/handles.inline.hpp" typeArrayOop oopFactory::new_charArray(const char* utf8_str, TRAPS) { int length = utf8_str == NULL ? 0 : UTF8::unicode_length(utf8_str);
*** 79,95 **** --- 82,130 ---- } objArrayOop oopFactory::new_objArray(Klass* klass, int length, TRAPS) { assert(klass->is_klass(), "must be instance class"); + assert(!klass->is_value() || (!ValueKlass::cast(klass)->flatten_array()), + "Did not expect flatten array of value klass"); if (klass->is_array_klass()) { return ArrayKlass::cast(klass)->allocate_arrayArray(1, length, THREAD); } else { return InstanceKlass::cast(klass)->allocate_objArray(1, length, THREAD); } } + arrayOop oopFactory::new_valueArray(Klass* klass, int length, TRAPS) { + assert(klass->is_value(), "Klass must be value type"); + Klass* array_klass = klass->array_klass(CHECK_NULL); // Flat value array or object array ? + assert(array_klass->is_valueArray_klass() || array_klass->is_objArray_klass(), + "Expect an array class here"); + + if (array_klass->is_valueArray_klass()) { + return (arrayOop) ValueArrayKlass::cast(array_klass)->allocate(length, THREAD); + } + + ValueKlass* vklass = ValueKlass::cast(klass); + objArrayOop array = oopFactory::new_objArray(klass, length, CHECK_NULL); + if (length == 0) { + return array; + } + + // Populate default values... + objArrayHandle array_h(THREAD, array); + instanceOop value = (instanceOop)vklass->default_value(); + for (int i = 0; i < length; i++) { + array_h->obj_at_put(i, value); + } + return array_h(); + } + + arrayOop oopFactory::new_array(Klass* klass, int length, TRAPS) { + return (klass->is_value()) ? new_valueArray(klass, length, THREAD) : + (arrayOop)new_objArray(klass, length, THREAD); + } + objArrayHandle oopFactory::new_objArray_handle(Klass* klass, int length, TRAPS) { objArrayOop obj = new_objArray(klass, length, CHECK_(objArrayHandle())); return objArrayHandle(THREAD, obj); }
< prev index next >