void typeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) {
  assert(s->is_typeArray(), "must be type array");

  // Check destination
  if (!d->is_typeArray() || element_type() != typeArrayKlass::cast(d->klass())->element_type()) {
    THROW(vmSymbols::java_lang_ArrayStoreException());
  }

  // Check is all offsets and lengths are non negative
  if (src_pos < 0 || dst_pos < 0 || length < 0) {
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
  }
  // Check if the ranges are valid
  if  ( (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length())
     || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) {
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
  }
  // Check zero copy
  if (length == 0)
    return;

  // This is an attempt to make the copy_array fast.
  int l2es = log2_element_size();
  int ihs = array_header_in_bytes() / wordSize;
  char* src = (char*) ((oop*)s + ihs) + ((size_t)src_pos << l2es);
  char* dst = (char*) ((oop*)d + ihs) + ((size_t)dst_pos << l2es);
  Copy::conjoint_memory_atomic(src, dst, (size_t)length << l2es);
}
Exemplo n.º 2
0
void typeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) {
  assert(s->is_typeArray(), "must be type array");

  // Check destination
  if (!d->is_typeArray() || element_type() != typeArrayKlass::cast(d->klass())->element_type()) {
    THROW(vmSymbols::java_lang_ArrayStoreException());
  }

  // Check is all offsets and lengths are non negative
  if (src_pos < 0 || dst_pos < 0 || length < 0) {
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
  }
  // Check if the ranges are valid
  if  ( (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length())
     || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) {
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
  }

  // This is an attempt to make the copy_array fast.
  // NB: memmove takes care of overlapping memory segments.
  // Potential problem: memmove is not guaranteed to be word atomic
  // Revisit in Merlin
  int l2es = log2_element_size();
  int ihs = array_header_in_bytes() / wordSize;
  char* src = (char*) ((oop*)s + ihs) + (src_pos << l2es);
  char* dst = (char*) ((oop*)d + ihs) + (dst_pos << l2es);
  memmove(dst, src, length << l2es);
}
Exemplo n.º 3
0
void TypeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) {
    assert(s->is_typeArray(), "must be type array");

    // Check destination
    if (!d->is_typeArray() || element_type() != TypeArrayKlass::cast(d->klass())->element_type()) {
        THROW(vmSymbols::java_lang_ArrayStoreException());
    }

    // Check is all offsets and lengths are non negative
    if (src_pos < 0 || dst_pos < 0 || length < 0) {
        THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
    }
    // Check if the ranges are valid
    if  ( (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length())
            || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) {
        THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
    }
    // Check zero copy
    if (length == 0)
        return;

#ifdef PROFILE_OBJECT_INFO
    if (ProfileObjectInfo) {
        ResourceMark rm;
        if (s->poi()) {
            s->poi()->batch_mark_load(length);
        }
        if (d->poi()) {
            d->poi()->batch_mark_store(length);
        }
    }
#endif
#ifdef PROFILE_OBJECT_ADDRESS_INFO
    if (ProfileObjectAddressInfo) {
        ObjectAddressInfoTable *oait = Universe::object_address_info_table();
        oait->batch_mark_load (s, length);
        oait->batch_mark_store(d, length);
    }
#endif

    // This is an attempt to make the copy_array fast.
    int l2es = log2_element_size();
    int ihs = array_header_in_bytes() / wordSize;
    char* src = (char*) ((oop*)s + ihs) + ((size_t)src_pos << l2es);
    char* dst = (char*) ((oop*)d + ihs) + ((size_t)dst_pos << l2es);
    Copy::conjoint_memory_atomic(src, dst, (size_t)length << l2es);
}