[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