Change 27536 by [EMAIL PROTECTED] on 2006/03/17 19:37:41
Properly set/reset the UTF-8 length cache in regcomp.c.
Affected files ...
... //depot/perl/regcomp.c#405 edit
... //depot/perl/sv.c#1188 edit
Differences ...
==== //depot/perl/regcomp.c#405 (text) ====
Index: perl/regcomp.c
--- perl/regcomp.c#404~27334~ 2006-02-27 03:06:30.000000000 -0800
+++ perl/regcomp.c 2006-03-17 11:37:41.000000000 -0800
@@ -478,7 +478,7 @@
SV * const sv = data->last_found;
MAGIC * const mg =
SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
- if (mg && mg->mg_len > 0)
+ if (mg)
mg->mg_len = 0;
}
data->last_end = -1;
@@ -1978,6 +1978,8 @@
? I32_MAX : data->pos_min + data->pos_delta;
}
sv_catpvn(data->last_found, STRING(scan), STR_LEN(scan));
+ if (UTF)
+ SvUTF8_on(data->last_found);
{
SV * const sv = data->last_found;
MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
@@ -1986,8 +1988,6 @@
mg->mg_len += utf8_length((U8*)STRING(scan),
(U8*)STRING(scan)+STR_LEN(scan));
}
- if (UTF)
- SvUTF8_on(data->last_found);
data->last_end = data->pos_min + l;
data->pos_min += l; /* As in the first entry. */
data->flags &= ~SF_BEFORE_EOL;
@@ -2383,7 +2383,13 @@
the group. */
scan_commit(pRExC_state,data);
if (mincount && last_str) {
- sv_setsv(data->last_found, last_str);
+ SV *sv = data->last_found;
+ MAGIC *mg = SvUTF8(sv) && SvMAGICAL(sv) ?
+ mg_find(sv, PERL_MAGIC_utf8) : NULL;
+
+ if (mg)
+ mg->mg_len = -1;
+ sv_setsv(sv, last_str);
data->last_end = data->pos_min;
data->last_start_min =
data->pos_min - CHR_SVLEN(last_str);
==== //depot/perl/sv.c#1188 (text) ====
Index: perl/sv.c
--- perl/sv.c#1187~27533~ 2006-03-17 05:38:34.000000000 -0800
+++ perl/sv.c 2006-03-17 11:37:41.000000000 -0800
@@ -5289,7 +5289,7 @@
const U8 *s = (U8*)SvPV_const(sv, len);
MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
- if (mg && mg->mg_len != -1 && (mg->mg_len > 0 || len == 0)) {
+ if (mg && mg->mg_len != -1) {
ulen = mg->mg_len;
#ifdef PERL_UTF8_CACHE_ASSERT
assert(ulen == Perl_utf8_length(aTHX_ s, s + len));
@@ -5326,8 +5326,10 @@
bool found = FALSE;
if (SvMAGICAL(sv) && !SvREADONLY(sv)) {
- if (!*mgp)
+ if (!*mgp) {
*mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8,
0, 0);
+ (*mgp)->mg_len = -1;
+ }
assert(*mgp);
if ((*mgp)->mg_ptr)
@@ -5445,7 +5447,7 @@
}
#ifdef PERL_UTF8_CACHE_ASSERT
if (found) {
- U8 *s = start;
+ const U8 *s = start;
I32 n = uoff;
while (n-- && s < send)
@@ -5649,6 +5651,7 @@
if (!mg) {
sv_magic(sv, 0, PERL_MAGIC_utf8, 0, 0);
mg = mg_find(sv, PERL_MAGIC_utf8);
+ mg->mg_len = -1;
}
assert(mg);
End of Patch.