[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