Change 23665 by [EMAIL PROTECTED] on 2004/12/21 18:26:15
Integrate:
[ 23587]
Tidy up the reference name stringification to save getting the
hash name twice. Pleasant side effect is 44 byte smaller object
file. (A small win is still a win)
[ 23602]
Pull out the duplicateded push @INC, $_ if -e $_ code from
S_pushinc into a new function S_pushinc_if_exists
Avoid the SV copy when pushing onto @INC by creating a new scratch
SV each time a push is done.
[ 23603]
Fix a typo in an assert(). It helps to compile with -DDEBUGGING
[ 23604]
There are clearer ways of saying m/^[ab]$/ than strchr("ab", c)
They seem to produce slightly smaller object code too.
[ 23605]
Small code tidy up in gv_fullname4
[ 23606]
use (c == '$' || c == '@' || c == '%') instead of strchr("[EMAIL
PROTECTED]", c)
The latter gives larger code, is less clear and can't be any faster
[ 23607]
Remove double checking of acceptable switches on tr/// ops.
[ 23609]
gv_fullname4() can get rid of the main:: for us.
(well, actually, it never puts it in)
[ 23612]
Turn gv_fullname3 and gv_efullname3 into macros that call
gv_fullname4 and gv_efullname4 directly, saving overhead.
[ 23614]
Remove spurious semicolons
(As these 2 are spare, I guess I should send them to Mark Rhodes
(former office mate) as he often said that he kept mislaying his)
[ 23617]
Break out setting $^X into its own static function S_set_caret_X
[ 23623]
Revert part of the change to gv_fullname4(), as the change seems to
be fractionally slower. Re-investigation prompted by a comment from
Tim Bunce, who seems to be more on the ball than I am.
[ 23626]
Avoid getting the stash name twice (at least visually, if not also
in the generated code)
Affected files ...
... //depot/maint-5.8/perl/embed.fnc#56 integrate
... //depot/maint-5.8/perl/embed.h#53 integrate
... //depot/maint-5.8/perl/gv.c#22 integrate
... //depot/maint-5.8/perl/gv.h#5 integrate
... //depot/maint-5.8/perl/op.c#69 integrate
... //depot/maint-5.8/perl/perl.c#94 integrate
... //depot/maint-5.8/perl/proto.h#47 integrate
... //depot/maint-5.8/perl/sv.c#119 integrate
... //depot/maint-5.8/perl/toke.c#51 integrate
Differences ...
==== //depot/maint-5.8/perl/embed.fnc#56 (text) ====
Index: perl/embed.fnc
--- perl/embed.fnc#55~23585~ Wed Dec 1 05:52:46 2004
+++ perl/embed.fnc Tue Dec 21 10:26:15 2004
@@ -258,7 +258,7 @@
|I32 method
Ap |void |gv_check |HV* stash
Ap |void |gv_efullname |SV* sv|GV* gv
-Ap |void |gv_efullname3 |SV* sv|GV* gv|const char* prefix
+Amb |void |gv_efullname3 |SV* sv|GV* gv|const char* prefix
Ap |void |gv_efullname4 |SV* sv|GV* gv|const char* prefix|bool keepmain
Ap |GV* |gv_fetchfile |const char* name
Apd |GV* |gv_fetchmeth |HV* stash|const char* name|STRLEN len \
@@ -270,7 +270,7 @@
|I32 autoload
Ap |GV* |gv_fetchpv |const char* name|I32 add|I32 sv_type
Ap |void |gv_fullname |SV* sv|GV* gv
-Ap |void |gv_fullname3 |SV* sv|GV* gv|const char* prefix
+Amb |void |gv_fullname3 |SV* sv|GV* gv|const char* prefix
Ap |void |gv_fullname4 |SV* sv|GV* gv|const char* prefix|bool keepmain
Ap |void |gv_init |GV* gv|HV* stash|const char* name \
|STRLEN len|int multi
==== //depot/maint-5.8/perl/embed.h#53 (text+w) ====
Index: perl/embed.h
--- perl/embed.h#52~23582~ Wed Dec 1 05:28:06 2004
+++ perl/embed.h Tue Dec 21 10:26:15 2004
@@ -322,7 +322,6 @@
#define gv_autoload4 Perl_gv_autoload4
#define gv_check Perl_gv_check
#define gv_efullname Perl_gv_efullname
-#define gv_efullname3 Perl_gv_efullname3
#define gv_efullname4 Perl_gv_efullname4
#define gv_fetchfile Perl_gv_fetchfile
#define gv_fetchmeth Perl_gv_fetchmeth
@@ -331,7 +330,6 @@
#define gv_fetchmethod_autoload Perl_gv_fetchmethod_autoload
#define gv_fetchpv Perl_gv_fetchpv
#define gv_fullname Perl_gv_fullname
-#define gv_fullname3 Perl_gv_fullname3
#define gv_fullname4 Perl_gv_fullname4
#define gv_init Perl_gv_init
#define gv_stashpv Perl_gv_stashpv
@@ -2857,7 +2855,6 @@
#define gv_autoload4(a,b,c,d) Perl_gv_autoload4(aTHX_ a,b,c,d)
#define gv_check(a) Perl_gv_check(aTHX_ a)
#define gv_efullname(a,b) Perl_gv_efullname(aTHX_ a,b)
-#define gv_efullname3(a,b,c) Perl_gv_efullname3(aTHX_ a,b,c)
#define gv_efullname4(a,b,c,d) Perl_gv_efullname4(aTHX_ a,b,c,d)
#define gv_fetchfile(a) Perl_gv_fetchfile(aTHX_ a)
#define gv_fetchmeth(a,b,c,d) Perl_gv_fetchmeth(aTHX_ a,b,c,d)
@@ -2866,7 +2863,6 @@
#define gv_fetchmethod_autoload(a,b,c) Perl_gv_fetchmethod_autoload(aTHX_
a,b,c)
#define gv_fetchpv(a,b,c) Perl_gv_fetchpv(aTHX_ a,b,c)
#define gv_fullname(a,b) Perl_gv_fullname(aTHX_ a,b)
-#define gv_fullname3(a,b,c) Perl_gv_fullname3(aTHX_ a,b,c)
#define gv_fullname4(a,b,c,d) Perl_gv_fullname4(aTHX_ a,b,c,d)
#define gv_init(a,b,c,d,e) Perl_gv_init(aTHX_ a,b,c,d,e)
#define gv_stashpv(a,b) Perl_gv_stashpv(aTHX_ a,b)
==== //depot/maint-5.8/perl/gv.c#22 (text) ====
Index: perl/gv.c
--- perl/gv.c#21~23625~ Tue Dec 7 15:09:13 2004
+++ perl/gv.c Tue Dec 21 10:26:15 2004
@@ -751,7 +751,8 @@
sv_type != SVt_PVGV &&
sv_type != SVt_PVFM &&
sv_type != SVt_PVIO &&
- !(len == 1 && sv_type == SVt_PV && strchr("ab",*name)) )
+ !(len == 1 && sv_type == SVt_PV &&
+ (*name == 'a' || *name == 'b')) )
{
gvp = (GV**)hv_fetch(stash,name,len,0);
if (!gvp ||
@@ -1103,10 +1104,10 @@
}
sv_setpv(sv, prefix ? prefix : "");
- if (!HvNAME(hv))
+ name = HvNAME(hv);
+ if (!name)
name = "__ANON__";
- else
- name = HvNAME(hv);
+
if (keepmain || strNE(name, "main")) {
sv_catpv(sv,name);
sv_catpvn(sv,"::", 2);
==== //depot/maint-5.8/perl/gv.h#5 (text) ====
Index: perl/gv.h
--- perl/gv.h#4~19400~ Sun May 4 01:29:43 2003
+++ perl/gv.h Tue Dec 21 10:26:15 2004
@@ -153,3 +153,6 @@
#define GV_ADDWARN 0x04 /* add, but warn if symbol wasn't already there
*/
#define GV_ADDINEVAL 0x08 /* add, as though we're doing so within an eval
*/
#define GV_NOINIT 0x10 /* add, but don't init symbol, if type != PVGV
*/
+
+#define gv_fullname3(sv,gv,prefix) gv_fullname4(sv,gv,prefix,TRUE)
+#define gv_efullname3(sv,gv,prefix) gv_efullname4(sv,gv,prefix,TRUE)
==== //depot/maint-5.8/perl/op.c#69 (text) ====
Index: perl/op.c
--- perl/op.c#68~23582~ Wed Dec 1 05:28:06 2004
+++ perl/op.c Tue Dec 21 10:26:15 2004
@@ -6264,9 +6264,7 @@
OP *sibling = o2->op_sibling;
SV *n = newSVpvn("",0);
op_free(o2);
- gv_fullname3(n, gv, "");
- if (SvCUR(n)>6 && strnEQ(SvPVX(n),"main::",6))
- sv_chop(n, SvPVX(n)+6);
+ gv_fullname4(n, gv, "", FALSE);
o2 = newSVOP(OP_CONST, 0, n);
prev->op_sibling = o2;
o2->op_sibling = sibling;
==== //depot/maint-5.8/perl/perl.c#94 (text) ====
Index: perl/perl.c
--- perl/perl.c#93~23529~ Tue Nov 23 07:17:07 2004
+++ perl/perl.c Tue Dec 21 10:26:15 2004
@@ -3560,7 +3560,8 @@
/* Sanity check on buffer end */
while ((*s) && !isSPACE(*s)) s++;
for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
- (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
+ (isDIGIT(s2[-1]) || s2[-1] == '.' || s2[-1] == '_'
+ || s2[-1] == '-')); s2--) ;
/* Sanity check on buffer start */
if ( (s2-4 < SvPV(PL_linestr,n_a)+2 || strnNE(s2-4,"perl",4)) &&
(s-9 < SvPV(PL_linestr,n_a)+2 || strnNE(s-9,"perl",4)) )
@@ -3847,7 +3848,8 @@
s2 = s;
while (*s == ' ' || *s == '\t') s++;
if (*s++ == '-') {
- while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
+ while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
+ || s2[-1] == '_') s2--;
if (strnEQ(s2-4,"perl",4))
/*SUPPRESS 530*/
while ((s = moreswitches(s)))
@@ -4185,6 +4187,22 @@
#endif /* HAS_PROCSELFEXE */
STATIC void
+S_set_caret_X(pTHX) {
+ GV* tmpgv = gv_fetchpv("\030",TRUE, SVt_PV); /* $^X */
+ if (tmpgv) {
+#ifdef HAS_PROCSELFEXE
+ S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
+#else
+#ifdef OS2
+ sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
+#else
+ sv_setpv(GvSV(tmpgv),PL_origargv[0]);
+#endif
+#endif
+ }
+}
+
+STATIC void
S_init_postdump_symbols(pTHX_ register int argc, register char **argv,
register char **env)
{
char *s;
@@ -4212,17 +4230,7 @@
magicname("0", "0", 1);
#endif
}
- if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */
-#ifdef HAS_PROCSELFEXE
- S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
-#else
-#ifdef OS2
- sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
-#else
- sv_setpv(GvSV(tmpgv),PL_origargv[0]);
-#endif
-#endif
- }
+ S_set_caret_X(aTHX);
if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
HV *hv;
GvMULTI_on(PL_envgv);
@@ -4420,6 +4428,21 @@
# define PERLLIB_MANGLE(s,n) (s)
#endif
+/* Push a directory onto @INC if it exists.
+ Generate a new SV if we do this, to save needing to copy the SV we push
+ onto @INC */
+STATIC SV *
+S_incpush_if_exists(pTHX_ SV *dir)
+{
+ Stat_t tmpstatbuf;
+ if (PerlLIO_stat(SvPVX(dir), &tmpstatbuf) >= 0 &&
+ S_ISDIR(tmpstatbuf.st_mode)) {
+ av_push(GvAVn(PL_incgv), dir);
+ dir = NEWSV(0,0);
+ }
+ return dir;
+}
+
STATIC void
S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep)
{
@@ -4429,7 +4452,7 @@
return;
if (addsubdirs || addoldvers) {
- subdir = sv_newmortal();
+ subdir = NEWSV(0,0);
}
/* Break at all separators */
@@ -4475,7 +4498,6 @@
const char *incverlist[] = { PERL_INC_VERSION_LIST };
const char **incver;
#endif
- Stat_t tmpstatbuf;
#ifdef VMS
char *unix;
STRLEN len;
@@ -4505,23 +4527,18 @@
libdir,
(int)PERL_REVISION, (int)PERL_VERSION,
(int)PERL_SUBVERSION, ARCHNAME);
- if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
- S_ISDIR(tmpstatbuf.st_mode))
- av_push(GvAVn(PL_incgv), newSVsv(subdir));
+ subdir = S_incpush_if_exists(aTHX_ subdir);
/* .../version if -d .../version */
Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir,
(int)PERL_REVISION, (int)PERL_VERSION,
(int)PERL_SUBVERSION);
- if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
- S_ISDIR(tmpstatbuf.st_mode))
- av_push(GvAVn(PL_incgv), newSVsv(subdir));
+ subdir = S_incpush_if_exists(aTHX_ subdir);
/* .../archname if -d .../archname */
Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir,
ARCHNAME);
- if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
- S_ISDIR(tmpstatbuf.st_mode))
- av_push(GvAVn(PL_incgv), newSVsv(subdir));
+ subdir = S_incpush_if_exists(aTHX_ subdir);
+
}
#ifdef PERL_INC_VERSION_LIST
@@ -4529,9 +4546,7 @@
for (incver = incverlist; *incver; incver++) {
/* .../xxx if -d .../xxx */
Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir,
*incver);
- if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
- S_ISDIR(tmpstatbuf.st_mode))
- av_push(GvAVn(PL_incgv), newSVsv(subdir));
+ subdir = S_incpush_if_exists(aTHX_ subdir);
}
}
#endif
@@ -4539,6 +4554,10 @@
/* finally push this lib directory on the end of @INC */
av_push(GvAVn(PL_incgv), libdir);
+ }
+ if (subdir) {
+ assert (SvREFCNT(subdir) == 1);
+ SvREFCNT_dec(subdir);
}
}
==== //depot/maint-5.8/perl/proto.h#47 (text+w) ====
Index: perl/proto.h
--- perl/proto.h#46~23585~ Wed Dec 1 05:52:46 2004
+++ perl/proto.h Tue Dec 21 10:26:15 2004
@@ -241,7 +241,7 @@
PERL_CALLCONV GV* Perl_gv_autoload4(pTHX_ HV* stash, const char* name,
STRLEN len, I32 method);
PERL_CALLCONV void Perl_gv_check(pTHX_ HV* stash);
PERL_CALLCONV void Perl_gv_efullname(pTHX_ SV* sv, GV* gv);
-PERL_CALLCONV void Perl_gv_efullname3(pTHX_ SV* sv, GV* gv, const char*
prefix);
+/* PERL_CALLCONV void gv_efullname3(pTHX_ SV* sv, GV* gv, const char*
prefix); */
PERL_CALLCONV void Perl_gv_efullname4(pTHX_ SV* sv, GV* gv, const char*
prefix, bool keepmain);
PERL_CALLCONV GV* Perl_gv_fetchfile(pTHX_ const char* name);
PERL_CALLCONV GV* Perl_gv_fetchmeth(pTHX_ HV* stash, const char* name,
STRLEN len, I32 level);
@@ -250,7 +250,7 @@
PERL_CALLCONV GV* Perl_gv_fetchmethod_autoload(pTHX_ HV* stash, const
char* name, I32 autoload);
PERL_CALLCONV GV* Perl_gv_fetchpv(pTHX_ const char* name, I32 add, I32
sv_type);
PERL_CALLCONV void Perl_gv_fullname(pTHX_ SV* sv, GV* gv);
-PERL_CALLCONV void Perl_gv_fullname3(pTHX_ SV* sv, GV* gv, const char*
prefix);
+/* PERL_CALLCONV void gv_fullname3(pTHX_ SV* sv, GV* gv, const char* prefix);
*/
PERL_CALLCONV void Perl_gv_fullname4(pTHX_ SV* sv, GV* gv, const char*
prefix, bool keepmain);
PERL_CALLCONV void Perl_gv_init(pTHX_ GV* gv, HV* stash, const char* name,
STRLEN len, int multi);
PERL_CALLCONV HV* Perl_gv_stashpv(pTHX_ const char* name, I32 create);
==== //depot/maint-5.8/perl/sv.c#119 (text) ====
Index: perl/sv.c
--- perl/sv.c#118~23625~ Tue Dec 7 15:09:13 2004
+++ perl/sv.c Tue Dec 21 10:26:15 2004
@@ -3126,14 +3126,13 @@
default: s = "UNKNOWN"; break;
}
tsv = NEWSV(0,0);
- if (SvOBJECT(sv))
- if (HvNAME(SvSTASH(sv)))
- Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)),
s);
- else
- Perl_sv_setpvf(aTHX_ tsv, "__ANON__=%s", s);
+ if (SvOBJECT(sv)) {
+ const char *name = HvNAME(SvSTASH(sv));
+ Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
+ name ? name : "__ANON__" , s, PTR2UV(sv));
+ }
else
- sv_setpv(tsv, s);
- Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
+ Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", s, PTR2UV(sv));
goto tokensaveref;
}
*lp = strlen(s);
@@ -7613,10 +7612,8 @@
Perl_sv_reftype(pTHX_ SV *sv, int ob)
{
if (ob && SvOBJECT(sv)) {
- if (HvNAME(SvSTASH(sv)))
- return HvNAME(SvSTASH(sv));
- else
- return "__ANON__";
+ char *name = HvNAME(SvSTASH(sv));
+ return name ? name : "__ANON__";
}
else {
switch (SvTYPE(sv)) {
==== //depot/maint-5.8/perl/toke.c#51 (text) ====
Index: perl/toke.c
--- perl/toke.c#50~23625~ Tue Dec 7 15:09:13 2004
+++ perl/toke.c Tue Dec 21 10:26:15 2004
@@ -1837,8 +1837,10 @@
weight -= 5; /* cope with negative subscript */
break;
default:
- if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
- isALPHA(*s) && s[1] && isALPHA(s[1])) {
+ if (!isALNUM(last_un_char)
+ && !(last_un_char == '$' || last_un_char == '@'
+ || last_un_char == '&')
+ && isALPHA(*s) && s[1] && isALPHA(s[1])) {
char *d = tmpbuf;
while (isALPHA(*s))
*d++ = *s++;
@@ -2245,7 +2247,8 @@
oldmod = PL_lex_casestack[--PL_lex_casemods];
PL_lex_casestack[PL_lex_casemods] = '\0';
- if (PL_bufptr != PL_bufend && strchr("LUQ", oldmod)) {
+ if (PL_bufptr != PL_bufend
+ && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
PL_bufptr += 2;
PL_lex_state = LEX_INTERPCONCAT;
}
@@ -2268,7 +2271,7 @@
else {
if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
tmp = *s, *s = s[2], s[2] = (char)tmp; /*
misordered... */
- if (strchr("LU", *s) &&
+ if ((*s == 'L' || *s == 'U') &&
(strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack,
'U'))) {
PL_lex_casestack[--PL_lex_casemods] = '\0';
return ')';
@@ -2462,7 +2465,8 @@
sv_catpv(PL_linestr,"chomp;");
if (PL_minus_a) {
if (PL_minus_F) {
- if (strchr("/'\"", *PL_splitstr)
+ if ((*PL_splitstr == '/' || *PL_splitstr == '\''
+ || *PL_splitstr == '"')
&& strchr(PL_splitstr + 1, *PL_splitstr))
Perl_sv_catpvf(aTHX_ PL_linestr, "our
@F=split(%s);", PL_splitstr);
else {
@@ -3575,7 +3579,8 @@
PL_expect = XTERM; /* e.g. print $fh 3 */
else if (*s == '.' && isDIGIT(s[1]))
PL_expect = XTERM; /* e.g. print $fh .3 */
- else if (strchr("/?-+", *s) && !isSPACE(s[1]) && s[1] != '=')
+ else if ((*s == '?' || *s == '-' || *s == '+')
+ && !isSPACE(s[1]) && s[1] != '=')
PL_expect = XTERM; /* e.g. print $fh -1 */
else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
PL_expect = XTERM; /* print $fh <<"EOF" */
@@ -4109,7 +4114,8 @@
}
safe_bareword:
- if (lastchar && strchr("*%&", lastchar) &&
ckWARN_d(WARN_AMBIGUOUS)) {
+ if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
+ && ckWARN_d(WARN_AMBIGUOUS)) {
Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
"Operator or semicolon missing before %c%s",
lastchar, PL_tokenbuf);
@@ -6241,7 +6247,7 @@
return s;
}
if (*s == '$' && s[1] &&
- (isALNUM_lazy_if(s+1,UTF) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
+ (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' ||
strnEQ(s+1,"::",2)) )
{
return s;
}
@@ -6494,15 +6500,23 @@
}
complement = del = squash = 0;
- while (strchr("cds", *s)) {
- if (*s == 'c')
+ while (1) {
+ switch (*s) {
+ case 'c':
complement = OPpTRANS_COMPLEMENT;
- else if (*s == 'd')
+ break;
+ case 'd':
del = OPpTRANS_DELETE;
- else if (*s == 's')
+ break;
+ case 's':
squash = OPpTRANS_SQUASH;
+ break;
+ default:
+ goto no_more;
+ }
s++;
}
+ no_more:
New(803, tbl, complement&&!del?258:256, short);
o = newPVOP(OP_TRANS, 0, (char*)tbl);
@@ -6534,7 +6548,7 @@
if (!outer)
*d++ = '\n';
for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
- if (*peek && strchr("`'\"",*peek)) {
+ if (*peek == '`' || *peek == '\'' || *peek =='"') {
s = peek;
term = *s++;
s = delimcpy(d, e, s, PL_bufend, term, &len);
@@ -7493,7 +7507,7 @@
}
/* read exponent part, if present */
- if (*s && strchr("eE",*s) && strchr("+-0123456789_", s[1])) {
+ if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
floatit = TRUE;
s++;
End of Patch.