]> git.eshelyaron.com Git - emacs.git/commitdiff
Use decode_string_utf_8 in emacs-module.c.
authorPhilipp Stephani <phst@google.com>
Sun, 12 Jan 2020 23:07:07 +0000 (00:07 +0100)
committerPhilipp Stephani <phst@google.com>
Sun, 12 Jan 2020 23:08:32 +0000 (00:08 +0100)
Now that decode_string_utf_8 is available, we can use it to signal
errors on invalid input.

* src/coding.c (syms_of_coding): Move Qutf_8_string_p from json.c
since it’s now used outside json.c.

* src/emacs-module.c (module_decode_utf_8): New helper function.
(module_make_function, module_copy_string_contents): Use it.

src/coding.c
src/emacs-module.c
src/json.c

index ed755b1afcff5b486d961fdbe5edc2de1d7fec37..8b54281c0bf049bf2ab6713b67b2b9b1f4d4d7fd 100644 (file)
@@ -11745,6 +11745,8 @@ syms_of_coding (void)
 
   DEFSYM (Qignored, "ignored");
 
+  DEFSYM (Qutf_8_string_p, "utf-8-string-p");
+
   defsubr (&Scoding_system_p);
   defsubr (&Sread_coding_system);
   defsubr (&Sread_non_nil_coding_system);
index f40ca931fa98b1db1f9a65fa96d419e89d34bf0d..60f16418efa0188db837cf76a76c354f89eace50 100644 (file)
@@ -212,6 +212,25 @@ static bool value_storage_contains_p (const struct emacs_value_storage *,
                                       emacs_value, ptrdiff_t *);
 
 static bool module_assertions = false;
+\f
+
+/* Small helper functions.  */
+
+/* Interprets the string at STR with length LEN as UTF-8 string.
+   Signals an error if it's not a valid UTF-8 string.  */
+
+static Lisp_Object
+module_decode_utf_8 (const char *str, ptrdiff_t len)
+{
+  /* We set HANDLE-8-BIT and HANDLE-OVER-UNI to nil to signal an error
+     if the argument is not a valid UTF-8 string.  While it isn't
+     documented how make_string and make_function behave in this case,
+     signaling an error is the most defensive and obvious reaction. */
+  Lisp_Object s = decode_string_utf_8 (Qnil, str, len, Qnil, false, Qnil, Qnil);
+  CHECK_TYPE (!NILP (s), Qutf_8_string_p, make_string_from_utf8 (str, len));
+  return s;
+}
+
 \f
 /* Convenience macros for non-local exit handling.  */
 
@@ -521,7 +540,8 @@ module_make_function (emacs_env *env, ptrdiff_t min_arity, ptrdiff_t max_arity,
   function->finalizer = NULL;
 
   if (docstring)
-    function->documentation = build_string_from_utf8 (docstring);
+    function->documentation
+      = module_decode_utf_8 (docstring, strlen (docstring));
 
   Lisp_Object result;
   XSET_MODULE_FUNCTION (result, function);
@@ -694,7 +714,7 @@ module_make_string (emacs_env *env, const char *str, ptrdiff_t len)
   MODULE_FUNCTION_BEGIN (NULL);
   if (! (0 <= len && len <= STRING_BYTES_BOUND))
     overflow_error ();
-  Lisp_Object lstr = make_string_from_utf8 (str, len);
+  Lisp_Object lstr = module_decode_utf_8 (str, len);
   return lisp_to_value (env, lstr);
 }
 
index 2e50ce514fdc258802eec147dee522dfba7a4b5f..3002767558083b84d78f5397651b53f4202efa61 100644 (file)
@@ -1121,7 +1121,6 @@ syms_of_json (void)
 
   DEFSYM (Qstring_without_embedded_nulls_p, "string-without-embedded-nulls-p");
   DEFSYM (Qjson_value_p, "json-value-p");
-  DEFSYM (Qutf_8_string_p, "utf-8-string-p");
 
   DEFSYM (Qjson_error, "json-error");
   DEFSYM (Qjson_out_of_memory, "json-out-of-memory");