Few comments. Please apply when you've addressed them.<br><br><div class="gmail_quote">On Mon, Nov 7, 2011 at 3:57 AM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Inlined below.<br>
<br>
~Will<br>
<br>
>From b27df42e89b104ec6d98f0d35fee5ddf1c8c64aa Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Sat, 5 Nov 2011 20:24:31 -0500<br>
Subject: [PATCH 1/8] Refactor JavaObject-related ClassLib code.<br>
<br>
---<br>
 lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc |   68 +------------------<br>
 lib/J3/ClassLib/Object.inc                         |   31 +++++++++<br>
 lib/J3/ClassLib/OpenJDK/OpenJDK.inc                |   46 ++++++-------<br>
 lib/J3/VMCore/JavaObject.cpp                       |   66 +++++++++++++++++++<br>
 lib/J3/VMCore/JavaObject.h                         |    4 +<br>
 5 files changed, 127 insertions(+), 88 deletions(-)<br>
 create mode 100644 lib/J3/ClassLib/Object.inc<br>
<br>
diff --git a/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc<br>
b/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc<br>
index ab3f0c5..1c981d4 100644<br>
--- a/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc<br>
+++ b/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc<br>
@@ -10,11 +10,8 @@<br>
 #include "types.h"<br>
<br>
 #include "Classpath.h"<br>
-#include "JavaArray.h"<br>
-#include "JavaClass.h"<br>
-#include "JavaObject.h"<br>
-#include "JavaThread.h"<br>
 #include "Jnjvm.h"<br>
+#include "Object.inc"<br>
<br>
 using namespace j3;<br>
<br>
@@ -28,59 +25,12 @@ jclass clazz,<br>
 JavaObject* src) {<br>
<br>
   JavaObject* res = NULL;<br>
-  JavaObject* tmp = NULL;<br>
   llvm_gcroot(res, 0);<br>
   llvm_gcroot(src, 0);<br>
<br>
   BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
-  UserCommonClass* cl = JavaObject::getClass(src);<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  if (cl->isArray()) {<br>
-    UserClassArray* array = cl->asArrayClass();<br>
-    int length = JavaArray::getSize(src);<br>
-    res = array->doNew(length, vm);<br>
-    UserCommonClass* base = array->baseClass();<br>
-    if (base->isPrimitive()) {<br>
-      int size = length << base->asPrimitiveClass()->logSize;<br>
-      memcpy((void*)((uintptr_t)res + sizeof(JavaObject) + sizeof(size_t)),<br>
-             (void*)((uintptr_t)src + sizeof(JavaObject) + sizeof(size_t)),<br>
-             size);<br>
-    } else {<br>
-      for (int i = 0; i < length; i++) {<br>
-        tmp = ArrayObject::getElement((ArrayObject*)src, i);<br>
-        ArrayObject::setElement((ArrayObject*)res, tmp, i);<br>
-      }<br>
-    }<br>
-  } else {<br>
-    assert(cl->isClass() && "Not a class!");<br>
-    res = cl->asClass()->doNew(vm);<br>
-    while (cl != NULL) {<br>
-      for (uint32 i = 0; i < cl->asClass()->nbVirtualFields; ++i) {<br>
-        JavaField& field = cl->asClass()->virtualFields[i];<br>
-        if (field.isReference()) {<br>
-          tmp = field.getInstanceObjectField(src);<br>
-          JavaObject** ptr = field.getInstanceObjectFieldPtr(res);<br>
-          mvm::Collector::objectReferenceWriteBarrier((gc*)res,<br>
(gc**)ptr, (gc*)tmp);<br>
-        } else if (field.isLong()) {<br>
-          field.setInstanceLongField(res, field.getInstanceLongField(src));<br>
-        } else if (field.isDouble()) {<br>
-          field.setInstanceDoubleField(res, field.getInstanceDoubleField(src));<br>
-        } else if (field.isInt()) {<br>
-          field.setInstanceInt32Field(res, field.getInstanceInt32Field(src));<br>
-        } else if (field.isFloat()) {<br>
-          field.setInstanceFloatField(res, field.getInstanceFloatField(src));<br>
-        } else if (field.isShort() || field.isChar()) {<br>
-          field.setInstanceInt16Field(res, field.getInstanceInt16Field(src));<br>
-        } else if (field.isByte() || field.isBoolean()) {<br>
-          field.setInstanceInt8Field(res, field.getInstanceInt8Field(src));<br>
-        } else {<br>
-          UNREACHABLE();<br>
-        }<br>
-      }<br>
-      cl = cl->super;<br>
-    }<br>
-  }<br>
+  res = JavaObject::clone(src);<br>
<br>
   END_NATIVE_EXCEPTION<br>
<br>
@@ -130,23 +80,13 @@ JNIEXPORT void JNICALL Java_java_lang_VMObject_wait(<br>
 JNIEnv *env,<br>
 jclass clazz,<br>
 #endif<br>
-JavaObject* obj, jlong ms, jint ns) {<br>
+JavaObject* obj, long long ms, int ns) {<br></blockquote><div><br></div><div>Please use int64_t instead of long long.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<br>
   llvm_gcroot(obj, 0);<br>
<br>
   BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
-  uint32 sec = (uint32) (ms / 1000);<br>
-  uint32 usec = (ns / 1000) + 1000 * (ms % 1000);<br>
-  if (ns && !usec) usec = 1;<br>
-  if (sec || usec) {<br>
-    struct timeval t;<br>
-    t.tv_sec = sec;<br>
-    t.tv_usec = usec;<br>
-    JavaObject::timedWait(obj, t);<br>
-  } else {<br>
-    JavaObject::wait(obj);<br>
-  }<br>
+  Object_wait(obj, ms, ns);<br>
<br>
   END_NATIVE_EXCEPTION<br>
 }<br>
diff --git a/lib/J3/ClassLib/Object.inc b/lib/J3/ClassLib/Object.inc<br>
new file mode 100644<br>
index 0000000..aa6f92b<br>
--- /dev/null<br>
+++ b/lib/J3/ClassLib/Object.inc<br>
@@ -0,0 +1,31 @@<br>
+//===---------- Object.inc - Shared j.l.Object code<br>
-----------------------===//<br>
+//                            The VMKit project<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "JavaObject.h"<br>
+<br>
+void Object_wait(JavaObject* obj, jlong ms, jint ns) {<br></blockquote><div><br></div><div>Could that just go in JavaObject.h/JavaObject.cpp?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

+  llvm_gcroot(obj, 0);<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+<br>
+  if (ms < 0 || ns < 0) {<br>
+    vm->illegalArgumentException("Negative wait time specified");<br>
+  }<br>
+<br>
+  uint32 sec = (uint32) (ms / 1000);<br>
+  uint32 usec = (ns / 1000) + 1000 * (ms % 1000);<br>
+  if (ns && !usec) usec = 1;<br>
+  if (sec || usec) {<br>
+    struct timeval t;<br>
+    t.tv_sec = sec;<br>
+    t.tv_usec = usec;<br>
+    JavaObject::timedWait(obj, t);<br>
+  } else {<br>
+    JavaObject::wait(obj);<br>
+  }<br>
+}<br>
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
index 9d92f91..947b7d3 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
@@ -8,10 +8,12 @@<br>
<br>
 #include "jvm.h"<br>
<br>
-#include "ArrayCopy.inc"<br>
 #include "JavaConstantPool.h"<br>
 #include "Reader.h"<br>
+<br>
+#include "ArrayCopy.inc"<br>
 #include "SetProperties.inc"<br>
+#include "Object.inc"<br>
<br>
 #include <errno.h><br>
 #include <fcntl.h><br>
@@ -115,51 +117,47 @@ JVM_IHashCode(JNIEnv *env, jobject _obj) {<br>
<br>
 JNIEXPORT void JNICALL<br>
 JVM_MonitorWait(JNIEnv *env, jobject obj, jlong ms) {<br>
-  JavaObject * o = 0;<br>
-  llvm_gcroot(o, 0);<br>
-<br>
   BEGIN_JNI_EXCEPTION<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-<br>
-  o = *(JavaObject**)obj;<br>
<br>
-  if (ms < 0) {<br>
-    vm->illegalArgumentException("Negative wait time specified");<br>
-  }<br>
-  if (ms) {<br>
-    struct timeval info;<br>
-    uint64_t usec = ms * 1000LL;<br>
-    info.tv_usec = usec % 1000000LL;<br>
-    info.tv_sec = usec / 1000000LL;<br>
-    JavaObject::timedWait(o, info);<br>
-  } else {<br>
-    JavaObject::wait(o);<br>
-  }<br>
+  Object_wait(*(JavaObject**)obj, ms, 0);<br>
   RETURN_VOID_FROM_JNI<br>
+<br>
   END_JNI_EXCEPTION<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
 JVM_MonitorNotify(JNIEnv *env, jobject obj) {<br>
   BEGIN_JNI_EXCEPTION<br>
-  JavaObject * o = *(JavaObject**)obj;<br>
-  JavaObject::notify(o);<br>
+<br>
+  JavaObject::notify(*(JavaObject**)obj);<br>
+<br>
   RETURN_VOID_FROM_JNI<br>
+<br>
   END_JNI_EXCEPTION<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
 JVM_MonitorNotifyAll(JNIEnv *env, jobject obj) {<br>
   BEGIN_JNI_EXCEPTION<br>
-  JavaObject * o = *(JavaObject**)obj;<br>
-  JavaObject::notifyAll(o);<br>
+<br>
+  JavaObject::notifyAll(*(JavaObject**)obj);<br>
   RETURN_VOID_FROM_JNI<br>
+<br>
   END_JNI_EXCEPTION<br>
 }<br>
<br>
 JNIEXPORT jobject JNICALL<br>
 JVM_Clone(JNIEnv *env, jobject obj) {<br>
-  NYI();<br>
+  JavaObject * clone = 0;<br>
+  llvm_gcroot(clone, 0);<br>
+  BEGIN_JNI_EXCEPTION<br>
+<br>
+  clone = JavaObject::clone(*(JavaObject**)obj);<br>
+  RETURN_FROM_JNI((jobject)th->pushJNIRef(clone));<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 /*<br>
diff --git a/lib/J3/VMCore/JavaObject.cpp b/lib/J3/VMCore/JavaObject.cpp<br>
index 55305af..d5e989f 100644<br>
--- a/lib/J3/VMCore/JavaObject.cpp<br>
+++ b/lib/J3/VMCore/JavaObject.cpp<br>
@@ -9,6 +9,7 @@<br>
<br>
 #include "mvm/Threads/Locks.h"<br>
<br>
+#include "JavaArray.h"<br>
 #include "JavaClass.h"<br>
 #include "JavaObject.h"<br>
 #include "JavaThread.h"<br>
@@ -118,6 +119,71 @@ void JavaObject::notifyAll(JavaObject* self) {<br>
   thread->lockingThread.notifyAll(self, table);<br>
 }<br>
<br>
+JavaObject* JavaObject::clone(JavaObject* src) {<br>
+  JavaObject* res = 0;<br>
+  JavaObject* tmp = 0;<br>
+<br>
+  llvm_gcroot(src, 0);<br>
+  llvm_gcroot(res, 0);<br>
+  llvm_gcroot(tmp, 0);<br>
+<br>
+  UserCommonClass* cl = JavaObject::getClass(src);<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+<br>
+  // If this doesn't inherit the Cloneable interface, throw exception<br>
+  // TODO: Add support in both VM's </blockquote><div><br></div><div>VM's -> Class libraries</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
for the upcalls fields used here<br>
+  //if (!JavaObject::instanceOf(src, vm->upcalls->cloneableClass))<br>
+  //  vm->cloneNotSupportedException();<br>
+<br>
+  if (cl->isArray()) {<br>
+    UserClassArray* array = cl->asArrayClass();<br>
+    int length = JavaArray::getSize(src);<br>
+    res = array->doNew(length, vm);<br>
+    UserCommonClass* base = array->baseClass();<br>
+    if (base->isPrimitive()) {<br>
+      int size = length << base->asPrimitiveClass()->logSize;<br>
+      memcpy((void*)((uintptr_t)res + sizeof(JavaObject) + sizeof(size_t)),<br>
+             (void*)((uintptr_t)src + sizeof(JavaObject) + sizeof(size_t)),<br>
+             size);<br>
+    } else {<br>
+      for (int i = 0; i < length; i++) {<br>
+        tmp = ArrayObject::getElement((ArrayObject*)src, i);<br>
+        ArrayObject::setElement((ArrayObject*)res, tmp, i);<br>
+      }<br>
+    }<br>
+  } else {<br>
+    assert(cl->isClass() && "Not a class!");<br>
+    res = cl->asClass()->doNew(vm);<br>
+    while (cl != NULL) {<br>
+      for (uint32 i = 0; i < cl->asClass()->nbVirtualFields; ++i) {<br>
+        JavaField& field = cl->asClass()->virtualFields[i];<br>
+        if (field.isReference()) {<br>
+          tmp = field.getInstanceObjectField(src);<br>
+          JavaObject** ptr = field.getInstanceObjectFieldPtr(res);<br>
+          mvm::Collector::objectReferenceWriteBarrier((gc*)res,<br>
(gc**)ptr, (gc*)tmp);<br>
+        } else if (field.isLong()) {<br>
+          field.setInstanceLongField(res, field.getInstanceLongField(src));<br>
+        } else if (field.isDouble()) {<br>
+          field.setInstanceDoubleField(res, field.getInstanceDoubleField(src));<br>
+        } else if (field.isInt()) {<br>
+          field.setInstanceInt32Field(res, field.getInstanceInt32Field(src));<br>
+        } else if (field.isFloat()) {<br>
+          field.setInstanceFloatField(res, field.getInstanceFloatField(src));<br>
+        } else if (field.isShort() || field.isChar()) {<br>
+          field.setInstanceInt16Field(res, field.getInstanceInt16Field(src));<br>
+        } else if (field.isByte() || field.isBoolean()) {<br>
+          field.setInstanceInt8Field(res, field.getInstanceInt8Field(src));<br>
+        } else {<br>
+          UNREACHABLE();<br>
+        }<br>
+      }<br>
+      cl = cl->super;<br>
+    }<br>
+  }<br>
+<br>
+  return res;<br>
+}<br>
+<br>
 void JavaObject::overflowThinLock(JavaObject* self) {<br>
   llvm_gcroot(self, 0);<br>
   mvm::ThinLock::overflowThinLock(self,<br>
JavaThread::get()->getJVM()->lockSystem);<br>
diff --git a/lib/J3/VMCore/JavaObject.h b/lib/J3/VMCore/JavaObject.h<br>
index 83995e3..7c385af 100644<br>
--- a/lib/J3/VMCore/JavaObject.h<br>
+++ b/lib/J3/VMCore/JavaObject.h<br>
@@ -266,6 +266,10 @@ public:<br>
   /// the monitor.<br>
   ///<br>
   static void notifyAll(JavaObject* self);<br>
+<br>
+  /// clone - Java clone. Creates a copy of this object.<br>
+  ///<br>
+  static JavaObject* clone(JavaObject* other);<br>
<br>
   /// overflowThinLock - Notify that the thin lock has overflowed.<br>
   ///<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.5.1<br>
_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</font></span></blockquote></div><br>