]> git.eshelyaron.com Git - emacs.git/commitdiff
Module API: Don’t require null-terminated strings in make_string.
authorPhilipp Stephani <phst@google.com>
Mon, 22 Apr 2019 13:43:52 +0000 (15:43 +0200)
committerPhilipp Stephani <phst@google.com>
Mon, 22 Apr 2019 13:44:37 +0000 (15:44 +0200)
* emacs-module.c (module_make_string): Use make_unibyte_string, which
doesn’t require its argument to be null-terminated.  Since it always
returns a heap-allocated string, we don’t have to copy it any more
while decoding.
(module_decode): New helper function.

src/emacs-module.c

index 8fd2a87cc236826140c0bec8b39a67eb2f3c849c..20dcff2b67adc32ba7eaad2af06723e64359590b 100644 (file)
@@ -212,6 +212,7 @@ static void module_reset_handlerlist (struct handler **);
 static bool value_storage_contains_p (const struct emacs_value_storage *,
                                       emacs_value, ptrdiff_t *);
 static Lisp_Object module_encode (Lisp_Object);
+static Lisp_Object module_decode (Lisp_Object);
 static Lisp_Object module_decode_copy (Lisp_Object);
 
 static bool module_assertions = false;
@@ -629,10 +630,8 @@ module_make_string (emacs_env *env, const char *str, ptrdiff_t length)
   MODULE_FUNCTION_BEGIN (NULL);
   if (! (0 <= length && length <= STRING_BYTES_BOUND))
     overflow_error ();
-  /* FIXME: AUTO_STRING_WITH_LEN requires STR to be NUL-terminated,
-     but we shouldn't require that.  */
-  AUTO_STRING_WITH_LEN (lstr, str, length);
-  return lisp_to_value (env, module_decode_copy (lstr));
+  Lisp_Object lstr = make_unibyte_string (str, length);
+  return lisp_to_value (env, module_decode (lstr));
 }
 
 static emacs_value
@@ -946,6 +945,12 @@ module_encode (Lisp_Object string)
   return code_convert_string (string, Qutf_8_unix, Qt, true, true, true);
 }
 
+static Lisp_Object
+module_decode (Lisp_Object string)
+{
+  return code_convert_string (string, Qutf_8_unix, Qt, false, true, true);
+}
+
 static Lisp_Object
 module_decode_copy (Lisp_Object string)
 {