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/03/20 02:41:38 UTC

svn commit: r925517 - in /subversion/trunk/subversion/bindings/javahl/native: EnumMapper.cpp EnumMapper.h

Author: hwright
Date: Sat Mar 20 01:41:37 2010
New Revision: 925517

URL: http://svn.apache.org/viewvc?rev=925517&view=rev
Log:
JavaHL: (Ab)use our knowledge of the Java and C enum values to be much more
efficient about converting between the two.

[ in subversion/bindings/javahl/ ]
* native/EnumMapper.h
  (mapEnum): New version of this function.
 
* native/EnumMapper.cpp
  (mapSummarizeKind): Reimplment using the new mapEnum() method.
  (mapEnum): New.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/EnumMapper.cpp
    subversion/trunk/subversion/bindings/javahl/native/EnumMapper.h

Modified: subversion/trunk/subversion/bindings/javahl/native/EnumMapper.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/EnumMapper.cpp?rev=925517&r1=925516&r2=925517&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/EnumMapper.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/EnumMapper.cpp Sat Mar 20 01:41:37 2010
@@ -552,21 +552,43 @@ svn_opt_revision_kind EnumMapper::toRevi
 
 jobject EnumMapper::mapSummarizeKind(svn_client_diff_summarize_kind_t sKind)
 {
-  switch (sKind)
-    {
-    default:
-    case svn_client_diff_summarize_kind_normal:
-      return mapEnum(JAVA_PACKAGE"/DiffSummary$DiffKind", "normal");
-
-    case svn_client_diff_summarize_kind_added:
-      return mapEnum(JAVA_PACKAGE"/DiffSummary$DiffKind", "added");
-
-    case svn_client_diff_summarize_kind_modified:
-      return mapEnum(JAVA_PACKAGE"/DiffSummary$DiffKind", "modified");
-
-    case svn_client_diff_summarize_kind_deleted:
-      return mapEnum(JAVA_PACKAGE"/DiffSummary$DiffKind", "deleted");
-    }
+  // We're assuming a value value for the C enum above
+  return mapEnum(JAVA_PACKAGE"/DiffSummary$DiffKind", (int) sKind);
+}
+
+jobject EnumMapper::mapEnum(const char *clazzName, int index)
+{
+  // The fact that we can even do this depends upon a couple of assumptions,
+  // mainly some knowledge about the orderin of the various constants in
+  // both the C and Java enums.  Should those values ever change,
+  // the World Will End.
+
+  std::string methodSig("()[L");
+  methodSig.append(clazzName);
+  methodSig.append(";");
+
+  JNIEnv *env = JNIUtil::getEnv();
+
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
+
+  jclass clazz = env->FindClass(clazzName);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jmethodID mid = env->GetStaticMethodID(clazz, "values", methodSig.c_str());
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobjectArray jvalues = (jobjectArray) env->CallStaticObjectMethod(clazz, mid);
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  jobject jthing = env->GetObjectArrayElement(jvalues, index);
+
+  return env->PopLocalFrame(jthing);
 }
 
 jobject EnumMapper::mapEnum(const char *clazzName, const char *name)

Modified: subversion/trunk/subversion/bindings/javahl/native/EnumMapper.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/EnumMapper.h?rev=925517&r1=925516&r2=925517&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/EnumMapper.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/EnumMapper.h Sat Mar 20 01:41:37 2010
@@ -63,6 +63,7 @@ class EnumMapper
   static jobject mapSummarizeKind(svn_client_diff_summarize_kind_t);
  private:
   static jobject mapEnum(const char *clazzName, const char *name);
+  static jobject mapEnum(const char *clazzName, int offset);
   static jstring getName(const char *clazzName, jobject jenum);
 };