[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