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()