From: Eli Zaretskii <eliz@gnu.org>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: 11073@debbugs.gnu.org
Subject: bug#11073: 24.0.94; BIDI-related crash in redisplay with certain byte sequences
Date: Fri, 23 Mar 2012 17:58:25 +0200 [thread overview]
Message-ID: <83fwczux5q.fsf@gnu.org> (raw)
In-Reply-To: <jwvvclvl7fx.fsf-monnier+emacs@gnu.org>
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: 11073@debbugs.gnu.org
> Date: Fri, 23 Mar 2012 10:27:39 -0400
>
> > (Repeat after me: FETCH_MULTIBYTE_CHAR followed by CHAR_BYTES is not
> > always equivalent to STRING_CHAR_AND_LENGTH.)
>
> Do we really absolutely have to have such a trap?
> I mean: is there a good reason why they're not always equivalent?
They are not equivalent when conversion of the multibyte form into a
character unifies a CJK character that is represented by a codepoint
from one of the private use areas. This unification is done in
char_string, via a call to MAYBE_UNIFY_CHAR, which converts the
private codepoint into the equivalent codepoint in one of the "normal"
planes. The UTF-8 encoding of the unified character can be shorter or
longer than the original multibyte sequence. The problem with the
code I had in bidi.c, viz.:
character = FETCH_MULTIBYTE_CHAR (bytepos);
char_len = CHAR_BYTES (character);
is that the value in `character' is not guaranteed to correspond to
the multibyte sequence consumed by FETCH_MULTIBYTE_CHAR, and therefore
that character's length as returned by CHAR_BYTES is not the right
instrument to advance to the next character.
So, I'd say that FETCH_MULTIBYTE_CHAR should only be used for fetching
a single character; if one wants to advance, one should either use
FETCH_CHAR_ADVANCE or (if they are paranoiac about speed, like I am)
use
character = STRING_CHAR_AND_LENGTH (BYTE_POS_ADDR (bytepos), length);
which returns the length of the consumed sequence, and use that to
advance to the next character position.
And note the other gotcha: that the length returned by
STRING_CHAR_AND_LENGTH is not necessarily the length of the UTF-8
encoding of the character it returns, but rather the length of the
multibyte sequence which was converted to the character.
next prev parent reply other threads:[~2012-03-23 15:58 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-23 10:55 bug#11073: 24.0.94; BIDI-related crash in redisplay with certain byte sequences Eli Zaretskii
2012-03-23 12:35 ` Eli Zaretskii
2012-03-23 14:27 ` Stefan Monnier
2012-03-23 15:58 ` Eli Zaretskii [this message]
2012-03-23 17:34 ` Stefan Monnier
2012-03-23 18:46 ` Eli Zaretskii
2012-03-26 7:45 ` Kenichi Handa
2012-03-26 12:23 ` Stefan Monnier
2012-03-29 5:19 ` Kenichi Handa
2012-03-29 16:04 ` Stefan Monnier
2012-04-03 2:22 ` Kenichi Handa
2012-04-03 4:22 ` Stefan Monnier
2012-04-03 5:55 ` Kenichi Handa
2012-04-03 13:02 ` Stefan Monnier
2012-04-04 0:07 ` Kenichi Handa
2012-04-04 1:17 ` Stefan Monnier
2012-04-06 1:13 ` Kenichi Handa
2012-04-06 13:13 ` Eli Zaretskii
2012-04-09 4:14 ` Kenichi Handa
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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=83fwczux5q.fsf@gnu.org \
--to=eliz@gnu.org \
--cc=11073@debbugs.gnu.org \
--cc=monnier@iro.umontreal.ca \
/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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).