diff options
| author | Jean-Baptiste Queru <jbq@google.com> | 2009-11-12 18:45:15 -0800 |
|---|---|---|
| committer | Jean-Baptiste Queru <jbq@google.com> | 2009-11-12 18:45:15 -0800 |
| commit | 72e93344b4d1ffc71e9c832ec23de0657e5b04a5 (patch) | |
| tree | 1a08d1e43d54200ea737234d865c4668c5d3535b /vm/JniInternal.h | |
| parent | dfd0afbcb08b871e224a28ecb4ed427a7693545c (diff) | |
| download | android_dalvik-72e93344b4d1ffc71e9c832ec23de0657e5b04a5.tar.gz android_dalvik-72e93344b4d1ffc71e9c832ec23de0657e5b04a5.tar.bz2 android_dalvik-72e93344b4d1ffc71e9c832ec23de0657e5b04a5.zip | |
eclair snapshot
Diffstat (limited to 'vm/JniInternal.h')
| -rw-r--r-- | vm/JniInternal.h | 69 |
1 files changed, 54 insertions, 15 deletions
diff --git a/vm/JniInternal.h b/vm/JniInternal.h index 79d16ecab..37920caf6 100644 --- a/vm/JniInternal.h +++ b/vm/JniInternal.h @@ -74,13 +74,18 @@ typedef struct JavaVMExt { * Native function return type; used by dvmPlatformInvoke(). * * This is part of Method.jniArgInfo, and must fit in 3 bits. + * Note: Assembly code in arch/<arch>/Call<arch>.S relies on + * the enum values defined here. */ typedef enum DalvikJniReturnType { DALVIK_JNI_RETURN_VOID = 0, /* must be zero */ - DALVIK_JNI_RETURN_FLOAT, - DALVIK_JNI_RETURN_DOUBLE, - DALVIK_JNI_RETURN_S8, - DALVIK_JNI_RETURN_S4 + DALVIK_JNI_RETURN_FLOAT = 1, + DALVIK_JNI_RETURN_DOUBLE = 2, + DALVIK_JNI_RETURN_S8 = 3, + DALVIK_JNI_RETURN_S4 = 4, + DALVIK_JNI_RETURN_S2 = 5, + DALVIK_JNI_RETURN_U2 = 6, + DALVIK_JNI_RETURN_S1 = 7 } DalvikJniReturnType; #define DALVIK_JNI_NO_ARG_INFO 0x80000000 @@ -93,15 +98,17 @@ typedef enum DalvikJniReturnType { /* * Pop the JNI local stack when we return from a native method. "saveArea" * points to the StackSaveArea for the method we're leaving. + * + * (This may be implemented directly in assembly in mterp, so changes here + * may only affect the portable interpreter.) */ INLINE void dvmPopJniLocals(Thread* self, StackSaveArea* saveArea) { - if (saveArea->xtra.localRefTop != self->jniLocalRefTable.nextEntry) { - LOGVV("LREF: popped %d entries (%d remain)\n", - (int)(self->jniLocalRefTable.nextEntry-saveArea->xtra.localRefTop), - (int)(saveArea->xtra.localRefTop - self->jniLocalRefTable.table)); - } - self->jniLocalRefTable.nextEntry = saveArea->xtra.localRefTop; +#ifdef USE_INDIRECT_REF + self->jniLocalRefTable.segmentState.all = saveArea->xtra.localRefCookie; +#else + self->jniLocalRefTable.nextEntry = saveArea->xtra.localRefCookie; +#endif } /* @@ -114,14 +121,34 @@ INLINE void dvmSetJniEnvThreadId(JNIEnv* pEnv, Thread* self) } /* - * JNI call bridges. Not usually called directly. + * JNI call bridges. Not called directly. + * + * The "Check" versions are used when CheckJNI is enabled. */ -void dvmCallJNIMethod(const u4* args, JValue* pResult, const Method* method, - Thread* self); -void dvmCallSynchronizedJNIMethod(const u4* args, JValue* pResult, +void dvmCallJNIMethod_general(const u4* args, JValue* pResult, + const Method* method, Thread* self); +void dvmCallJNIMethod_synchronized(const u4* args, JValue* pResult, + const Method* method, Thread* self); +void dvmCallJNIMethod_virtualNoRef(const u4* args, JValue* pResult, + const Method* method, Thread* self); +void dvmCallJNIMethod_staticNoRef(const u4* args, JValue* pResult, + const Method* method, Thread* self); +void dvmCheckCallJNIMethod_general(const u4* args, JValue* pResult, + const Method* method, Thread* self); +void dvmCheckCallJNIMethod_synchronized(const u4* args, JValue* pResult, + const Method* method, Thread* self); +void dvmCheckCallJNIMethod_virtualNoRef(const u4* args, JValue* pResult, + const Method* method, Thread* self); +void dvmCheckCallJNIMethod_staticNoRef(const u4* args, JValue* pResult, const Method* method, Thread* self); /* + * Configure "method" to use the JNI bridge to call "func". + */ +void dvmUseJNIBridge(Method* method, void* func); + + +/* * Enable the "checked" versions. */ void dvmUseCheckedJniEnv(JNIEnvExt* pEnv); @@ -129,10 +156,22 @@ void dvmUseCheckedJniVm(JavaVMExt* pVm); void dvmLateEnableCheckedJni(void); /* + * Decode a local, global, or weak-global reference. + */ +#ifdef USE_INDIRECT_REF +Object* dvmDecodeIndirectRef(JNIEnv* env, jobject jobj); +#else +/* use an inline to ensure this is a no-op */ +INLINE Object* dvmDecodeIndirectRef(JNIEnv* env, jobject jobj) { + return (Object*) jobj; +} +#endif + +/* * Verify that a reference passed in from native code is valid. Returns * an indication of local/global/invalid. */ -jobjectRefType dvmGetJNIRefType(Object* obj); +jobjectRefType dvmGetJNIRefType(JNIEnv* env, jobject jobj); /* * Get the last method called on the interp stack. This is the method |
