oop_t MemObj::clone(MemObj** addrp) { if (is_byteVector()) { untested("calling regular clone() on a byte vector"); ByteVectorObj* this_bv = (ByteVectorObj*) this; return this_bv->clone_and_resize(this_bv->indexableSize(), 0, (ByteVectorObj**)addrp); } return clone_oops_and_allocate_bytes(total_size_in_oops(), NO_BYTES_PART, addrp); }
oop_t ByteVectorObj::clone_and_resize(smi new_indexable_size, char fill, ByteVectorObj** addrp, bool shouldFill) { ByteVectorObj* new_addr; char* new_bytes; oop_t new_bv = clone_oops_and_allocate_bytes(indexableOrigin(), new_indexable_size, (MemObj**) &new_addr, &new_bytes); new_addr->set_indexableSize(new_indexable_size); copy_bytes_to(new_bytes, new_indexable_size, fill, shouldFill); if (addrp) *addrp = new_addr; assert(new_addr->is_byteVector()); return new_bv; }