Change 14908 by jhi@alpha on 2002/02/28 05:43:45
Make shared hash keys to be \0-terminated:
one possible resolution for
"UTF-8, weird \w behaviour after HASH-KEY-ification"
http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2002-01/msg01327.html
The hash keys were shared (the SvLEN(sv) = 0 was the giveaway).
The hash keys weren't \0-terminated. This meant that the EOL ($)
in regmatch() got the nextchr beyond the last character. Since
the keys were UTF-8, the nextchr was \1, not the usual
string-terminating \0. Wham, no match.
I think another possible resolution could be to stop the nextchr
computation in regmatch() from peeking beyond the last character
of the string:
nextchr = locinput < PL_regeol ? UCHARAT(locinput) : 0;
Affected files ...
.... //depot/perl/hv.c#100 edit
.... //depot/perl/hv.h#30 edit
Differences ...
==== //depot/perl/hv.c#100 (text) ====
Index: perl/hv.c
--- perl/hv.c.~1~ Wed Feb 27 23:00:05 2002
+++ perl/hv.c Wed Feb 27 23:00:05 2002
@@ -85,9 +85,10 @@
is_utf8 = TRUE;
}
- New(54, k, HEK_BASESIZE + len + 1, char);
+ New(54, k, HEK_BASESIZE + len + 2, char);
hek = (HEK*)k;
Copy(str, HEK_KEY(hek), len, char);
+ HEK_KEY(hek)[len] = 0;
HEK_LEN(hek) = len;
HEK_HASH(hek) = hash;
HEK_UTF8(hek) = (char)is_utf8;
==== //depot/perl/hv.h#30 (text) ====
Index: perl/hv.h
--- perl/hv.h.~1~ Wed Feb 27 23:00:05 2002
+++ perl/hv.h Wed Feb 27 23:00:05 2002
@@ -23,6 +23,8 @@
U32 hek_hash; /* hash of key */
I32 hek_len; /* length of hash key */
char hek_key[1]; /* variable-length hash key */
+ /* the hash-key is \0-terminated */
+ /* after the \0 there is a byte telling whether the key is UTF8 */
};
/* hash structure: */
@@ -211,7 +213,7 @@
#define HEK_HASH(hek) (hek)->hek_hash
#define HEK_LEN(hek) (hek)->hek_len
#define HEK_KEY(hek) (hek)->hek_key
-#define HEK_UTF8(hek) (*(HEK_KEY(hek)+HEK_LEN(hek)))
+#define HEK_UTF8(hek) (*(HEK_KEY(hek)+HEK_LEN(hek)+1))
/* calculate HV array allocation */
#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
End of Patch.