[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