]> git.eshelyaron.com Git - emacs.git/commitdiff
Update Android port
authorPo Lu <luangruo@yahoo.com>
Mon, 13 Mar 2023 10:31:30 +0000 (18:31 +0800)
committerPo Lu <luangruo@yahoo.com>
Mon, 13 Mar 2023 10:31:30 +0000 (18:31 +0800)
* src/android.c (android_check_string, android_build_string):
Reduce consing when building menu bar strings.

src/android.c

index 16c645ced1e646c0291b772f58e48cbfbaf5084c..efbf8fc95ccb21ce16853c630b8f43fb7b4b73b8 100644 (file)
@@ -5389,6 +5389,23 @@ emacs_abort (void)
 
 \f
 
+/* Return whether or not TEXT, a string without multibyte
+   characters, has no bytes with the 8th bit set.  */
+
+static bool
+android_check_string (Lisp_Object text)
+{
+  ptrdiff_t i;
+
+  for (i = 0; i < ASIZE (text); ++i)
+    {
+      if (SREF (text, i) & 128)
+       return false;
+    }
+
+  return true;
+}
+
 /* Given a Lisp string TEXT, return a local reference to an equivalent
    Java string.  */
 
@@ -5401,6 +5418,21 @@ android_build_string (Lisp_Object text)
   jchar *characters;
   USE_SAFE_ALLOCA;
 
+  /* Directly encode TEXT if it contains no multibyte
+     characters.  This is okay because the Java extended UTF
+     format is compatible with ASCII.  */
+
+  if (SBYTES (text) == SCHARS (text)
+      && android_check_string (text))
+    {
+      string = (*android_java_env)->NewStringUTF (android_java_env,
+                                                 SSDATA (text));
+      android_exception_check ();
+      SAFE_FREE ();
+
+      return string;
+    }
+
   encoded = code_convert_string_norecord (text, Qutf_16le,
                                          true);
   nchars = (SBYTES (encoded) / sizeof (jchar));