[vmkit-commits] [vmkit] r142819 - /vmkit/trunk/lib/J3/VMCore/Jni.cpp

Will Dietz wdietz2 at illinois.edu
Mon Oct 24 11:06:09 PDT 2011


Author: wdietz2
Date: Mon Oct 24 13:06:09 2011
New Revision: 142819

URL: http://llvm.org/viewvc/llvm-project?rev=142819&view=rev
Log:
Jni: Impl NewObjectV, IsInstanceOf, and NewString.

Modified:
    vmkit/trunk/lib/J3/VMCore/Jni.cpp

Modified: vmkit/trunk/lib/J3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jni.cpp?rev=142819&r1=142818&r2=142819&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jni.cpp Mon Oct 24 13:06:09 2011
@@ -322,11 +322,31 @@
 }
 
 
-jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID,
+jobject NewObjectV(JNIEnv* env, jclass _clazz, jmethodID methodID,
                    va_list args) {
-  NYI();
-  abort();
-  return 0;
+  BEGIN_JNI_EXCEPTION
+
+  // Local object references
+  JavaObject* clazz = *(JavaObject**)_clazz;
+  JavaObject* res = 0;
+  llvm_gcroot(clazz, 0);
+  llvm_gcroot(res, 0);
+
+  JavaThread* th = JavaThread::get();
+  Jnjvm* vm = th->getJVM();
+  JavaMethod* meth = (JavaMethod*)methodID;
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
+
+  // Store local reference
+  res = cl->asClass()->doNew(vm);
+
+  meth->invokeIntSpecialAP(vm, cl->asClass(), res, args);
+
+  jobject ret = (jobject)th->pushJNIRef(res);
+  RETURN_FROM_JNI(ret);
+
+  END_JNI_EXCEPTION
+  RETURN_FROM_JNI(0);
 }
 
 jobject NewObjectA(JNIEnv* env, jclass _clazz, jmethodID methodID,
@@ -378,10 +398,26 @@
 }
 
 
-jboolean IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz) {
-  NYI();
-  abort();
-  return 0;
+jboolean IsInstanceOf(JNIEnv *env, jobject _obj, jclass clazz) {
+  bool res = false;
+  JavaObject * obj = 0;
+  JavaObject * Cl = 0;
+  llvm_gcroot(Cl, 0);
+  llvm_gcroot(obj, 0);
+
+  BEGIN_JNI_EXCEPTION
+
+  obj = *(JavaObject**)_obj;
+  Cl = *(JavaObject**)clazz;
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
+  res = JavaObject::instanceOf(obj, cl);
+
+  RETURN_FROM_JNI(res);
+
+  END_JNI_EXCEPTION
+
+  return JNI_FALSE;
 }
 
 
@@ -2724,9 +2760,29 @@
 
 
 jstring NewString(JNIEnv *env, const jchar *buf, jsize len) {
-  NYI();
-  abort();
-  return 0;
+  BEGIN_JNI_EXCEPTION
+
+  JavaString* obj = NULL;
+  ArrayUInt16* tmp = NULL;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(tmp, 0);
+
+  JavaThread* th = JavaThread::get();
+  Jnjvm* vm = th->getJVM();
+
+  tmp = (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(len, vm);
+
+  for (sint32 i = 0; i < len; i++) {
+    ArrayUInt16::setElement(tmp, buf[i], i);
+  }
+
+  obj = vm->constructString(tmp);
+  assert(obj->count == len);
+  jstring ret = (jstring)th->pushJNIRef(obj);
+  RETURN_FROM_JNI(ret);
+
+  END_JNI_EXCEPTION
+  RETURN_FROM_JNI(0);
 }
 
 





More information about the vmkit-commits mailing list