[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#37095: [PATCH] Save match data in ucs-normalize-region
From: |
Akinori MUSHA |
Subject: |
bug#37095: [PATCH] Save match data in ucs-normalize-region |
Date: |
Tue, 20 Aug 2019 16:18:06 +0900 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 |
A patch generated by git format-patch is attached below, which simply
wraps `ucs-normalize-region` with `save-match-data`.
I'm a user of the Emacs Mac port by mituharu was investigating a bug
where dired fails to open a certain local directory on macOS. The
error was raised at `replace-match` in the `insert-directory`
function:
```
(when (re-search-forward "^ *\\(total\\)" nil t)
(let ((available (get-free-disk-space ".")))
(when available
;; Replace "total" with "used", to avoid confusion.
(replace-match "total used in directory" nil nil nil 1)
```
And it turned out the match data changed after returning from
`get-free-disk-space` and that was why `replace-match` failed.
Inside of `get-free-disk-space` most platforms uses a generic method
to get the free space, and that part is fine because it is surrounded
by `save-match-data`. However, the Mac port is one of the few
platforms that implements a native 'file-system-info` function, which
is called if it exists. Then, the `file-system-info` in `src/mac.c`
calls ENCODE_FILE() on a given directory name, which in the end calls
`ucs-normalize-region` to normalize the filename, where the match data
is clobbered.
https://bitbucket.org/mituharu/emacs-mac/src/df827786d7a7fb0a0e2f27577af67e32d9a888a9/src/mac.c#lines-2337
ENCODE_FILE() is transparently called by many C functions, which means
`ucs-normalize-region` can be called at unpredictable timings, so I
think it should keep match data unchanged.
--
Akinori MUSHA / https://akinori.org/
0001-Save-match-data-in-ucs-normalize-region.patch
Description: Text document
signature.asc
Description: OpenPGP digital signature
- bug#37095: [PATCH] Save match data in ucs-normalize-region,
Akinori MUSHA <=