[vmkit-commits] [vmkit] r72382 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaUpcalls.cpp JavaUpcalls.h Jni.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Mon May 25 05:13:12 PDT 2009
Author: geoffray
Date: Mon May 25 07:12:52 2009
New Revision: 72382
URL: http://llvm.org/viewvc/llvm-project?rev=72382&view=rev
Log:
Implement ExceptionCheck and NewDirectByteBuffer JNI functions.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h
vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=72382&r1=72381&r2=72382&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Mon May 25 07:12:52 2009
@@ -84,7 +84,12 @@
Class* Classpath::newVMThrowable;
JavaField* Classpath::bufferAddress;
JavaField* Classpath::dataPointer32;
+JavaField* Classpath::dataPointer64;
+Class* Classpath::newPointer32;
+Class* Classpath::newPointer64;
+Class* Classpath::newDirectByteBuffer;
JavaField* Classpath::vmdataClassLoader;
+JavaMethod* Classpath::InitDirectByteBuffer;
Class* Classpath::newClassLoader;
@@ -385,7 +390,21 @@
newException =
UPCALL_CLASS(loader, "java/lang/Exception");
+
+ newPointer32 =
+ UPCALL_CLASS(loader, "gnu/classpath/Pointer32");
+ newPointer64 =
+ UPCALL_CLASS(loader, "gnu/classpath/Pointer64");
+
+ newDirectByteBuffer =
+ UPCALL_CLASS(loader, "java/nio/DirectByteBufferImpl$ReadWrite");
+
+ InitDirectByteBuffer =
+ UPCALL_METHOD(loader, "java/nio/DirectByteBufferImpl$ReadWrite", "<init>",
+ "(Ljava/lang/Object;Lgnu/classpath/Pointer;III)V",
+ ACC_VIRTUAL);
+
initClass =
UPCALL_METHOD(loader, "java/lang/Class", "<init>", "(Ljava/lang/Object;)V",
ACC_VIRTUAL);
@@ -469,6 +488,9 @@
dataPointer32 =
UPCALL_FIELD(loader, "gnu/classpath/Pointer32", "data", "I", ACC_VIRTUAL);
+
+ dataPointer64 =
+ UPCALL_FIELD(loader, "gnu/classpath/Pointer64", "data", "J", ACC_VIRTUAL);
vmdataClassLoader =
UPCALL_FIELD(loader, "java/lang/ClassLoader", "vmdata", "Ljava/lang/Object;",
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h?rev=72382&r1=72381&r2=72382&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h Mon May 25 07:12:52 2009
@@ -91,9 +91,14 @@
ISOLATE_STATIC JavaMethod* loadInClassLoader;
ISOLATE_STATIC JavaMethod* initVMThrowable;
ISOLATE_STATIC JavaField* vmDataVMThrowable;
- ISOLATE_STATIC UserClass* newVMThrowable;
+ ISOLATE_STATIC UserClass* newVMThrowable;
ISOLATE_STATIC JavaField* bufferAddress;
ISOLATE_STATIC JavaField* dataPointer32;
+ ISOLATE_STATIC JavaField* dataPointer64;
+ ISOLATE_STATIC UserClass* newPointer32;
+ ISOLATE_STATIC UserClass* newPointer64;
+ ISOLATE_STATIC UserClass* newDirectByteBuffer;
+ ISOLATE_STATIC JavaMethod* InitDirectByteBuffer;
ISOLATE_STATIC JavaField* vmdataClassLoader;
ISOLATE_STATIC JavaField* boolValue;
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp?rev=72382&r1=72381&r2=72382&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Mon May 25 07:12:52 2009
@@ -2525,13 +2525,39 @@
jboolean ExceptionCheck(JNIEnv *env) {
- assert(0 && "implement me");
- return 0;
+ if (JavaThread::get()->pendingException) return JNI_TRUE;
+ else return JNI_FALSE;
}
jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity) {
- assert(0 && "implement me");
+
+ BEGIN_JNI_EXCEPTION
+
+ JavaThread* th = JavaThread::get();
+ Jnjvm* myvm = th->getJVM();
+ UserClass* BB = myvm->upcalls->newDirectByteBuffer;
+
+ JavaObject* res = BB->doNew(myvm);
+
+#if (__WORDSIZE == 32)
+ UserClass* PP = myvm->upcalls->newPointer32;
+ JavaObject* p = PP->doNew(myvm);
+ myvm->upcalls->dataPointer32->setInt32Field(p, (uint32)address);
+#else
+ UserClass* PP = myvm->upcalls->newPointer64;
+ JavaObject* p = PP->doNew(myvm);
+ myvm->upcalls->dataPointer64->setLongField(p, (jlong)address);
+#endif
+
+ myvm->upcalls->InitDirectByteBuffer->invokeIntSpecial(myvm, BB, res, 0, p,
+ (uint32)capacity,
+ (uint32)capacity, 0);
+
+ return (jobject)res;
+
+ END_JNI_EXCEPTION
+
return 0;
}
@@ -2544,7 +2570,11 @@
JavaObject* buf = (JavaObject*)_buf;
JavaObject* address = vm->upcalls->bufferAddress->getObjectField(buf);
if (address != 0) {
+#if (__WORDSIZE == 32)
int res = vm->upcalls->dataPointer32->getInt32Field(address);
+#else
+ jlong res = vm->upcalls->dataPointer64->getLongField(address);
+#endif
return (void*)res;
} else {
return 0;
More information about the vmkit-commits
mailing list