[vmkit-commits] [vmkit] r145043 - in /vmkit/trunk/lib/j3: ClassLib/OpenJDK/JavaUpcalls.cpp VMCore/JniOpenJDK.inc
Will Dietz
wdietz2 at illinois.edu
Mon Nov 21 10:26:23 PST 2011
Author: wdietz2
Date: Mon Nov 21 12:26:22 2011
New Revision: 145043
URL: http://llvm.org/viewvc/llvm-project?rev=145043&view=rev
Log:
Impl DirectByteBuffers for OpenJDK
Modified:
vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp?rev=145043&r1=145042&r2=145043&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp Mon Nov 21 12:26:22 2011
@@ -471,7 +471,6 @@
newDirectByteBuffer =
UPCALL_CLASS(loader, "java/nio/DirectByteBuffer");
- //TODO: Revisit this one, verify signature.
InitDirectByteBuffer =
UPCALL_METHOD(loader, "java/nio/DirectByteBuffer", "<init>", "(JI)V",
ACC_VIRTUAL);
@@ -549,7 +548,7 @@
UPCALL_ARRAY_CLASS(loader, "java/lang/Class", 1);
bufferAddress =
- UPCALL_FIELD(loader, "java/nio/Buffer", "address", "Lgnu/classpath/Pointer;",
+ UPCALL_FIELD(loader, "java/nio/Buffer", "address", "J",
ACC_VIRTUAL);
vmdataClassLoader =
Modified: vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc?rev=145043&r1=145042&r2=145043&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/VMCore/JniOpenJDK.inc Mon Nov 21 12:26:22 2011
@@ -1,14 +1,39 @@
// OpenJDK-specific JNI implementation
-// We don't support DirectBuffer calls yet. TODO: Implement these!
jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity) {
- NYI();
- abort();
- return NULL;
+ BEGIN_JNI_EXCEPTION
+
+ JavaObject* res = 0;
+ llvm_gcroot(res, 0);
+
+ JavaThread* th = JavaThread::get();
+ Jnjvm* myvm = th->getJVM();
+ UserClass* BB = myvm->upcalls->newDirectByteBuffer;
+
+ res = BB->doNew(myvm);
+
+ myvm->upcalls->InitDirectByteBuffer->invokeIntSpecial(myvm, BB, res,
+ (uint64_t)(uintptr_t)address, (int)capacity);
+
+ jobject ret = (jobject)th->pushJNIRef(res);
+ RETURN_FROM_JNI(ret);
+ END_JNI_EXCEPTION
+
+ RETURN_FROM_JNI(0);
}
void *GetDirectBufferAddress(JNIEnv *env, jobject _buf) {
- NYI();
- abort();
- return NULL;
+ BEGIN_JNI_EXCEPTION
+
+ // Local object references.
+ JavaObject* buf = *(JavaObject**)_buf;
+ llvm_gcroot(buf, 0);
+ jlong address;
+
+ Jnjvm* vm = myVM(env);
+ address = vm->upcalls->bufferAddress->getInstanceLongField(buf);
+ RETURN_FROM_JNI((void*)address);
+
+ END_JNI_EXCEPTION
+ RETURN_FROM_JNI(0);
}
More information about the vmkit-commits
mailing list