You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2010/05/21 17:49:25 UTC
svn commit: r947048 - in
/subversion/trunk/subversion/bindings/javahl/native: ChangelistCallback.cpp
Prompter.cpp
Author: hwright
Date: Fri May 21 15:49:24 2010
New Revision: 947048
URL: http://svn.apache.org/viewvc?rev=947048&view=rev
Log:
JavaHL: Use local reference frames to better manage local references.
[ in subversion/bindings/javahl/ ]
* native/ChangelistCallback.cpp
(doChangelist): Add a local frame.
* native/Prompter.cpp
(makeCPrompter, username, password, askYesNo, askQuestion, askTrust,
prompt): Same.
Modified:
subversion/trunk/subversion/bindings/javahl/native/ChangelistCallback.cpp
subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp
Modified: subversion/trunk/subversion/bindings/javahl/native/ChangelistCallback.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ChangelistCallback.cpp?rev=947048&r1=947047&r2=947048&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ChangelistCallback.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ChangelistCallback.cpp Fri May 21 15:49:24 2010
@@ -67,6 +67,11 @@ ChangelistCallback::doChangelist(const c
{
JNIEnv *env = JNIUtil::getEnv();
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
static jmethodID mid = 0; // the method id will not change during
// the time this library is loaded, so
// it can be cached.
@@ -74,27 +79,23 @@ ChangelistCallback::doChangelist(const c
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/ChangelistCallback");
if (JNIUtil::isJavaExceptionThrown())
- return;
+ POP_AND_RETURN();
mid = env->GetMethodID(clazz, "doChangelist",
"(Ljava/lang/String;Ljava/lang/String;)V");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return;
-
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN();
}
jstring jChangelist = JNIUtil::makeJString(changelist);
if (JNIUtil::isJavaExceptionThrown())
- return;
+ POP_AND_RETURN();
jstring jPath = JNIUtil::makeJString(path);
if (JNIUtil::isJavaExceptionThrown())
- return;
+ POP_AND_RETURN();
env->CallVoidMethod(m_callback, mid, jPath, jChangelist);
- if (JNIUtil::isJavaExceptionThrown())
- return;
- env->DeleteLocalRef(jChangelist);
+ env->PopLocalFrame(NULL);
}
Modified: subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp?rev=947048&r1=947047&r2=947048&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp Fri May 21 15:49:24 2010
@@ -73,28 +73,27 @@ Prompter *Prompter::makeCPrompter(jobjec
JNIEnv *env = JNIUtil::getEnv();
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
// Sanity check that the Java object implements PromptUserPassword.
jclass clazz = env->FindClass(JAVA_PACKAGE"/PromptUserPassword");
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
if (!env->IsInstanceOf(jprompter, clazz))
- {
- env->DeleteLocalRef(clazz);
- return NULL;
- }
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN_NULL;
// Check if PromptUserPassword2 is implemented by the Java object.
jclass clazz2 = env->FindClass(JAVA_PACKAGE"/PromptUserPassword2");
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
bool v2 = env->IsInstanceOf(jprompter, clazz2) ? true: false;
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- env->DeleteLocalRef(clazz2);
+ POP_AND_RETURN_NULL;
bool v3 = false;
if (v2)
@@ -102,20 +101,20 @@ Prompter *Prompter::makeCPrompter(jobjec
// Check if PromptUserPassword3 is implemented by the Java object.
jclass clazz3 = env->FindClass(JAVA_PACKAGE"/PromptUserPassword3");
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
v3 = env->IsInstanceOf(jprompter, clazz3) ? true: false;
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- env->DeleteLocalRef(clazz3);
+ POP_AND_RETURN_NULL;
}
// Create a new global ref for the Java object, because it is
// longer used that this call.
jobject myPrompt = env->NewGlobalRef(jprompter);
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
+
+ env->PopLocalFrame(NULL);
// Create the C++ peer.
return new Prompter(myPrompt, v2, v3);
@@ -129,6 +128,11 @@ jstring Prompter::username()
{
JNIEnv *env = JNIUtil::getEnv();
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
// The method id will not change during the time this library is
// loaded, so it can be cached.
static jmethodID mid = 0;
@@ -137,20 +141,18 @@ jstring Prompter::username()
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/PromptUserPassword");
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
mid = env->GetMethodID(clazz, "getUsername", "()Ljava/lang/String;");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return NULL;
-
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN_NULL;
}
jstring ret = static_cast<jstring>(env->CallObjectMethod(m_prompter, mid));
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
- return ret;
+ return (jstring) env->PopLocalFrame(ret);
}
/**
@@ -161,6 +163,11 @@ jstring Prompter::password()
{
JNIEnv *env = JNIUtil::getEnv();
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
// The method id will not change during the time this library is
// loaded, so it can be cached.
static jmethodID mid = 0;
@@ -169,20 +176,18 @@ jstring Prompter::password()
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/PromptUserPassword");
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
mid = env->GetMethodID(clazz, "getPassword", "()Ljava/lang/String;");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return NULL;
-
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN_NULL;
}
jstring ret = static_cast<jstring>(env->CallObjectMethod(m_prompter, mid));
if (JNIUtil::isJavaExceptionThrown())
return NULL;
- return ret;
+ return (jstring) env->PopLocalFrame(ret);
}
/**
* Ask the user a question, which can be answered by yes/no.
@@ -196,6 +201,11 @@ bool Prompter::askYesNo(const char *real
{
JNIEnv *env = JNIUtil::getEnv();
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
// The method id will not change during the time this library is
// loaded, so it can be cached.
static jmethodID mid = 0;
@@ -204,35 +214,30 @@ bool Prompter::askYesNo(const char *real
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/PromptUserPassword");
if (JNIUtil::isJavaExceptionThrown())
- return false;
+ POP_AND_RETURN(false);
mid = env->GetMethodID(clazz, "askYesNo",
"(Ljava/lang/String;Ljava/lang/String;Z)Z");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return false;
-
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN(false);
}
// convert the texts to Java strings
jstring jrealm = JNIUtil::makeJString(realm);
if (JNIUtil::isJavaExceptionThrown())
- return false;
+ POP_AND_RETURN(false);
jstring jquestion = JNIUtil::makeJString(question);
if (JNIUtil::isJavaExceptionThrown())
- return false;
+ POP_AND_RETURN(false);
// execute the callback
jboolean ret = env->CallBooleanMethod(m_prompter, mid, jrealm, jquestion,
yesIsDefault ? JNI_TRUE : JNI_FALSE);
if (JNIUtil::isJavaExceptionThrown())
- return false;
-
- // delete the Java strings
- env->DeleteLocalRef(jquestion);
- env->DeleteLocalRef(jrealm);
+ POP_AND_RETURN(false);
+ env->PopLocalFrame(NULL);
return ret ? true:false;
}
@@ -240,6 +245,12 @@ const char *Prompter::askQuestion(const
bool showAnswer, bool maySave)
{
JNIEnv *env = JNIUtil::getEnv();
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
if (m_version3)
{
static jmethodID mid = 0;
@@ -248,37 +259,34 @@ const char *Prompter::askQuestion(const
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/PromptUserPassword3");
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
mid = env->GetMethodID(clazz, "askQuestion",
- "(Ljava/lang/String;Ljava/lang/String;ZZ)Ljava/lang/String;");
+ "(Ljava/lang/String;Ljava/lang/String;"
+ "ZZ)Ljava/lang/String;");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return NULL;
+ POP_AND_RETURN_NULL;
mid2 = env->GetMethodID(clazz, "userAllowedSave", "()Z");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return NULL;
-
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN_NULL;
}
jstring jrealm = JNIUtil::makeJString(realm);
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
jstring jquestion = JNIUtil::makeJString(question);
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
jstring janswer = static_cast<jstring>(
- env->CallObjectMethod(m_prompter, mid, jrealm, jquestion,
- showAnswer ? JNI_TRUE : JNI_FALSE,
- maySave ? JNI_TRUE : JNI_FALSE));
+ env->CallObjectMethod(m_prompter, mid, jrealm,
+ jquestion,
+ showAnswer ? JNI_TRUE : JNI_FALSE,
+ maySave ? JNI_TRUE : JNI_FALSE));
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- env->DeleteLocalRef(jquestion);
- env->DeleteLocalRef(jrealm);
+ POP_AND_RETURN_NULL;
JNIStringHolder answer(janswer);
if (answer != NULL)
@@ -286,14 +294,13 @@ const char *Prompter::askQuestion(const
m_answer = answer;
m_maySave = env->CallBooleanMethod(m_prompter, mid2) ? true: false;
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
}
else
{
m_answer = "";
m_maySave = false;
}
- return m_answer.c_str();
}
else
{
@@ -302,32 +309,28 @@ const char *Prompter::askQuestion(const
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/PromptUserPassword");
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
mid = env->GetMethodID(clazz, "askQuestion",
- "(Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;");
+ "(Ljava/lang/String;Ljava/lang/String;Z)"
+ "Ljava/lang/String;");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return NULL;
-
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN_NULL;
}
jstring jrealm = JNIUtil::makeJString(realm);
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
jstring jquestion = JNIUtil::makeJString(question);
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ POP_AND_RETURN_NULL;
jstring janswer = static_cast<jstring>(
- env->CallObjectMethod(m_prompter, mid, jrealm, jquestion,
- showAnswer ? JNI_TRUE : JNI_FALSE));
+ env->CallObjectMethod(m_prompter, mid, jrealm,
+ jquestion, showAnswer ? JNI_TRUE : JNI_FALSE));
if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- env->DeleteLocalRef(jquestion);
- env->DeleteLocalRef(jrealm);
+ POP_AND_RETURN_NULL;
JNIStringHolder answer(janswer);
if (answer != NULL)
@@ -343,8 +346,10 @@ const char *Prompter::askQuestion(const
m_answer = "";
m_maySave = false;
}
- return m_answer.c_str();
}
+
+ env->PopLocalFrame(NULL);
+ return m_answer.c_str();
}
int Prompter::askTrust(const char *question, bool maySave)
@@ -353,30 +358,33 @@ int Prompter::askTrust(const char *quest
{
static jmethodID mid = 0;
JNIEnv *env = JNIUtil::getEnv();
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return -1;
+
if (mid == 0)
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/PromptUserPassword2");
if (JNIUtil::isJavaExceptionThrown())
- return -1;
+ POP_AND_RETURN(-1);
mid = env->GetMethodID(clazz, "askTrustSSLServer",
"(Ljava/lang/String;Z)I");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return -1;
-
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN(-1);
}
jstring jquestion = JNIUtil::makeJString(question);
if (JNIUtil::isJavaExceptionThrown())
- return -1;
+ POP_AND_RETURN(-1);
jint ret = env->CallIntMethod(m_prompter, mid, jquestion,
maySave ? JNI_TRUE : JNI_FALSE);
if (JNIUtil::isJavaExceptionThrown())
- return -1;
-
- env->DeleteLocalRef(jquestion);
+ POP_AND_RETURN(-1);
+ env->PopLocalFrame(NULL);
return ret;
}
else
@@ -403,6 +411,13 @@ int Prompter::askTrust(const char *quest
bool Prompter::prompt(const char *realm, const char *pi_username, bool maySave)
{
JNIEnv *env = JNIUtil::getEnv();
+ jboolean ret;
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return false;
+
if (m_version3)
{
static jmethodID mid = 0;
@@ -411,42 +426,34 @@ bool Prompter::prompt(const char *realm,
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/PromptUserPassword3");
if (JNIUtil::isJavaExceptionThrown())
- return false;
+ POP_AND_RETURN(false);
mid = env->GetMethodID(clazz, "prompt",
"(Ljava/lang/String;Ljava/lang/String;Z)Z");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return false;
+ POP_AND_RETURN(false);
mid2 = env->GetMethodID(clazz, "userAllowedSave", "()Z");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return false;
-
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN(false);
}
jstring jrealm = JNIUtil::makeJString(realm);
if (JNIUtil::isJavaExceptionThrown())
- return false;
+ POP_AND_RETURN(false);
jstring jusername = JNIUtil::makeJString(pi_username);
if (JNIUtil::isJavaExceptionThrown())
- return false;
+ POP_AND_RETURN(false);
- jboolean ret = env->CallBooleanMethod(m_prompter, mid, jrealm,
- jusername,
- maySave ? JNI_TRUE: JNI_FALSE);
+ ret = env->CallBooleanMethod(m_prompter, mid, jrealm, jusername,
+ maySave ? JNI_TRUE: JNI_FALSE);
if (JNIUtil::isJavaExceptionThrown())
- return false;
-
- env->DeleteLocalRef(jusername);
- env->DeleteLocalRef(jrealm);
+ POP_AND_RETURN(false);
m_maySave = env->CallBooleanMethod(m_prompter, mid2) ? true : false;
if (JNIUtil::isJavaExceptionThrown())
- return false;
-
- return ret ? true:false;
+ POP_AND_RETURN(false);
}
else
{
@@ -455,39 +462,34 @@ bool Prompter::prompt(const char *realm,
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/PromptUserPassword");
if (JNIUtil::isJavaExceptionThrown())
- return false;
+ POP_AND_RETURN(false);
mid = env->GetMethodID(clazz, "prompt",
"(Ljava/lang/String;Ljava/lang/String;)Z");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
- return false;
-
- env->DeleteLocalRef(clazz);
+ POP_AND_RETURN(false);
}
jstring jrealm = JNIUtil::makeJString(realm);
if (JNIUtil::isJavaExceptionThrown())
- return false;
+ POP_AND_RETURN(false);
jstring jusername = JNIUtil::makeJString(pi_username);
if (JNIUtil::isJavaExceptionThrown())
- return false;
+ POP_AND_RETURN(false);
- jboolean ret = env->CallBooleanMethod(m_prompter, mid, jrealm,
- jusername);
+ ret = env->CallBooleanMethod(m_prompter, mid, jrealm, jusername);
if (JNIUtil::isJavaExceptionThrown())
- return false;
-
- env->DeleteLocalRef(jusername);
- env->DeleteLocalRef(jrealm);
+ POP_AND_RETURN(false);
if (maySave)
m_maySave = askYesNo(realm, _("May save the answer ?"), true);
else
m_maySave = false;
-
- return ret ? true:false;
}
+
+ env->PopLocalFrame(NULL);
+ return ret ? true:false;
}
svn_auth_provider_object_t *Prompter::getProviderSimple()