]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix Fchar_syntax for non-ASCII in unibyte buffers
authorMattias Engdegård <mattiase@acm.org>
Sun, 16 Jan 2022 10:58:00 +0000 (11:58 +0100)
committerMattias Engdegård <mattiase@acm.org>
Thu, 20 Jan 2022 10:44:07 +0000 (11:44 +0100)
Fchar_syntax did not convert unibyte characters to multibyte when the
current buffer was unibyte, in contrast to `char-syntax` in
byte-compiled code (bug#53260).

* src/bytecode.c (exec_byte_code): Call out to Fchar_syntax;
the dynamic frequency is too low to justify inlining here, and it
did lead to implementations diverging.
* src/syntax.c (Fchar_syntax): Convert non-ASCII unibyte values to
multibyte.
* test/src/syntax-tests.el (syntax-char-syntax): New test.

src/bytecode.c
src/syntax.c
test/src/syntax-tests.el

index 472992be180b1ecb1468d766b19942c8288ac40e..b7e65d05aef670b0a04fef2d55b6df233ddac13d 100644 (file)
@@ -1167,13 +1167,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
          NEXT;
 
        CASE (Bchar_syntax):
-         {
-           CHECK_CHARACTER (TOP);
-           int c = XFIXNAT (TOP);
-           if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
-             c = make_char_multibyte (c);
-           XSETFASTINT (TOP, syntax_code_spec[SYNTAX (c)]);
-         }
+         TOP = Fchar_syntax (TOP);
          NEXT;
 
        CASE (Bbuffer_substring):
index 9df878b8edf58fc0a31d2378041fdfbecb0d61f2..13c36fdf3cdd2bf350291d4a47321d3b4fb8cdd6 100644 (file)
@@ -1101,10 +1101,11 @@ this is probably the wrong function to use, because it can't take
 `syntax-after' instead.  */)
   (Lisp_Object character)
 {
-  int char_int;
   CHECK_CHARACTER (character);
-  char_int = XFIXNUM (character);
+  int char_int = XFIXNAT (character);
   SETUP_BUFFER_SYNTAX_TABLE ();
+  if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
+    char_int = make_char_multibyte (char_int);
   return make_fixnum (syntax_code_spec[SYNTAX (char_int)]);
 }
 
index 3b9f21cde37d1f999b96c224c23a5ae3bf2f0535..751a900a23e5a7978b385d87f36607d247201932 100644 (file)
@@ -506,4 +506,19 @@ the `parse-partial-sexp's are expected to stop.  See
     (should (parse-partial-sexp 1 1))
     (should-error (parse-partial-sexp 2 1))))
 
+(ert-deftest syntax-char-syntax ()
+  ;; Verify that char-syntax behaves identically in interpreted and
+  ;; byte-compiled code (bug#53260).
+  (let ((cs (byte-compile (lambda (x) (char-syntax x)))))
+    ;; Use a unibyte buffer with a syntax table using symbol syntax
+    ;; for raw byte 128.
+    (with-temp-buffer
+      (set-buffer-multibyte nil)
+      (let ((st (make-syntax-table)))
+        (modify-syntax-entry (unibyte-char-to-multibyte 128) "_" st)
+        (set-syntax-table st)
+        (should (equal (eval '(char-syntax 128) t) ?_))
+        (should (equal (funcall cs 128) ?_))))
+    (list (char-syntax 128) (funcall cs 128))))
+
 ;;; syntax-tests.el ends here