(mm-with-unibyte-current-buffer): Redefine it so as not to bind the default
authorKatsumi Yamaoka <yamaoka@jpl.org>
Mon, 10 May 2010 07:23:32 +0000 (07:23 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Mon, 10 May 2010 07:23:32 +0000 (07:23 +0000)
 value of enable-multibyte-characters to nil.

lisp/ChangeLog
lisp/mm-util.el

index 78c7023..5109a0c 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-10  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * mm-util.el (mm-with-unibyte-current-buffer): Redefine it so as not to
+       bind the default value of enable-multibyte-characters to nil.
+
 2010-05-10  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * message.el (message-forward-make-body-plain)
index a288b8b..fe7fd78 100644 (file)
@@ -1230,33 +1230,23 @@ Use multibyte mode for this."
 
 (defmacro mm-with-unibyte-current-buffer (&rest forms)
   "Evaluate FORMS with current buffer temporarily made unibyte.
-Also bind the default-value of `enable-multibyte-characters' to nil.
-Equivalent to `progn' in XEmacs
-
-NOTE: Use this macro with caution in multibyte buffers (it is not
-worth using this macro in unibyte buffers of course).  Use of
-`(set-buffer-multibyte t)', which is run finally, is generally
-harmful since it is likely to modify existing data in the buffer.
-For instance, it converts \"\\300\\255\" into \"\\255\" in
-Emacs 23 (unicode)."
+Equivalent to `progn' in XEmacs.
+
+Note: We recommend not using this macro any more; there should be
+better ways to do a similar thing.  The previous version of this macro
+bound the default value of `enable-multibyte-characters' to nil while
+evaluating FORMS but it is no longer done.  So, some programs assuming
+it if any may malfunction."
   (if (featurep 'xemacs)
       `(progn ,@forms)
-    ;; FIXME: (default-value 'enable-multibyte-characters) is read-only
-    ;; so let-binding it is wrong.  The right fix is to not use this
-    ;; macro at all any more, since it's been ill-defined from the start.
-    (let ((multibyte (make-symbol "multibyte"))
-         (buffer (make-symbol "buffer")))
-      `(if mm-emacs-mule
-          (let ((,multibyte enable-multibyte-characters)
-                (,buffer (current-buffer)))
-            (unwind-protect
-                (letf (((default-value 'enable-multibyte-characters) nil))
-                      (set-buffer-multibyte nil)
-                      ,@forms)
-              (set-buffer ,buffer)
-              (set-buffer-multibyte ,multibyte)))
-        (letf (((default-value 'enable-multibyte-characters) nil))
-              ,@forms)))))
+    (let ((multibyte (make-symbol "multibyte")))
+      `(let ((,multibyte enable-multibyte-characters))
+        (when ,multibyte
+          (set-buffer-multibyte nil))
+        (prog1
+            (progn ,@forms)
+          (when ,multibyte
+            (set-buffer-multibyte t)))))))
 (put 'mm-with-unibyte-current-buffer 'lisp-indent-function 0)
 (put 'mm-with-unibyte-current-buffer 'edebug-form-spec '(body))