[vmkit-commits] [PATCH] Refactor JavaObject-related ClassLib code.

Nicolas Geoffray nicolas.geoffray at gmail.com
Tue Nov 8 09:34:43 PST 2011


Few comments. Please apply when you've addressed them.

On Mon, Nov 7, 2011 at 3:57 AM, Will Dietz <wdietz2 at illinois.edu> wrote:

> Inlined below.
>
> ~Will
>
> >From b27df42e89b104ec6d98f0d35fee5ddf1c8c64aa Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Sat, 5 Nov 2011 20:24:31 -0500
> Subject: [PATCH 1/8] Refactor JavaObject-related ClassLib code.
>
> ---
>  lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc |   68
> +------------------
>  lib/J3/ClassLib/Object.inc                         |   31 +++++++++
>  lib/J3/ClassLib/OpenJDK/OpenJDK.inc                |   46 ++++++-------
>  lib/J3/VMCore/JavaObject.cpp                       |   66
> +++++++++++++++++++
>  lib/J3/VMCore/JavaObject.h                         |    4 +
>  5 files changed, 127 insertions(+), 88 deletions(-)
>  create mode 100644 lib/J3/ClassLib/Object.inc
>
> diff --git a/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc
> b/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc
> index ab3f0c5..1c981d4 100644
> --- a/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc
> +++ b/lib/J3/ClassLib/GNUClasspath/ClasspathVMObject.inc
> @@ -10,11 +10,8 @@
>  #include "types.h"
>
>  #include "Classpath.h"
> -#include "JavaArray.h"
> -#include "JavaClass.h"
> -#include "JavaObject.h"
> -#include "JavaThread.h"
>  #include "Jnjvm.h"
> +#include "Object.inc"
>
>  using namespace j3;
>
> @@ -28,59 +25,12 @@ jclass clazz,
>  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
>
> @@ -130,23 +80,13 @@ JNIEXPORT void JNICALL Java_java_lang_VMObject_wait(
>  JNIEnv *env,
>  jclass clazz,
>  #endif
> -JavaObject* obj, jlong ms, jint ns) {
> +JavaObject* obj, long long ms, int ns) {
>

Please use int64_t instead of long long.


>
>   llvm_gcroot(obj, 0);
>
>   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);
> -  }
> +  Object_wait(obj, ms, ns);
>
>   END_NATIVE_EXCEPTION
>  }
> diff --git a/lib/J3/ClassLib/Object.inc b/lib/J3/ClassLib/Object.inc
> new file mode 100644
> index 0000000..aa6f92b
> --- /dev/null
> +++ b/lib/J3/ClassLib/Object.inc
> @@ -0,0 +1,31 @@
> +//===---------- Object.inc - Shared j.l.Object code
> -----------------------===//
> +//                            The VMKit project
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "JavaObject.h"
> +
> +void Object_wait(JavaObject* obj, jlong ms, jint ns) {
>

Could that just go in JavaObject.h/JavaObject.cpp?


> +  llvm_gcroot(obj, 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(obj, t);
> +  } else {
> +    JavaObject::wait(obj);
> +  }
> +}
> diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> index 9d92f91..947b7d3 100644
> --- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> +++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> @@ -8,10 +8,12 @@
>
>  #include "jvm.h"
>
> -#include "ArrayCopy.inc"
>  #include "JavaConstantPool.h"
>  #include "Reader.h"
> +
> +#include "ArrayCopy.inc"
>  #include "SetProperties.inc"
> +#include "Object.inc"
>
>  #include <errno.h>
>  #include <fcntl.h>
> @@ -115,51 +117,47 @@ JVM_IHashCode(JNIEnv *env, jobject _obj) {
>
>  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);
> -  }
> +  Object_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;
>  }
>
>  /*
> diff --git a/lib/J3/VMCore/JavaObject.cpp b/lib/J3/VMCore/JavaObject.cpp
> index 55305af..d5e989f 100644
> --- a/lib/J3/VMCore/JavaObject.cpp
> +++ b/lib/J3/VMCore/JavaObject.cpp
> @@ -9,6 +9,7 @@
>
>  #include "mvm/Threads/Locks.h"
>
> +#include "JavaArray.h"
>  #include "JavaClass.h"
>  #include "JavaObject.h"
>  #include "JavaThread.h"
> @@ -118,6 +119,71 @@ void JavaObject::notifyAll(JavaObject* self) {
>   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 VM's


VM's -> 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);
> diff --git a/lib/J3/VMCore/JavaObject.h b/lib/J3/VMCore/JavaObject.h
> index 83995e3..7c385af 100644
> --- a/lib/J3/VMCore/JavaObject.h
> +++ b/lib/J3/VMCore/JavaObject.h
> @@ -266,6 +266,10 @@ public:
>   /// 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.
>   ///
> --
> 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/20111108/f930dc85/attachment.html>


More information about the vmkit-commits mailing list