[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