Change 29980 by [EMAIL PROTECTED] on 2007/01/25 21:15:39
Integrate:
[ 28144]
In Perl_Gv_AMupdate(), there's no need to call sv_unmagic() if we know
the magic isn't there.
[ 28145]
Simplify the non-printable name error reporting code in Perl_allocmy().
[ 28176]
Subject: [PATCH] Speed up utf8.c a bit
From: [EMAIL PROTECTED] (Andy Lester)
Date: Thu, 11 May 2006 22:41:01 -0500
Message-ID: <[EMAIL PROTECTED]>
[ 28178]
The upgrade/croak order in Perl_sv_utf8_encode() seemed utterly
backwards. It now checks for readonly *first*.
[ 28179]
Subject: [PATCH] Proper use of static funcs in toke.c and pp_sys.c
From: [EMAIL PROTECTED] (Andy Lester)
Date: Tue, 9 May 2006 12:27:30 -0500
Message-ID: <[EMAIL PROTECTED]>
[ 28180]
Subject: [PATCH] upgrade bytes_to_uni
From: [EMAIL PROTECTED] (Andy Lester)
Date: Fri, 12 May 2006 00:21:23 -0500
Message-ID: <[EMAIL PROTECTED]>
[ 28194]
Subject: [PATCH] S_reguni should return its length
From: [EMAIL PROTECTED] (Andy Lester)
Date: Sun, 14 May 2006 09:46:32 -0500
Message-ID: <[EMAIL PROTECTED]>
Affected files ...
... //depot/maint-5.8/perl/embed.fnc#190 integrate
... //depot/maint-5.8/perl/embed.h#143 integrate
... //depot/maint-5.8/perl/gv.c#92 integrate
... //depot/maint-5.8/perl/op.c#181 integrate
... //depot/maint-5.8/perl/pp_pack.c#50 integrate
... //depot/maint-5.8/perl/pp_sys.c#131 integrate
... //depot/maint-5.8/perl/proto.h#180 integrate
... //depot/maint-5.8/perl/regcomp.c#89 integrate
... //depot/maint-5.8/perl/sv.c#317 integrate
... //depot/maint-5.8/perl/toke.c#148 integrate
... //depot/maint-5.8/perl/utf8.c#71 integrate
... //depot/perl/warnings.h#35 edit
... //depot/perl/warnings.pl#56 edit
Differences ...
==== //depot/maint-5.8/perl/embed.fnc#190 (text) ====
Index: perl/embed.fnc
--- perl/embed.fnc#189~29974~ 2007-01-25 09:04:16.000000000 -0800
+++ perl/embed.fnc 2007-01-25 13:15:39.000000000 -0800
@@ -1179,6 +1179,7 @@
|char ender
s |const char *|get_num |NN const char *ppat|NN I32 *lenptr
sR |char * |sv_exp_grow |NN SV *sv|STRLEN needed
+sR |char * |bytes_to_uni |NN const U8 *start|STRLEN len|NN char *dest
#endif
#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
@@ -1237,7 +1238,7 @@
Es |regnode*|reganode |NN struct RExC_state_t *state|U8 op|U32 arg
Es |regnode*|regatom |NN struct RExC_state_t *state|NN I32 *flagp
Es |regnode*|regbranch |NN struct RExC_state_t *state|NN I32
*flagp|I32 first
-Es |void |reguni |NN const struct RExC_state_t *state|UV uv|NN
char *s|NN STRLEN *lenp
+Es |STRLEN |reguni |NN const struct RExC_state_t *state|UV uv|NN
char *s
Es |regnode*|regclass |NN struct RExC_state_t *state
ERsn |I32 |regcurly |NN const char *
Es |regnode*|reg_node |NN struct RExC_state_t *state|U8 op
@@ -1385,6 +1386,7 @@
# endif
# if defined(DEBUGGING)
s |int |tokereport |I32 rv
+s |void |printbuf |NN const char* fmt|NN const char* s
# endif
#endif
==== //depot/maint-5.8/perl/embed.h#143 (text+w) ====
Index: perl/embed.h
--- perl/embed.h#142~29974~ 2007-01-25 09:04:16.000000000 -0800
+++ perl/embed.h 2007-01-25 13:15:39.000000000 -0800
@@ -1188,6 +1188,7 @@
#define group_end S_group_end
#define get_num S_get_num
#define sv_exp_grow S_sv_exp_grow
+#define bytes_to_uni S_bytes_to_uni
#endif
#endif
#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
@@ -1416,6 +1417,7 @@
# if defined(DEBUGGING)
#ifdef PERL_CORE
#define tokereport S_tokereport
+#define printbuf S_printbuf
#endif
# endif
#endif
@@ -3271,6 +3273,7 @@
#define group_end(a,b,c) S_group_end(aTHX_ a,b,c)
#define get_num(a,b) S_get_num(aTHX_ a,b)
#define sv_exp_grow(a,b) S_sv_exp_grow(aTHX_ a,b)
+#define bytes_to_uni(a,b,c) S_bytes_to_uni(aTHX_ a,b,c)
#endif
#endif
#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
@@ -3341,7 +3344,7 @@
#define reganode(a,b,c) S_reganode(aTHX_ a,b,c)
#define regatom(a,b) S_regatom(aTHX_ a,b)
#define regbranch(a,b,c) S_regbranch(aTHX_ a,b,c)
-#define reguni(a,b,c,d) S_reguni(aTHX_ a,b,c,d)
+#define reguni(a,b,c) S_reguni(aTHX_ a,b,c)
#define regclass(a) S_regclass(aTHX_ a)
#define regcurly S_regcurly
#define reg_node(a,b) S_reg_node(aTHX_ a,b)
@@ -3498,6 +3501,7 @@
# if defined(DEBUGGING)
#ifdef PERL_CORE
#define tokereport(a) S_tokereport(aTHX_ a)
+#define printbuf(a,b) S_printbuf(aTHX_ a,b)
#endif
# endif
#endif
==== //depot/maint-5.8/perl/gv.c#92 (text) ====
Index: perl/gv.c
--- perl/gv.c#91~29971~ 2007-01-25 03:59:28.000000000 -0800
+++ perl/gv.c 2007-01-25 13:15:39.000000000 -0800
@@ -1447,13 +1447,16 @@
Perl_Gv_AMupdate(pTHX_ HV *stash)
{
MAGIC* const mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
- AMT * const amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL;
AMT amt;
- if (mg && amtp->was_ok_am == PL_amagic_generation
- && amtp->was_ok_sub == PL_sub_generation)
- return (bool)AMT_OVERLOADED(amtp);
- sv_unmagic((SV*)stash, PERL_MAGIC_overload_table);
+ if (mg) {
+ const AMT * const amtp = (AMT*)mg->mg_ptr;
+ if (amtp->was_ok_am == PL_amagic_generation
+ && amtp->was_ok_sub == PL_sub_generation) {
+ return (bool)AMT_OVERLOADED(amtp);
+ }
+ sv_unmagic((SV*)stash, PERL_MAGIC_overload_table);
+ }
DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package
%s\n",HvNAME_get(stash)) );
==== //depot/maint-5.8/perl/op.c#181 (text) ====
Index: perl/op.c
--- perl/op.c#180~29978~ 2007-01-25 13:01:04.000000000 -0800
+++ perl/op.c 2007-01-25 13:15:39.000000000 -0800
@@ -220,30 +220,11 @@
{
/* name[2] is true if strlen(name) > 2 */
if (!isPRINT(name[1]) || strchr("\t\n\r\f", name[1])) {
- /* 1999-02-27 [EMAIL PROTECTED] */
- char *p;
- p = strchr(name, '\0');
- assert(p);
- /* The next block assumes the buffer is at least 205 chars
- long. At present, it's always at least 256 chars. */
- if (p - name > 200) {
-#ifdef HAS_STRLCPY
- strlcpy(name + 200, "...", 4);
-#else
- strcpy(name + 200, "...");
-#endif
- p = name + 199;
- }
- else {
- p[1] = '\0';
- }
- /* Move everything else down one character */
- for (; p-name > 2; p--)
- *p = *(p-1);
- name[2] = toCTRL(name[1]);
- name[1] = '^';
+ yyerror(Perl_form(aTHX_ "Can't use global %c^%c%s in \"my\"",
+ name[0], toCTRL(name[1]), name + 2));
+ } else {
+ yyerror(Perl_form(aTHX_ "Can't use global %s in \"my\"",name));
}
- yyerror(Perl_form(aTHX_ "Can't use global %s in \"my\"",name));
}
/* check for duplicate declaration */
pad_check_dup(name, is_our, (PL_curstash ? PL_curstash : PL_defstash));
==== //depot/maint-5.8/perl/pp_pack.c#50 (text) ====
Index: perl/pp_pack.c
--- perl/pp_pack.c#49~29965~ 2007-01-24 16:07:28.000000000 -0800
+++ perl/pp_pack.c 2007-01-25 13:15:39.000000000 -0800
@@ -716,21 +716,21 @@
return TRUE;
}
-STATIC void
-bytes_to_uni(pTHX_ const U8 *start, STRLEN len, char **dest) {
- U8 buffer[UTF8_MAXLEN];
+STATIC char *
+S_bytes_to_uni(pTHX_ const U8 *start, STRLEN len, char *dest) {
const U8 * const end = start + len;
- char *d = *dest;
+
while (start < end) {
+ U8 buffer[UTF8_MAXLEN];
const int length =
uvuni_to_utf8_flags(buffer, NATIVE_TO_UNI(*start), 0) - buffer;
switch(length) {
case 1:
- *d++ = buffer[0];
+ *dest++ = buffer[0];
break;
case 2:
- *d++ = buffer[0];
- *d++ = buffer[1];
+ *dest++ = buffer[0];
+ *dest++ = buffer[1];
break;
default:
Perl_croak(aTHX_ "Perl bug: value %d UTF-8 expands to %d bytes",
@@ -738,12 +738,13 @@
}
start++;
}
- *dest = d;
+ return dest;
}
#define PUSH_BYTES(utf8, cur, buf, len) \
STMT_START { \
- if (utf8) bytes_to_uni(aTHX_ (U8 *) buf, len, &(cur)); \
+ if (utf8) \
+ (cur) = bytes_to_uni((U8 *) buf, len, (cur)); \
else { \
Copy(buf, cur, len, char); \
(cur) += (len); \
@@ -778,7 +779,7 @@
STMT_START { \
if (utf8) { \
const U8 au8 = (byte); \
- bytes_to_uni(aTHX_ &au8, 1, &(s)); \
+ (s) = bytes_to_uni(&au8, 1, (s)); \
} else *(U8 *)(s)++ = (byte); \
} STMT_END
@@ -3168,7 +3169,7 @@
len+(endb-buffer)*UTF8_EXPAND);
end = start+SvLEN(cat);
}
- bytes_to_uni(aTHX_ buffer, endb-buffer, &cur);
+ cur = bytes_to_uni(buffer, endb-buffer, cur);
} else {
if (cur >= end) {
*cur = '\0';
==== //depot/maint-5.8/perl/pp_sys.c#131 (text) ====
Index: perl/pp_sys.c
--- perl/pp_sys.c#130~29974~ 2007-01-25 09:04:16.000000000 -0800
+++ perl/pp_sys.c 2007-01-25 13:15:39.000000000 -0800
@@ -4597,7 +4597,7 @@
if (hent) {
PUSHs(sv_2mortal(newSVpv((char*)hent->h_name, 0)));
- PUSHs(S_space_join_names_mortal(aTHX_ hent->h_aliases));
+ PUSHs(space_join_names_mortal(hent->h_aliases));
PUSHs(sv_2mortal(newSViv((IV)hent->h_addrtype)));
len = hent->h_length;
PUSHs(sv_2mortal(newSViv((IV)len)));
@@ -4680,7 +4680,7 @@
if (nent) {
PUSHs(sv_2mortal(newSVpv(nent->n_name, 0)));
- PUSHs(S_space_join_names_mortal(aTHX_ nent->n_aliases));
+ PUSHs(space_join_names_mortal(nent->n_aliases));
PUSHs(sv_2mortal(newSViv((IV)nent->n_addrtype)));
PUSHs(sv_2mortal(newSViv((IV)nent->n_net)));
}
@@ -4741,7 +4741,7 @@
if (pent) {
PUSHs(sv_2mortal(newSVpv(pent->p_name, 0)));
- PUSHs(S_space_join_names_mortal(aTHX_ pent->p_aliases));
+ PUSHs(space_join_names_mortal(pent->p_aliases));
PUSHs(sv_2mortal(newSViv((IV)pent->p_proto)));
}
@@ -4811,7 +4811,7 @@
if (sent) {
PUSHs(sv_2mortal(newSVpv(sent->s_name, 0)));
- PUSHs(S_space_join_names_mortal(aTHX_ sent->s_aliases));
+ PUSHs(space_join_names_mortal(sent->s_aliases));
#ifdef HAS_NTOHS
PUSHs(sv_2mortal(newSViv((IV)PerlSock_ntohs(sent->s_port))));
#else
@@ -5228,7 +5228,7 @@
* but the gr_mem is poisonous anyway.
* So yes, you cannot get the list of group
* members if building multithreaded in UNICOS/mk. */
- PUSHs(S_space_join_names_mortal(aTHX_ grent->gr_mem));
+ PUSHs(space_join_names_mortal(grent->gr_mem));
#endif
}
==== //depot/maint-5.8/perl/proto.h#180 (text+w) ====
Index: perl/proto.h
--- perl/proto.h#179~29979~ 2007-01-25 13:01:25.000000000 -0800
+++ perl/proto.h 2007-01-25 13:15:39.000000000 -0800
@@ -1717,6 +1717,9 @@
STATIC char * S_sv_exp_grow(pTHX_ SV *sv, STRLEN needed)
__attribute__warn_unused_result__;
+STATIC char * S_bytes_to_uni(pTHX_ const U8 *start, STRLEN len, char *dest)
+ __attribute__warn_unused_result__;
+
#endif
#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
@@ -1808,7 +1811,7 @@
STATIC regnode* S_reganode(pTHX_ struct RExC_state_t *state, U8 op, U32
arg);
STATIC regnode* S_regatom(pTHX_ struct RExC_state_t *state, I32 *flagp);
STATIC regnode* S_regbranch(pTHX_ struct RExC_state_t *state, I32
*flagp, I32 first);
-STATIC void S_reguni(pTHX_ const struct RExC_state_t *state, UV uv, char
*s, STRLEN *lenp);
+STATIC STRLEN S_reguni(pTHX_ const struct RExC_state_t *state, UV uv, char
*s);
STATIC regnode* S_regclass(pTHX_ struct RExC_state_t *state);
STATIC I32 S_regcurly(const char *)
__attribute__warn_unused_result__;
@@ -2002,6 +2005,7 @@
# endif
# if defined(DEBUGGING)
STATIC int S_tokereport(pTHX_ I32 rv);
+STATIC void S_printbuf(pTHX_ const char* fmt, const char* s);
# endif
#endif
==== //depot/maint-5.8/perl/regcomp.c#89 (text) ====
Index: perl/regcomp.c
--- perl/regcomp.c#88~29964~ 2007-01-24 15:53:28.000000000 -0800
+++ perl/regcomp.c 2007-01-25 13:15:39.000000000 -0800
@@ -3209,8 +3209,6 @@
if (len)
p = oldp;
else if (UTF) {
- STRLEN unilen;
-
if (FOLD) {
/* Emit all the Unicode characters. */
STRLEN numlen;
@@ -3219,7 +3217,7 @@
foldlen -= numlen) {
ender = utf8_to_uvchr(foldbuf, &numlen);
if (numlen > 0) {
- reguni(pRExC_state, ender, s, &unilen);
+ const STRLEN unilen =
reguni(pRExC_state, ender, s);
s += unilen;
len += unilen;
/* In EBCDIC the numlen
@@ -3233,7 +3231,7 @@
}
}
else {
- reguni(pRExC_state, ender, s, &unilen);
+ const STRLEN unilen = reguni(pRExC_state, ender,
s);
if (unilen > 0) {
s += unilen;
len += unilen;
@@ -3247,8 +3245,6 @@
break;
}
if (UTF) {
- STRLEN unilen;
-
if (FOLD) {
/* Emit all the Unicode characters. */
STRLEN numlen;
@@ -3257,7 +3253,7 @@
foldlen -= numlen) {
ender = utf8_to_uvchr(foldbuf, &numlen);
if (numlen > 0) {
- reguni(pRExC_state, ender, s, &unilen);
+ const STRLEN unilen = reguni(pRExC_state,
ender, s);
len += unilen;
s += unilen;
/* In EBCDIC the numlen
@@ -3271,7 +3267,7 @@
}
}
else {
- reguni(pRExC_state, ender, s, &unilen);
+ const STRLEN unilen = reguni(pRExC_state, ender, s);
if (unilen > 0) {
s += unilen;
len += unilen;
@@ -4429,10 +4425,10 @@
/*
- reguni - emit (if appropriate) a Unicode character
*/
-STATIC void
-S_reguni(pTHX_ const RExC_state_t *pRExC_state, UV uv, char* s, STRLEN* lenp)
+STATIC STRLEN
+S_reguni(pTHX_ const RExC_state_t *pRExC_state, UV uv, char* s)
{
- *lenp = SIZE_ONLY ? UNISKIP(uv) : (uvchr_to_utf8((U8*)s, uv) - (U8*)s);
+ return SIZE_ONLY ? UNISKIP(uv) : (uvchr_to_utf8((U8*)s, uv) - (U8*)s);
}
/*
==== //depot/maint-5.8/perl/sv.c#317 (text) ====
Index: perl/sv.c
--- perl/sv.c#316~29974~ 2007-01-25 09:04:16.000000000 -0800
+++ perl/sv.c 2007-01-25 13:15:39.000000000 -0800
@@ -3007,13 +3007,13 @@
void
Perl_sv_utf8_encode(pTHX_ register SV *sv)
{
- (void) sv_utf8_upgrade(sv);
if (SvIsCOW(sv)) {
sv_force_normal_flags(sv, 0);
}
if (SvREADONLY(sv)) {
Perl_croak(aTHX_ PL_no_modify);
}
+ (void) sv_utf8_upgrade(sv);
SvUTF8_off(sv);
}
==== //depot/maint-5.8/perl/toke.c#148 (text) ====
Index: perl/toke.c
--- perl/toke.c#147~29964~ 2007-01-24 15:53:28.000000000 -0800
+++ perl/toke.c 2007-01-25 13:15:39.000000000 -0800
@@ -3084,9 +3084,7 @@
if (strnEQ(s,"=>",2)) {
s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
- DEBUG_T( { S_printbuf(aTHX_
- "### Saw unary minus before =>, forcing word %s\n", s);
- } );
+ DEBUG_T( { printbuf("### Saw unary minus before =>, forcing
word %s\n", s); } );
OPERATOR('-'); /* unary minus */
}
PL_last_uni = PL_oldbufptr;
@@ -3966,14 +3964,14 @@
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
s = scan_num(s, &yylval);
- DEBUG_T( { S_printbuf(aTHX_ "### Saw number in %s\n", s); } );
+ DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
if (PL_expect == XOPERATOR)
no_op("Number",s);
TERM(THING);
case '\'':
s = scan_str(s,FALSE,FALSE);
- DEBUG_T( { S_printbuf(aTHX_ "### Saw string before %s\n", s); } );
+ DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
if (PL_expect == XOPERATOR) {
if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
PL_expect = XTERM;
@@ -3990,7 +3988,7 @@
case '"':
s = scan_str(s,FALSE,FALSE);
- DEBUG_T( { S_printbuf(aTHX_ "### Saw string before %s\n", s); } );
+ DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
if (PL_expect == XOPERATOR) {
if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
PL_expect = XTERM;
@@ -4015,7 +4013,7 @@
case '`':
s = scan_str(s,FALSE,FALSE);
- DEBUG_T( { S_printbuf(aTHX_ "### Saw backtick string before %s\n", s);
} );
+ DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
if (PL_expect == XOPERATOR)
no_op("Backticks",s);
if (!s)
==== //depot/maint-5.8/perl/utf8.c#71 (text) ====
Index: perl/utf8.c
--- perl/utf8.c#70~29964~ 2007-01-24 15:53:28.000000000 -0800
+++ perl/utf8.c 2007-01-25 13:15:39.000000000 -0800
@@ -332,13 +332,12 @@
const U8* x = s;
const U8* send;
STRLEN c;
+ STRLEN outlen = 0;
PERL_UNUSED_CONTEXT;
if (!len)
len = strlen((const char *)s);
send = s + len;
- if (el)
- *el = 0;
while (x < send) {
/* Inline the easy bits of is_utf8_char() here for speed... */
@@ -362,17 +361,16 @@
goto out;
}
x += c;
- if (el)
- (*el)++;
+ outlen++;
}
out:
+ if (el)
+ *el = outlen;
+
if (ep)
*ep = x;
- if (x != send)
- return FALSE;
-
- return TRUE;
+ return (x == send);
}
/*
==== //depot/perl/warnings.h#35 (text+w) ====
Index: perl/warnings.h
--- perl/warnings.h#34~29717~ 2007-01-08 02:35:04.000000000 -0800
+++ perl/warnings.h 2007-01-25 13:15:39.000000000 -0800
@@ -25,7 +25,7 @@
(x) == pWARN_NONE)
/* if PL_warnhook is set to this value, then warnings die */
-#define PERL_WARNHOOK_FATAL (((SV*)0) + 1)
+#define PERL_WARNHOOK_FATAL (&PL_sv_placeholder)
/* Warnings Categories added in Perl 5.008 */
==== //depot/perl/warnings.pl#56 (text) ====
Index: perl/warnings.pl
--- perl/warnings.pl#55~29717~ 2007-01-08 02:35:04.000000000 -0800
+++ perl/warnings.pl 2007-01-25 13:15:39.000000000 -0800
@@ -284,7 +284,7 @@
(x) == pWARN_NONE)
/* if PL_warnhook is set to this value, then warnings die */
-#define PERL_WARNHOOK_FATAL (((SV*)0) + 1)
+#define PERL_WARNHOOK_FATAL (&PL_sv_placeholder)
EOM
my $offset = 0 ;
End of Patch.