* Possible bug in `match-string` in 24.4.50.18?
@ 2014-05-25 4:33 Alexis
2014-05-25 13:35 ` Eli Zaretskii
2014-05-25 20:02 ` Stefan Monnier
0 siblings, 2 replies; 8+ messages in thread
From: Alexis @ 2014-05-25 4:33 UTC (permalink / raw
To: emacs-devel
Hi all,
i couldn't see any reference to this issue in the bug-gnu-emacs archives of
recent weeks.
Take the following code:
(setq address "mailto:alexis@example.com")
(setq re "mailto")
(string-match re address)
(match-string 0 address)
In 24.3, the call to `string-match` correctly returns 0, and the call to
`match-string` correctly returns "mailto".
In 24.4.50.18 (more specifically, git commit
08005cbfff9227ac73cbee5f3f5afa65f8c27849), the call to `string-match`
correctly returns 0, but the call to `match-string` consistently returns
"m" instead of "mailto".
Am i doing something wrong, is there an issue with my local setup, or is
this a bug?
Alexis.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Possible bug in `match-string` in 24.4.50.18?
2014-05-25 4:33 Possible bug in `match-string` in 24.4.50.18? Alexis
@ 2014-05-25 13:35 ` Eli Zaretskii
2014-05-26 0:01 ` Alexis
2014-05-25 20:02 ` Stefan Monnier
1 sibling, 1 reply; 8+ messages in thread
From: Eli Zaretskii @ 2014-05-25 13:35 UTC (permalink / raw
To: Alexis; +Cc: emacs-devel
> From: Alexis <flexibeast@gmail.com>
> Date: Sun, 25 May 2014 14:33:22 +1000
>
> (setq address "mailto:alexis@example.com")
> (setq re "mailto")
> (string-match re address)
> (match-string 0 address)
>
> In 24.3, the call to `string-match` correctly returns 0, and the call to
> `match-string` correctly returns "mailto".
>
> In 24.4.50.18 (more specifically, git commit
> 08005cbfff9227ac73cbee5f3f5afa65f8c27849), the call to `string-match`
> correctly returns 0, but the call to `match-string` consistently returns
> "m" instead of "mailto".
>
> Am i doing something wrong, is there an issue with my local setup, or is
> this a bug?
I cannot reproduce this with today's trunk. Does it happen to you in
"emacs -Q"?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Possible bug in `match-string` in 24.4.50.18?
2014-05-25 4:33 Possible bug in `match-string` in 24.4.50.18? Alexis
2014-05-25 13:35 ` Eli Zaretskii
@ 2014-05-25 20:02 ` Stefan Monnier
2014-05-26 0:22 ` Alexis
1 sibling, 1 reply; 8+ messages in thread
From: Stefan Monnier @ 2014-05-25 20:02 UTC (permalink / raw
To: Alexis; +Cc: emacs-devel
> Take the following code:
> (setq address "mailto:alexis@example.com")
> (setq re "mailto")
> (string-match re address)
> (match-string 0 address)
These are 4 separate expressions. How do you run them?
My crystal ball says that the problem is the code you unknowingly run
between each one of those expressions. If you run them as a single
expression such as
(let ((address "mailto:alexis@example.com")
(re "mailto"))
(if (string-match re address)
(match-string 0 address)))
I'm pretty sure you'll get what you want.
Stefan
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Possible bug in `match-string` in 24.4.50.18?
2014-05-25 13:35 ` Eli Zaretskii
@ 2014-05-26 0:01 ` Alexis
0 siblings, 0 replies; 8+ messages in thread
From: Alexis @ 2014-05-26 0:01 UTC (permalink / raw
To: emacs-devel
Eli Zaretskii <eliz@gnu.org> writes:
>> From: Alexis <flexibeast@gmail.com>
>> Date: Sun, 25 May 2014 14:33:22 +1000
>>
>> (setq address "mailto:alexis@example.com")
>> (setq re "mailto")
>> (string-match re address)
>> (match-string 0 address)
>>
>> In 24.3, the call to `string-match` correctly returns 0, and the call to
>> `match-string` correctly returns "mailto".
>>
>> In 24.4.50.18 (more specifically, git commit
>> 08005cbfff9227ac73cbee5f3f5afa65f8c27849), the call to `string-match`
>> correctly returns 0, but the call to `match-string` consistently returns
>> "m" instead of "mailto".
>>
>> Am i doing something wrong, is there an issue with my local setup, or is
>> this a bug?
>
> I cannot reproduce this with today's trunk. Does it happen to you in
> "emacs -Q"?
It does; the above results were derived from running both 24.4.50.18 and
24.3 with the -Q option. However, putting the code inside a `let` as
suggested by Stefan does result in the correct output being produced.
Alexis.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Possible bug in `match-string` in 24.4.50.18?
2014-05-25 20:02 ` Stefan Monnier
@ 2014-05-26 0:22 ` Alexis
2014-05-26 17:45 ` Stefan Monnier
0 siblings, 1 reply; 8+ messages in thread
From: Alexis @ 2014-05-26 0:22 UTC (permalink / raw
To: emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> Take the following code:
>
>> (setq address "mailto:alexis@example.com")
>> (setq re "mailto")
>> (string-match re address)
>> (match-string 0 address)
>
> These are 4 separate expressions. How do you run them?
i was playing around in *scratch*, to test out various regular
expressions on my data, and did a C-x C-e after each line. The above was
the result of whittling down the problem to the simplest case i could
find that exhibited the problem. There was nothing else in the buffer,
and as i noted to Eli, i was indeed running with the -Q option.
> My crystal ball says that the problem is the code you unknowingly run
> between each one of those expressions. If you run them as a single
> expression such as
>
> (let ((address "mailto:alexis@example.com")
> (re "mailto"))
> (if (string-match re address)
> (match-string 0 address)))
>
> I'm pretty sure you'll get what you want.
It seems you're right. :-) Thank you!
i now note that this situation is indeed described in the GNU Emacs Lisp
Reference Manual:
"Notice that all functions are allowed to overwrite the match data
unless they're explicitly documented not to do so. A consequence is that
functions that are run implicitly in the background (see Timers, and
Idle Timers) should likely save and restore the match data explicitly."
.... which i hadn't read because i'd only been reading section "34.6.2
Simple Match Data Access":
"Every successful search sets the match data. Therefore, you should
query the match data immediately after searching, before calling any
other function that might perform another search."
.... which is what i thought my code was doing.
Since the latter text is from a reference manual which, i suspect, other
people will often use by simply reading specific function documentation,
could i suggest adding to the latter text something along the lines of:
"Note that all functions are allowed to overwrite the match data unless
they're explicitly documented not to do so. A consequence is that
functions that are run implicitly in the background might overwrite your
match data unless you wrap your matching function (e.g. string-match)
and match-string together in a let."
Thanks again!
Alexis.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Possible bug in `match-string` in 24.4.50.18?
2014-05-26 0:22 ` Alexis
@ 2014-05-26 17:45 ` Stefan Monnier
2014-05-26 18:54 ` David Kastrup
2014-05-27 8:20 ` Alexis
0 siblings, 2 replies; 8+ messages in thread
From: Stefan Monnier @ 2014-05-26 17:45 UTC (permalink / raw
To: Alexis; +Cc: emacs-devel
>> These are 4 separate expressions. How do you run them?
> i was playing around in *scratch*, to test out various regular
> expressions on my data, and did a C-x C-e after each line.
C-x C-e itself might overwrite the match data while looking at the
buffer to decide what to evaluate. And after running that command, tons
of other code is run, such as post-command-hook, process-filters,
timers, pre-redisplay-function and whatnot, all of which will gladly
overwrite the match-data.
Stefan
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Possible bug in `match-string` in 24.4.50.18?
2014-05-26 17:45 ` Stefan Monnier
@ 2014-05-26 18:54 ` David Kastrup
2014-05-27 8:20 ` Alexis
1 sibling, 0 replies; 8+ messages in thread
From: David Kastrup @ 2014-05-26 18:54 UTC (permalink / raw
To: emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>>> These are 4 separate expressions. How do you run them?
>> i was playing around in *scratch*, to test out various regular
>> expressions on my data, and did a C-x C-e after each line.
>
> C-x C-e itself might overwrite the match data while looking at the
> buffer to decide what to evaluate. And after running that command, tons
> of other code is run, such as post-command-hook, process-filters,
> timers, pre-redisplay-function and whatnot, all of which will gladly
> overwrite the match-data.
Most but possibly not all of them are run in an implicit
save-match-data.
--
David Kastrup
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Possible bug in `match-string` in 24.4.50.18?
2014-05-26 17:45 ` Stefan Monnier
2014-05-26 18:54 ` David Kastrup
@ 2014-05-27 8:20 ` Alexis
1 sibling, 0 replies; 8+ messages in thread
From: Alexis @ 2014-05-27 8:20 UTC (permalink / raw
To: emacs-devel
Stefan Monnier writes:
>>> These are 4 separate expressions. How do you run them?
>> i was playing around in *scratch*, to test out various regular
>> expressions on my data, and did a C-x C-e after each line.
>
> C-x C-e itself might overwrite the match data while looking at the
> buffer to decide what to evaluate.
Oh okay.
> And after running that command, tons
> of other code is run, such as post-command-hook, process-filters,
> timers, pre-redisplay-function and whatnot, all of which will gladly
> overwrite the match-data.
*nod* - Thanks for explaining!
Alexis.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2014-05-27 8:20 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-25 4:33 Possible bug in `match-string` in 24.4.50.18? Alexis
2014-05-25 13:35 ` Eli Zaretskii
2014-05-26 0:01 ` Alexis
2014-05-25 20:02 ` Stefan Monnier
2014-05-26 0:22 ` Alexis
2014-05-26 17:45 ` Stefan Monnier
2014-05-26 18:54 ` David Kastrup
2014-05-27 8:20 ` Alexis
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.