From: "João Távora" <joaotavora@gmail.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 50946@debbugs.gnu.org
Subject: bug#50946: insert-file-contents can corrupt buffers. [Was: bug#50946: Emacs-28: Inadequate coding in hack-elisp-shorthands]
Date: Sun, 03 Oct 2021 16:42:48 +0100 [thread overview]
Message-ID: <87tuhyt8qv.fsf@gmail.com> (raw)
In-Reply-To: <87y27at950.fsf@gmail.com> ("João Távora"'s message of "Sun, 03 Oct 2021 16:34:19 +0100")
João Távora <joaotavora@gmail.com> writes:
> I tried with a hook but it doesn't work: it breaks a shorthands test,
> a most basic one. Maybe you can understand where the problem is?
As usual, digging a bit after posting the broken patch brought me to an
apparent solution. The following patch seems to work, slightly
complexifies load-with-code-conversion, but simplifies shorthands.el
very much (and should solve the problems). But please have a look.
João
commit 9bc76f971597d42ba0c8b4655501223d03181b3b
Author: João Távora <joaotavora@gmail.com>
Date: Sun Oct 3 16:05:40 2021 +0100
Simplify hack-read-symbol-shorthands again (bug#50946)
* lisp/loadup.el (load-source-file-function): Don't set twice.
* lisp/shorthands.el (hack-read-symbol-shorthands): Simplify.
(load-with-shorthands-and-code-conversion): Remove.
* lisp/international/mule.el (load-with-code-conversion): Call
load-with-code-coversion-hook. Set up shorthands.
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index 2a855b5673..b612ea5c77 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -294,6 +294,9 @@ define-charset
(apply 'define-charset-internal name (mapcar 'cdr attrs))))
+(defvar load-with-code-conversion-hook nil
+ "Hook run in `load-with-code-conversion'.")
+
(defun load-with-code-conversion (fullname file &optional noerror nomessage)
"Execute a file of Lisp code named FILE whose absolute name is FULLNAME.
The file contents are decoded before evaluation if necessary.
@@ -319,7 +322,8 @@ load-with-code-conversion
(let ((load-true-file-name fullname)
(load-file-name fullname)
(set-auto-coding-for-load t)
- (inhibit-file-name-operation nil))
+ (inhibit-file-name-operation nil)
+ shorthands)
(with-current-buffer buffer
;; So that we don't get completely screwed if the
;; file is encoded in some complicated character set,
@@ -328,6 +332,8 @@ load-with-code-conversion
;; Don't let deactivate-mark remain set.
(let (deactivate-mark)
(insert-file-contents fullname))
+ (run-hooks 'load-with-code-conversion-hook)
+ (setq shorthands read-symbol-shorthands)
;; If the loaded file was inserted with no-conversion or
;; raw-text coding system, make the buffer unibyte.
;; Otherwise, eval-buffer might try to interpret random
@@ -338,11 +344,13 @@ load-with-code-conversion
(set-buffer-multibyte nil))
;; Make `kill-buffer' quiet.
(set-buffer-modified-p nil))
- ;; Have the original buffer current while we eval.
- (eval-buffer buffer nil
- ;; This is compatible with what `load' does.
- (if dump-mode file fullname)
- nil t))
+ ;; Have the original buffer current while we eval,
+ ;; but consider shorthands of the eval'ed one.
+ (let ((read-symbol-shorthands shorthands))
+ (eval-buffer buffer nil
+ ;; This is compatible with what `load' does.
+ (if dump-mode file fullname)
+ nil t)))
(let (kill-buffer-hook kill-buffer-query-functions)
(kill-buffer buffer)))
(do-after-load-evaluation fullname)
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 3fb6b81328..3a55d2c805 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -355,7 +355,6 @@
(load "paren")
(load "shorthands")
-(setq load-source-file-function #'load-with-shorthands-and-code-conversion)
(load "emacs-lisp/eldoc")
(load "cus-start") ;Late to reduce customize-rogue (needs loaddefs.el anyway)
diff --git a/lisp/shorthands.el b/lisp/shorthands.el
index c31ef3d216..ecf04ac587 100644
--- a/lisp/shorthands.el
+++ b/lisp/shorthands.el
@@ -28,35 +28,17 @@
(require 'files)
(eval-when-compile (require 'cl-lib))
-(defun hack-read-symbol-shorthands (fullname)
- "Return value of `read-symbol-shorthands' file-local variable in FULLNAME.
-FULLNAME is the absolute file name of an Elisp .el file which
-potentially specifies a file-local value for
-`read-symbol-shorthands'. The Elisp code in FULLNAME isn't read
-or evaluated in any way, except for extraction of the
-buffer-local value of `read-symbol-shorthands'."
- (let* ((size (nth 7 (file-attributes fullname)))
- (from (max 0 (- size 3000)))
- (to size))
- (with-temp-buffer
- (while (and (< (buffer-size) 3000) (>= from 0))
- (insert-file-contents fullname nil from to)
- (setq to from
- from (cond
- ((= from 0) -1)
- (t (max 0 (- from 100))))))
- ;; FIXME: relies on the `hack-local-variables--find-variables'
- ;; detail of files.el. That function should be exported,
- ;; possibly be refactored into two parts, since we're only
- ;; interested in basic "Local Variables" parsing.
- (alist-get 'read-symbol-shorthands (hack-local-variables--find-variables)))))
-
-(defun load-with-shorthands-and-code-conversion (fullname file noerror nomessage)
- "Like `load-with-code-conversion', but also consider Elisp shorthands.
-This function uses shorthands defined in the file FULLNAME's local
-value of `read-symbol-shorthands', when it processes that file's Elisp code."
- (let ((read-symbol-shorthands (hack-read-symbol-shorthands fullname)))
- (load-with-code-conversion fullname file noerror nomessage)))
+(add-hook 'load-with-code-conversion-hook #'hack-read-symbol-shorthands)
+
+(defun hack-read-symbol-shorthands ()
+ "Set `read-symbol-shorthands' from Local Variables section."
+ ;; FIXME: relies on the `hack-local-variables--find-variables'
+ ;; detail of files.el. That function should be exported,
+ ;; possibly be refactored into two parts, since we're only
+ ;; interested in basic "Local Variables" parsing.
+ (setq-local read-symbol-shorthands
+ (alist-get 'read-symbol-shorthands
+ (hack-local-variables--find-variables))))
\f
;; FIXME: move this all to progmodes/elisp-mode.el? OTOH it'd make
next prev parent reply other threads:[~2021-10-03 15:42 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-01 17:10 bug#50946: Emacs-28: Inadequate coding in hack-elisp-shorthands Alan Mackenzie
2021-10-01 17:53 ` Eli Zaretskii
2021-10-01 21:15 ` João Távora
2021-10-02 6:10 ` Eli Zaretskii
2021-10-02 0:48 ` João Távora
2021-10-02 10:50 ` Alan Mackenzie
2021-10-02 11:13 ` João Távora
2021-10-02 11:38 ` João Távora
2021-10-02 12:38 ` Alan Mackenzie
2021-10-02 12:52 ` Eli Zaretskii
2021-10-02 13:57 ` Alan Mackenzie
2021-10-02 14:19 ` Eli Zaretskii
2021-10-02 14:45 ` Alan Mackenzie
2021-10-02 15:00 ` Eli Zaretskii
2021-10-02 20:07 ` Alan Mackenzie
2021-10-03 11:45 ` Eli Zaretskii
2021-10-03 12:10 ` bug#50946: insert-file-contents can corrupt buffers. [Was: bug#50946: Emacs-28: Inadequate coding in hack-elisp-shorthands] Alan Mackenzie
2021-10-03 12:40 ` Eli Zaretskii
2021-10-03 13:33 ` Alan Mackenzie
2021-10-03 15:04 ` bug#50946: insert-file-contents can corrupt buffers Alan Mackenzie
2021-10-03 15:25 ` Eli Zaretskii
2021-10-03 17:21 ` Alan Mackenzie
2021-10-03 17:36 ` Eli Zaretskii
2021-10-03 18:19 ` Alan Mackenzie
2021-10-03 15:34 ` bug#50946: insert-file-contents can corrupt buffers. [Was: bug#50946: Emacs-28: Inadequate coding in hack-elisp-shorthands] João Távora
2021-10-03 15:42 ` João Távora [this message]
2021-10-03 15:56 ` Eli Zaretskii
2021-10-03 16:02 ` João Távora
2021-10-03 16:20 ` Eli Zaretskii
2021-10-03 17:05 ` João Távora
2021-10-03 17:56 ` Eli Zaretskii
2021-10-03 18:59 ` João Távora
2021-10-03 19:51 ` Eli Zaretskii
2021-10-03 19:59 ` João Távora
2021-10-02 15:02 ` bug#50946: Emacs-28: Inadequate coding in hack-elisp-shorthands João Távora
2021-10-04 0:14 ` Richard Stallman
2021-10-02 14:47 ` João Távora
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87tuhyt8qv.fsf@gmail.com \
--to=joaotavora@gmail.com \
--cc=50946@debbugs.gnu.org \
--cc=eliz@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.