[vmkit-commits] [PATCH] Move ArrayCopy to new 'Shared.inc', use in both CP and OJ.

Nicolas Geoffray nicolas.geoffray at gmail.com
Tue Nov 1 12:30:37 PDT 2011


Could you name the file ArrayCopy.inc instead? I'm fine with having it in
lib/J3ClassLib, like you have done for SetProperties.inc. So I think you
should continue doing with with shared files whose names describe what's in
it.

Otherwise, the change looks good.

On Tue, Nov 1, 2011 at 6:01 AM, Will Dietz <wdietz2 at illinois.edu> wrote:

> Inlined below.
>
> Almost entirely a minor refactoring patch, FWIW.
>
> I'm not particular about where to put the common code (thoughts
> welcome), but "Shared.inc" seemed as good as any for the place to put
> shared ClassLib code that isn't already in its own neat file.
>
> Thanks!
>
> ~Will
>
> >From eb5a72d6de2bfd98e44e4bb0729954b29b4411a6 Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Thu, 27 Oct 2011 17:30:41 -0500
> Subject: [PATCH 7/8] Move ArrayCopy to new 'Shared.inc', use in both CP and
>  OJ.
>
> ---
>  lib/J3/ClassLib/GNUClasspath/ClasspathVMSystem.inc |   72
> +-----------------
>  lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp       |    1 +
>  lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp            |    1 +
>  lib/J3/ClassLib/OpenJDK/OpenJDK.inc                |   17 ++++-
>  lib/J3/ClassLib/Shared.inc                         |   82
> ++++++++++++++++++++
>  5 files changed, 101 insertions(+), 72 deletions(-)
>  create mode 100644 lib/J3/ClassLib/Shared.inc
>
> diff --git a/lib/J3/ClassLib/GNUClasspath/ClasspathVMSystem.inc
> b/lib/J3/ClassLib/GNUClasspath/ClasspathVMSystem.inc
> index 187bfa5..05469ed 100644
> --- a/lib/J3/ClassLib/GNUClasspath/ClasspathVMSystem.inc
> +++ b/lib/J3/ClassLib/GNUClasspath/ClasspathVMSystem.inc
> @@ -30,77 +30,7 @@ jint sstart,
>  JavaObject* dst,
>  jint dstart,
>  jint len) {
> -
> -  JavaObject* cur = 0;
> -  llvm_gcroot(src, 0);
> -  llvm_gcroot(dst, 0);
> -  llvm_gcroot(cur, 0);
> -  assert(src->getVirtualTable());
> -  assert(dst->getVirtualTable());
> -
> -  JavaThread* th = JavaThread::get();
> -  Jnjvm *vm = th->getJVM();
> -
> -  if (src == NULL || dst == NULL) {
> -    th->throwException(vm->CreateNullPointerException());
> -    UNREACHABLE();
> -  }
> -
> -  if (!(JavaObject::getClass(src)->isArray() &&
> -        JavaObject::getClass(dst)->isArray())) {
> -    th->throwException(vm->CreateArrayStoreException(
> -      (JavaVirtualTable*)dst->getVirtualTable()));
> -    UNREACHABLE();
> -  }
> -
> -  UserClassArray* ts = (UserClassArray*)JavaObject::getClass(src);
> -  UserClassArray* td = (UserClassArray*)JavaObject::getClass(dst);
> -  UserCommonClass* dstType = td->baseClass();
> -  UserCommonClass* srcType = ts->baseClass();
> -
> -  sint32 srcSize = JavaArray::getSize(src);
> -  sint32 dstSize = JavaArray::getSize(dst);
> -
> -  if (len > srcSize) {
> -    th->throwException(vm->CreateIndexOutOfBoundsException(len));
> -  } else if (len > dstSize) {
> -    th->throwException(vm->CreateIndexOutOfBoundsException(len));
> -  } else if (len + sstart > srcSize) {
> -    th->throwException(vm->CreateIndexOutOfBoundsException(len + sstart));
> -  } else if (len + dstart > dstSize) {
> -    th->throwException(vm->CreateIndexOutOfBoundsException(len + dstart));
> -  } else if (dstart < 0) {
> -    th->throwException(vm->CreateIndexOutOfBoundsException(dstart));
> -  } else if (sstart < 0) {
> -    th->throwException(vm->CreateIndexOutOfBoundsException(sstart));
> -  } else if (len < 0) {
> -    th->throwException(vm->CreateIndexOutOfBoundsException(len));
> -  } else if ((dstType->isPrimitive() || srcType->isPrimitive()) &&
> -             srcType != dstType) {
> -    th->throwException(vm->CreateArrayStoreException(
> -      (JavaVirtualTable*)dst->getVirtualTable()));
> -  }
> -
> -  if (!(dstType->isPrimitive())) {
> -    for (int i = 0; i < len; i++) {
> -      cur = ArrayObject::getElement((ArrayObject*)src, i + sstart);
> -      if (cur) {
> -        if (!(JavaObject::getClass(cur)->isAssignableFrom(dstType))) {
> -          th->throwException(vm->CreateArrayStoreException(
> -              (JavaVirtualTable*)dst->getVirtualTable()));
> -          break;
> -        } else {
> -          ArrayObject::setElement((ArrayObject*)dst, cur, i + dstart);
> -        }
> -      }
> -    }
> -  } else {
> -    uint32 logSize = dstType->asPrimitiveClass()->logSize;
> -    void* ptrDst = (void*)((int64_t)JavaArray::getElements(dst) +
> (dstart << logSize));
> -    void* ptrSrc = (void*)((int64_t)JavaArray::getElements(src) +
> (sstart << logSize));
> -    memmove(ptrDst, ptrSrc, len << logSize);
> -  }
> -
> +  Shared_ArrayCopy(src, sstart, dst, dstart, len);
>  }
>
>  JNIEXPORT jint JNICALL Java_java_lang_VMSystem_identityHashCode(
> diff --git a/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp
> b/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp
> index bc797d1..bb47192 100644
> --- a/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp
> +++ b/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp
> @@ -1075,6 +1075,7 @@ void Classpath::InitializeSystem(Jnjvm * jvm) {
>  #include "Classpath.inc"
>  #include "ClasspathField.inc"
>  #include "ClasspathMethod.inc"
> +#include "Shared.inc"
>  #include "ClasspathVMClass.inc"
>  #include "ClasspathVMClassLoader.inc"
>  #include "ClasspathVMObject.inc"
> diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> index 43ff227..a9d8c73 100644
> --- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> +++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> @@ -901,4 +901,5 @@ void Classpath::InitializeSystem(Jnjvm * jvm) {
>  #include "Classpath.inc"
>  #include "ClasspathField.inc"
>  #include "ClasspathMethod.inc"
> +#include "Shared.inc"
>  #include "OpenJDK.inc"
> diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> index e19bf96..fc4663c 100644
> --- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> +++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> @@ -215,7 +215,22 @@ JVM_NanoTime(JNIEnv *env, jclass ignored) {
>  JNIEXPORT void JNICALL
>  JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject jsrc, jint sstart,
>               jobject jdst, jint dstart, jint len) {
> -  NYI();
> +  JavaObject *src = 0;
> +  JavaObject *dst = 0;
> +  JavaObject* cur = 0;
> +  llvm_gcroot(src, 0);
> +  llvm_gcroot(dst, 0);
> +  llvm_gcroot(cur, 0);
> +
> +  BEGIN_JNI_EXCEPTION
> +
> +  src = *(JavaObject**)jsrc;
> +  dst = *(JavaObject**)jdst;
> +
> +  Shared_ArrayCopy(src, sstart, dst, dstart, len);
> +
> +  RETURN_VOID_FROM_JNI
> +  END_JNI_EXCEPTION
>  }
>
>  JNIEXPORT jobject JNICALL
> diff --git a/lib/J3/ClassLib/Shared.inc b/lib/J3/ClassLib/Shared.inc
> new file mode 100644
> index 0000000..f4d987e
> --- /dev/null
> +++ b/lib/J3/ClassLib/Shared.inc
> @@ -0,0 +1,82 @@
> +//===-- Shared.inc - Code common from ClassLib implementations
> ------------===//
> +//
> +//                            The VMKit project
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +
> +void Shared_ArrayCopy(JavaObject* src, jint sstart, JavaObject* dst,
> jint dstart, jint len)
> +{
> +  JavaObject* cur = 0;
> +  llvm_gcroot(src, 0);
> +  llvm_gcroot(dst, 0);
> +  llvm_gcroot(cur, 0);
> +  assert(src->getVirtualTable());
> +  assert(dst->getVirtualTable());
> +
> +  JavaThread* th = JavaThread::get();
> +  Jnjvm *vm = th->getJVM();
> +
> +  if (src == NULL || dst == NULL) {
> +    th->throwException(vm->CreateNullPointerException());
> +    UNREACHABLE();
> +  }
> +
> +  if (!(JavaObject::getClass(src)->isArray() &&
> +        JavaObject::getClass(dst)->isArray())) {
> +    th->throwException(vm->CreateArrayStoreException(
> +      (JavaVirtualTable*)dst->getVirtualTable()));
> +    UNREACHABLE();
> +  }
> +
> +  UserClassArray* ts = (UserClassArray*)JavaObject::getClass(src);
> +  UserClassArray* td = (UserClassArray*)JavaObject::getClass(dst);
> +  UserCommonClass* dstType = td->baseClass();
> +  UserCommonClass* srcType = ts->baseClass();
> +
> +  sint32 srcSize = JavaArray::getSize(src);
> +  sint32 dstSize = JavaArray::getSize(dst);
> +
> +  if (len > srcSize) {
> +    th->throwException(vm->CreateIndexOutOfBoundsException(len));
> +  } else if (len > dstSize) {
> +    th->throwException(vm->CreateIndexOutOfBoundsException(len));
> +  } else if (len + sstart > srcSize) {
> +    th->throwException(vm->CreateIndexOutOfBoundsException(len + sstart));
> +  } else if (len + dstart > dstSize) {
> +    th->throwException(vm->CreateIndexOutOfBoundsException(len + dstart));
> +  } else if (dstart < 0) {
> +    th->throwException(vm->CreateIndexOutOfBoundsException(dstart));
> +  } else if (sstart < 0) {
> +    th->throwException(vm->CreateIndexOutOfBoundsException(sstart));
> +  } else if (len < 0) {
> +    th->throwException(vm->CreateIndexOutOfBoundsException(len));
> +  } else if ((dstType->isPrimitive() || srcType->isPrimitive()) &&
> +             srcType != dstType) {
> +    th->throwException(vm->CreateArrayStoreException(
> +      (JavaVirtualTable*)dst->getVirtualTable()));
> +  }
> +
> +  if (!(dstType->isPrimitive())) {
> +    for (int i = 0; i < len; i++) {
> +      cur = ArrayObject::getElement((ArrayObject*)src, i + sstart);
> +      if (cur) {
> +        if (!(JavaObject::getClass(cur)->isAssignableFrom(dstType))) {
> +          th->throwException(vm->CreateArrayStoreException(
> +              (JavaVirtualTable*)dst->getVirtualTable()));
> +          break;
> +        } else {
> +          ArrayObject::setElement((ArrayObject*)dst, cur, i + dstart);
> +        }
> +      }
> +    }
> +  } else {
> +    uint32 logSize = dstType->asPrimitiveClass()->logSize;
> +    void* ptrDst = (void*)((int64_t)JavaArray::getElements(dst) +
> (dstart << logSize));
> +    void* ptrSrc = (void*)((int64_t)JavaArray::getElements(src) +
> (sstart << logSize));
> +    memmove(ptrDst, ptrSrc, len << logSize);
> +  }
> +}
> --
> 1.7.5.1
> _______________________________________________
> vmkit-commits mailing list
> vmkit-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/vmkit-commits/attachments/20111101/6df510df/attachment.html>


More information about the vmkit-commits mailing list