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

Will Dietz wdietz2 at illinois.edu
Mon Oct 31 22:01:47 PDT 2011


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



More information about the vmkit-commits mailing list