oop doubleByteArrayKlass::allocateObjectSize(int size, bool permit_scavenge, bool tenured) { klassOop k = as_klassOop(); int ni_size = non_indexable_size(); int obj_size = ni_size + 1 + roundTo(size * 2, oopSize) / oopSize; // allocate oop* result = tenured ? Universe::allocate_tenured(obj_size, permit_scavenge) : Universe::allocate(obj_size, (memOop*)&k, permit_scavenge); if (result == NULL) return NULL; doubleByteArrayOop obj = as_doubleByteArrayOop(result); // header memOop(obj)->initialize_header(true, k); // instance variables memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size); // indexables oop* base = (oop*) obj->addr(); oop* end = base + obj_size; // %optimized 'obj->set_length(size)' base[ni_size] = as_smiOop(size); // %optimized 'for (int index = 1; index <= size; index++) // obj->doubleByte_at_put(index, 0)' base = &base[ni_size+1]; while (base < end) *base++ = (oop) 0; return obj; }
PRIM_DECL_2(doubleByteArrayPrimitives::allocateSize, oop receiver, oop argument) { PROLOGUE_2("allocateSize", receiver, argument) assert(receiver->is_klass() && klassOop(receiver)->klass_part()->oop_is_doubleByteArray(), "receiver must double byte array class"); if (!argument->is_smi()) markSymbol(vmSymbols::first_argument_has_wrong_type()); if (smiOop(argument)->value() < 0) return markSymbol(vmSymbols::negative_size()); klassOop k = klassOop(receiver); int ni_size = k->klass_part()->non_indexable_size(); int obj_size = ni_size + 1 + roundTo(smiOop(argument)->value() * 2, oopSize) / oopSize; // allocate doubleByteArrayOop obj = as_doubleByteArrayOop(Universe::allocate(obj_size, (memOop*)&k)); // header memOop(obj)->initialize_header(true, k); // instance variables memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size); // indexables oop* base = (oop*) obj->addr(); oop* end = base + obj_size; // %optimized 'obj->set_length(size)' base[ni_size] = argument; // %optimized 'for (int index = 1; index <= size; index++) // obj->doubleByte_at_put(index, 0)' base = &base[ni_size+1]; while (base < end) *base++ = (oop) 0; return obj; }