[vmkit-commits] [vmkit] r144093 - in /vmkit/trunk/lib/J3: ClassLib/GNUClasspath/ClasspathVMObject.inc ClassLib/OpenJDK/OpenJDK.inc VMCore/JavaObject.cpp VMCore/JavaObject.h

Will Dietz wdietz2 at illinois.edu
Tue Nov 8 10:02:58 PST 2011


Author: wdietz2
Date: Tue Nov  8 12:02:58 2011
New Revision: 144093

URL: http://llvm.org/viewvc/llvm-project?rev=144093&view=rev
Log:
Refactor JavaObject-related ClassLib code.

Modified:
    vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc
    vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
    vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
    vmkit/trunk/lib/J3/VMCore/JavaObject.h

Modified: vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc?rev=144093&r1=144092&r2=144093&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc (original)
+++ vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc Tue Nov  8 12:02:58 2011
@@ -10,10 +10,6 @@
 #include "types.h"
 
 #include "Classpath.h"
-#include "JavaArray.h"
-#include "JavaClass.h"
-#include "JavaObject.h"
-#include "JavaThread.h"
 #include "Jnjvm.h"
 
 using namespace j3;
@@ -28,59 +24,12 @@
 JavaObject* src) {
   
   JavaObject* res = NULL;
-  JavaObject* tmp = NULL;
   llvm_gcroot(res, 0);
   llvm_gcroot(src, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  UserCommonClass* cl = JavaObject::getClass(src);
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  if (cl->isArray()) {
-    UserClassArray* array = cl->asArrayClass();
-    int length = JavaArray::getSize(src);
-    res = array->doNew(length, vm);
-    UserCommonClass* base = array->baseClass();
-    if (base->isPrimitive()) {
-      int size = length << base->asPrimitiveClass()->logSize;
-      memcpy((void*)((uintptr_t)res + sizeof(JavaObject) + sizeof(size_t)),
-             (void*)((uintptr_t)src + sizeof(JavaObject) + sizeof(size_t)),
-             size);
-    } else {
-      for (int i = 0; i < length; i++) {
-        tmp = ArrayObject::getElement((ArrayObject*)src, i);
-        ArrayObject::setElement((ArrayObject*)res, tmp, i);
-      }
-    }
-  } else {
-    assert(cl->isClass() && "Not a class!");
-    res = cl->asClass()->doNew(vm);
-    while (cl != NULL) {
-      for (uint32 i = 0; i < cl->asClass()->nbVirtualFields; ++i) {
-        JavaField& field = cl->asClass()->virtualFields[i];
-        if (field.isReference()) {
-          tmp = field.getInstanceObjectField(src);
-          JavaObject** ptr = field.getInstanceObjectFieldPtr(res);
-          mvm::Collector::objectReferenceWriteBarrier((gc*)res, (gc**)ptr, (gc*)tmp);
-        } else if (field.isLong()) {
-          field.setInstanceLongField(res, field.getInstanceLongField(src));
-        } else if (field.isDouble()) {
-          field.setInstanceDoubleField(res, field.getInstanceDoubleField(src));
-        } else if (field.isInt()) {
-          field.setInstanceInt32Field(res, field.getInstanceInt32Field(src));
-        } else if (field.isFloat()) {
-          field.setInstanceFloatField(res, field.getInstanceFloatField(src));
-        } else if (field.isShort() || field.isChar()) {
-          field.setInstanceInt16Field(res, field.getInstanceInt16Field(src));
-        } else if (field.isByte() || field.isBoolean()) {
-          field.setInstanceInt8Field(res, field.getInstanceInt8Field(src));
-        } else {
-          UNREACHABLE();
-        }
-      }
-      cl = cl->super;
-    }
-  }
+  res = JavaObject::clone(src);
 
   END_NATIVE_EXCEPTION
 
@@ -136,17 +85,7 @@
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  uint32 sec = (uint32) (ms / 1000);
-  uint32 usec = (ns / 1000) + 1000 * (ms % 1000);
-  if (ns && !usec) usec = 1;
-  if (sec || usec) {
-    struct timeval t;
-    t.tv_sec = sec;
-    t.tv_usec = usec;
-    JavaObject::timedWait(obj, t);
-  } else {
-    JavaObject::wait(obj);
-  }
+  JavaObject::wait(obj, ms, ns);
 
   END_NATIVE_EXCEPTION
 }

Modified: vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc?rev=144093&r1=144092&r2=144093&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc Tue Nov  8 12:02:58 2011
@@ -117,51 +117,47 @@
 
 JNIEXPORT void JNICALL
 JVM_MonitorWait(JNIEnv *env, jobject obj, jlong ms) {
-  JavaObject * o = 0;
-  llvm_gcroot(o, 0);
-
   BEGIN_JNI_EXCEPTION
-  Jnjvm* vm = JavaThread::get()->getJVM();
-
-  o = *(JavaObject**)obj;
 
-  if (ms < 0) {
-    vm->illegalArgumentException("Negative wait time specified");
-  }
-  if (ms) {
-    struct timeval info;
-    uint64_t usec = ms * 1000LL;
-    info.tv_usec = usec % 1000000LL;
-    info.tv_sec = usec / 1000000LL;
-    JavaObject::timedWait(o, info);
-  } else {
-    JavaObject::wait(o);
-  }
+  JavaObject::wait(*(JavaObject**)obj, ms, 0);
   RETURN_VOID_FROM_JNI
+
   END_JNI_EXCEPTION
 }
 
 JNIEXPORT void JNICALL
 JVM_MonitorNotify(JNIEnv *env, jobject obj) {
   BEGIN_JNI_EXCEPTION
-  JavaObject * o = *(JavaObject**)obj;
-  JavaObject::notify(o);
+
+  JavaObject::notify(*(JavaObject**)obj);
+
   RETURN_VOID_FROM_JNI
+
   END_JNI_EXCEPTION
 }
 
 JNIEXPORT void JNICALL
 JVM_MonitorNotifyAll(JNIEnv *env, jobject obj) {
   BEGIN_JNI_EXCEPTION
-  JavaObject * o = *(JavaObject**)obj;
-  JavaObject::notifyAll(o);
+
+  JavaObject::notifyAll(*(JavaObject**)obj);
   RETURN_VOID_FROM_JNI
+
   END_JNI_EXCEPTION
 }
 
 JNIEXPORT jobject JNICALL
 JVM_Clone(JNIEnv *env, jobject obj) {
-  NYI();
+  JavaObject * clone = 0;
+  llvm_gcroot(clone, 0);
+  BEGIN_JNI_EXCEPTION
+
+  clone = JavaObject::clone(*(JavaObject**)obj);
+  RETURN_FROM_JNI((jobject)th->pushJNIRef(clone));
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }
 
 /*

Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.cpp?rev=144093&r1=144092&r2=144093&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.cpp Tue Nov  8 12:02:58 2011
@@ -9,6 +9,7 @@
 
 #include "mvm/Threads/Locks.h"
 
+#include "JavaArray.h"
 #include "JavaClass.h"
 #include "JavaObject.h"
 #include "JavaThread.h"
@@ -95,6 +96,28 @@
   waitIntern(self, &info, true);
 }
 
+void JavaObject::wait(JavaObject* self, int64_t ms, int32_t ns) {
+  llvm_gcroot(self, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+
+  if (ms < 0 || ns < 0) {
+    vm->illegalArgumentException("Negative wait time specified");
+  }
+
+  uint32 sec = (uint32) (ms / 1000);
+  uint32 usec = (ns / 1000) + 1000 * (ms % 1000);
+  if (ns && !usec) usec = 1;
+  if (sec || usec) {
+    struct timeval t;
+    t.tv_sec = sec;
+    t.tv_usec = usec;
+    JavaObject::timedWait(self, t);
+  } else {
+    JavaObject::wait(self);
+  }
+}
+
 void JavaObject::notify(JavaObject* self) {
   llvm_gcroot(self, 0);
   JavaThread* thread = JavaThread::get();
@@ -119,6 +142,71 @@
   thread->lockingThread.notifyAll(self, table);
 }
 
+JavaObject* JavaObject::clone(JavaObject* src) {
+  JavaObject* res = 0;
+  JavaObject* tmp = 0;
+
+  llvm_gcroot(src, 0);
+  llvm_gcroot(res, 0);
+  llvm_gcroot(tmp, 0);
+
+  UserCommonClass* cl = JavaObject::getClass(src);
+  Jnjvm* vm = JavaThread::get()->getJVM();
+
+  // If this doesn't inherit the Cloneable interface, throw exception
+  // TODO: Add support in both class libraries for the upcalls fields used here
+  //if (!JavaObject::instanceOf(src, vm->upcalls->cloneableClass))
+  //  vm->cloneNotSupportedException();
+
+  if (cl->isArray()) {
+    UserClassArray* array = cl->asArrayClass();
+    int length = JavaArray::getSize(src);
+    res = array->doNew(length, vm);
+    UserCommonClass* base = array->baseClass();
+    if (base->isPrimitive()) {
+      int size = length << base->asPrimitiveClass()->logSize;
+      memcpy((void*)((uintptr_t)res + sizeof(JavaObject) + sizeof(size_t)),
+             (void*)((uintptr_t)src + sizeof(JavaObject) + sizeof(size_t)),
+             size);
+    } else {
+      for (int i = 0; i < length; i++) {
+        tmp = ArrayObject::getElement((ArrayObject*)src, i);
+        ArrayObject::setElement((ArrayObject*)res, tmp, i);
+      }
+    }
+  } else {
+    assert(cl->isClass() && "Not a class!");
+    res = cl->asClass()->doNew(vm);
+    while (cl != NULL) {
+      for (uint32 i = 0; i < cl->asClass()->nbVirtualFields; ++i) {
+        JavaField& field = cl->asClass()->virtualFields[i];
+        if (field.isReference()) {
+          tmp = field.getInstanceObjectField(src);
+          JavaObject** ptr = field.getInstanceObjectFieldPtr(res);
+          mvm::Collector::objectReferenceWriteBarrier((gc*)res, (gc**)ptr, (gc*)tmp);
+        } else if (field.isLong()) {
+          field.setInstanceLongField(res, field.getInstanceLongField(src));
+        } else if (field.isDouble()) {
+          field.setInstanceDoubleField(res, field.getInstanceDoubleField(src));
+        } else if (field.isInt()) {
+          field.setInstanceInt32Field(res, field.getInstanceInt32Field(src));
+        } else if (field.isFloat()) {
+          field.setInstanceFloatField(res, field.getInstanceFloatField(src));
+        } else if (field.isShort() || field.isChar()) {
+          field.setInstanceInt16Field(res, field.getInstanceInt16Field(src));
+        } else if (field.isByte() || field.isBoolean()) {
+          field.setInstanceInt8Field(res, field.getInstanceInt8Field(src));
+        } else {
+          UNREACHABLE();
+        }
+      }
+      cl = cl->super;
+    }
+  }
+
+  return res;
+}
+
 void JavaObject::overflowThinLock(JavaObject* self) {
   llvm_gcroot(self, 0);
   mvm::ThinLock::overflowThinLock(self, JavaThread::get()->getJVM()->lockSystem);

Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.h?rev=144093&r1=144092&r2=144093&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.h Tue Nov  8 12:02:58 2011
@@ -257,6 +257,10 @@
   ///
   static void timedWait(JavaObject* self, struct timeval &info);
   
+  /// wait - Wait for specified ms and ns.  Wrapper for either wait() or
+  /// timedWait, depending on duration specified.
+  static void wait(JavaObject* self, int64_t ms, int32_t ns);
+
   /// notify - Java notify. Notifies a thread from the availability of the
   /// monitor.
   ///
@@ -266,6 +270,10 @@
   /// the monitor.
   ///
   static void notifyAll(JavaObject* self);
+
+  /// clone - Java clone. Creates a copy of this object.
+  ///
+  static JavaObject* clone(JavaObject* other);
  
   /// overflowThinLock - Notify that the thin lock has overflowed.
   ///





More information about the vmkit-commits mailing list