From: Andy McFadden Date: Tue, 23 Jun 2009 23:27:45 +0000 (-0700) Subject: Merge 137552-p9 to donut. X-Git-Tag: android-x86-1.6~10^2~8 X-Git-Url: http://git.osdn.net/view?p=android-x86%2Fdalvik.git;a=commitdiff_plain;h=cda8f8abd1d02f5ab58add1ebb23f20fdab6341c Merge 137552-p9 to donut. Since we're apparently using these calls now, we probably ought to pull the bug fix over. It's been in master for more than 3 months so it should be safe. It'll also make future merges easier. Prequel to fix for internal bug #1926596. --- diff --git a/vm/Jni.c b/vm/Jni.c index 09e36a565..4bca8d48e 100644 --- a/vm/Jni.c +++ b/vm/Jni.c @@ -2677,45 +2677,55 @@ static jobjectRefType GetObjectRefType(JNIEnv* env, jobject obj) static jobject NewDirectByteBuffer(JNIEnv * env, void* address, jlong capacity) { jmethodID newBufferMethod; - jclass directBufferClass; - jclass platformaddressClass; - jobject platformaddress; + jclass directBufferClass = NULL; + jclass platformaddressClass = NULL; + jobject platformaddress = NULL; jmethodID onMethod; + jobject result = NULL; directBufferClass = (*env)->FindClass(env, "java/nio/ReadWriteDirectByteBuffer"); if(!directBufferClass) { - return NULL; + goto bail; } newBufferMethod = (*env)->GetMethodID(env, directBufferClass, "", "(Lorg/apache/harmony/luni/platform/PlatformAddress;II)V"); if(!newBufferMethod) { - return NULL; + goto bail; } platformaddressClass = (*env)->FindClass(env, "org/apache/harmony/luni/platform/PlatformAddressFactory"); if(!platformaddressClass) { - return NULL; + goto bail; } onMethod = (*env)->GetStaticMethodID(env, platformaddressClass, "on", "(I)Lorg/apache/harmony/luni/platform/PlatformAddress;"); if(!onMethod) { - return NULL; + goto bail; } - platformaddress = (*env)->CallStaticObjectMethod(env, platformaddressClass, + platformaddress = (*env)->CallStaticObjectMethod(env, platformaddressClass, onMethod, (jint)address); - return (*env)->NewObject(env, directBufferClass, newBufferMethod, + result = (*env)->NewObject(env, directBufferClass, newBufferMethod, platformaddress, (jint)capacity, (jint)0); + +bail: + if (directBufferClass != NULL) + (*env)->DeleteLocalRef(env, directBufferClass); + if (platformaddressClass != NULL) + (*env)->DeleteLocalRef(env, platformaddressClass); + if (platformaddress != NULL) + (*env)->DeleteLocalRef(env, platformaddress); + return result; } /* @@ -2730,43 +2740,53 @@ static jobject NewDirectByteBuffer(JNIEnv * env, void* address, jlong capacity) static void* GetDirectBufferAddress(JNIEnv * env, jobject buf) { jmethodID tempMethod; - jclass tempClass; - jobject platformAddr; - jclass platformAddrClass; + jclass tempClass = NULL; + jobject platformAddr = NULL; + jclass platformAddrClass = NULL; jmethodID toLongMethod; + void* result = NULL; tempClass = (*env)->FindClass(env, "org/apache/harmony/nio/internal/DirectBuffer"); if(!tempClass) { - return 0; + goto bail; } if(JNI_FALSE == (*env)->IsInstanceOf(env, buf, tempClass)) { - return 0; + goto bail; } tempMethod = (*env)->GetMethodID(env, tempClass, "getEffectiveAddress", "()Lorg/apache/harmony/luni/platform/PlatformAddress;"); if(!tempMethod){ - return 0; - } + goto bail; + } platformAddr = (*env)->CallObjectMethod(env, buf, tempMethod); platformAddrClass = (*env)->FindClass (env, "org/apache/harmony/luni/platform/PlatformAddress"); if(!platformAddrClass) { - return 0; + goto bail; } toLongMethod = (*env)->GetMethodID(env, platformAddrClass, "toLong", "()J"); if (!toLongMethod) { - return 0; + goto bail; } - return (void*)(u4)(*env)->CallLongMethod(env, platformAddr, toLongMethod); + result = (void*)(u4)(*env)->CallLongMethod(env, platformAddr, toLongMethod); + +bail: + if (tempClass != NULL) + (*env)->DeleteLocalRef(env, tempClass); + if (platformAddr != NULL) + (*env)->DeleteLocalRef(env, platformAddr); + if (platformAddrClass != NULL) + (*env)->DeleteLocalRef(env, platformAddrClass); + return result; } /* @@ -2781,34 +2801,42 @@ static void* GetDirectBufferAddress(JNIEnv * env, jobject buf) static jlong GetDirectBufferCapacity(JNIEnv * env, jobject buf) { jfieldID fieldCapacity; - jclass directBufferClass; - jclass bufferClass; + jclass directBufferClass = NULL; + jclass bufferClass = NULL; + jlong result = -1; directBufferClass = (*env)->FindClass(env, "org/apache/harmony/nio/internal/DirectBuffer"); if (!directBufferClass) { - return -1; + goto bail; } if (JNI_FALSE == (*env)->IsInstanceOf(env, buf, directBufferClass)) { - return -1; + goto bail; } bufferClass = (*env)->FindClass(env, "java/nio/Buffer"); if (!bufferClass) { - return -1; + goto bail; } fieldCapacity = (*env)->GetFieldID(env, bufferClass, "capacity", "I"); if (!fieldCapacity) { - return -1; + goto bail; } - return (*env)->GetIntField(env, buf, fieldCapacity); + result = (*env)->GetIntField(env, buf, fieldCapacity); + +bail: + if (directBufferClass != NULL) + (*env)->DeleteLocalRef(env, directBufferClass); + if (bufferClass != NULL) + (*env)->DeleteLocalRef(env, bufferClass); + return result; }