*/
#ifdef USE_INDIRECT_REF
static inline IndirectRefTable* getLocalRefTable(JNIEnv* env)
-{
- return &((JNIEnvExt*)env)->self->jniLocalRefTable;
-}
#else
static inline ReferenceTable* getLocalRefTable(JNIEnv* env)
+#endif
{
//return &dvmThreadSelf()->jniLocalRefTable;
return &((JNIEnvExt*)env)->self->jniLocalRefTable;
}
-#endif
+#ifdef USE_INDIRECT_REF
/*
* Convert an indirect reference to an Object reference. The indirect
* reference may be local, global, or weak-global.
*/
Object* dvmDecodeIndirectRef(JNIEnv* env, jobject jobj)
{
-#ifdef USE_INDIRECT_REF
if (jobj == NULL)
return NULL;
}
return result;
+}
#else
- return (Object*) jobj;
+ /* use trivial inline in JniInternal.h for performance */
#endif
-}
/*
* Add a local reference for an object to the current stack frame. When
}
-#if 0
+#ifndef USE_INDIRECT_REF
/*
* Determine if "obj" appears in the argument list for the native method.
*
//Object** top;
Object** ptr;
-#if 0
/* check args */
if (findInArgList(self, jobj)) {
//LOGI("--- REF found %p on stack\n", jobj);
return JNILocalRefType;
}
-#endif
/* check locals */
if (dvmFindInReferenceTable(pRefTable, pRefTable->table, jobj) != NULL) {
static inline void convertReferenceResult(JNIEnv* env, JValue* pResult,
const Method* method, Thread* self)
{
+#ifdef USE_INDIRECT_REF
if (method->shorty[0] == 'L' && !dvmCheckException(self) &&
pResult->l != NULL)
{
pResult->l = dvmDecodeIndirectRef(env, pResult->l);
}
+#endif
}
/*
{
int oldStatus;
u4* modArgs = (u4*) args;
+ jclass staticMethodClass;
+ JNIEnv* env = self->jniEnv;
assert(method->insns != NULL);
//LOGI("JNI calling %p (%s.%s:%s):\n", method->insns,
// method->clazz->descriptor, method->name, method->shorty);
+#ifdef USE_INDIRECT_REF
/*
* Walk the argument list, creating local references for appropriate
* arguments.
*/
- JNIEnv* env = self->jniEnv;
- jclass staticMethodClass;
int idx = 0;
if (dvmIsStaticMethod(method)) {
/* add the class object we pass in */
idx++;
}
+#else
+ staticMethodClass = dvmIsStaticMethod(method) ?
+ (jclass) method->clazz : NULL;
+#endif
oldStatus = dvmChangeStatus(self, THREAD_NATIVE);
COMPUTE_STACK_SUM(self);
- dvmPlatformInvoke(self->jniEnv, staticMethodClass,
+ dvmPlatformInvoke(env, staticMethodClass,
method->jniArgInfo, method->insSize, modArgs, method->shorty,
(void*)method->insns, pResult);
CHECK_STACK_SUM(self);
u4* modArgs = (u4*) args;
int oldStatus;
+#ifdef USE_INDIRECT_REF
jobject thisObj = addLocalReference(self->jniEnv, (Object*) args[0]);
if (thisObj == NULL) {
assert(dvmCheckException(self));
return;
}
modArgs[0] = (u4) thisObj;
+#endif
oldStatus = dvmChangeStatus(self, THREAD_NATIVE);
jclass staticMethodClass;
int oldStatus;
+#ifdef USE_INDIRECT_REF
staticMethodClass = addLocalReference(self->jniEnv, (Object*)method->clazz);
if (staticMethodClass == NULL) {
assert(dvmCheckException(self));
return;
}
+#else
+ staticMethodClass = (jobject) method->clazz;
+#endif
oldStatus = dvmChangeStatus(self, THREAD_NATIVE);
static jclass GetSuperclass(JNIEnv* env, jclass jclazz)
{
JNI_ENTER();
- jclass jsuper;
+ jclass jsuper = NULL;
ClassObject* clazz = (ClassObject*) dvmDecodeIndirectRef(env, jclazz);
- if (clazz == NULL)
- jsuper = NULL;
- else
+ if (clazz != NULL)
jsuper = addLocalReference(env, (Object*)clazz->super);
JNI_EXIT();
return jsuper;