summaryrefslogtreecommitdiff
path: root/pp_hot.c
diff options
context:
space:
mode:
authorNick Ing-Simmons <nik@tiuk.ti.com>2000-09-03 21:54:46 +0000
committerNick Ing-Simmons <nik@tiuk.ti.com>2000-09-03 21:54:46 +0000
commit1c846c1f6d96d2ca4dfccdcfc0ff050c1474993e (patch)
tree052cab67c23c5f42f2f3fbf0d595e76961d271d2 /pp_hot.c
parent6570e624857a0fc90e8fa87d3479a32bd7482703 (diff)
downloadperl-1c846c1f6d96d2ca4dfccdcfc0ff050c1474993e.tar.gz
Hash lookup of constant strings optimization:
Introduce SvREADONLY && SvFAKE to flag an SV which has SvPVX pointing to string table (as per sharepvn). Add newSV_pvn_share to create such a thing. Make hv.c compare addresses of strings and skip string compare if equal. Make method_named and helem ops use these shared-string SVs when arg is constant. Make keys op return shared-string SVs (less clearly a win). p4raw-id: //depot/perl@7016
Diffstat (limited to 'pp_hot.c')
-rw-r--r--pp_hot.c69
1 files changed, 35 insertions, 34 deletions
diff --git a/pp_hot.c b/pp_hot.c
index 0a0c084144..4192f55b30 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -253,7 +253,7 @@ PP(pp_readline)
tryAMAGICunTARGET(iter, 0);
PL_last_in_gv = (GV*)(*PL_stack_sp--);
if (SvTYPE(PL_last_in_gv) != SVt_PVGV) {
- if (SvROK(PL_last_in_gv) && SvTYPE(SvRV(PL_last_in_gv)) == SVt_PVGV)
+ if (SvROK(PL_last_in_gv) && SvTYPE(SvRV(PL_last_in_gv)) == SVt_PVGV)
PL_last_in_gv = (GV*)SvRV(PL_last_in_gv);
else {
dSP;
@@ -268,7 +268,7 @@ PP(pp_readline)
PP(pp_eq)
{
- djSP; tryAMAGICbinSET(eq,0);
+ djSP; tryAMAGICbinSET(eq,0);
{
dPOPnv;
SETs(boolSV(TOPn == value));
@@ -306,7 +306,7 @@ PP(pp_or)
PP(pp_add)
{
- djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
+ djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
{
dPOPTOPnnrl_ul;
SETn( left + right );
@@ -374,7 +374,7 @@ PP(pp_print)
gv = PL_defoutgv;
if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
if (MARK == ORIGMARK) {
- /* If using default handle then we need to make space to
+ /* If using default handle then we need to make space to
* pass object as 1st arg, so move other args up ...
*/
MEXTEND(SP, 1);
@@ -495,7 +495,7 @@ PP(pp_rv2av)
}
else {
GV *gv;
-
+
if (SvTYPE(sv) != SVt_PVGV) {
char *sym;
STRLEN len;
@@ -551,14 +551,14 @@ PP(pp_rv2av)
if (GIMME == G_ARRAY) {
I32 maxarg = AvFILL(av) + 1;
(void)POPs; /* XXXX May be optimized away? */
- EXTEND(SP, maxarg);
+ EXTEND(SP, maxarg);
if (SvRMAGICAL(av)) {
- U32 i;
+ U32 i;
for (i=0; i < maxarg; i++) {
SV **svp = av_fetch(av, i, FALSE);
SP[i+1] = (svp) ? *svp : &PL_sv_undef;
}
- }
+ }
else {
Copy(AvARRAY(av), SP+1, maxarg, SV*);
}
@@ -599,7 +599,7 @@ PP(pp_rv2hv)
}
else {
GV *gv;
-
+
if (SvTYPE(sv) != SVt_PVGV) {
char *sym;
STRLEN len;
@@ -1034,10 +1034,10 @@ PP(pp_match)
MAGIC* mg = mg_find(TARG, 'g');
if (mg && mg->mg_len >= 0) {
if (!(rx->reganch & ROPT_GPOS_SEEN))
- rx->endp[0] = rx->startp[0] = mg->mg_len;
+ rx->endp[0] = rx->startp[0] = mg->mg_len;
else if (rx->reganch & ROPT_ANCH_GPOS) {
r_flags |= REXEC_IGNOREPOS;
- rx->endp[0] = rx->startp[0] = mg->mg_len;
+ rx->endp[0] = rx->startp[0] = mg->mg_len;
}
minmatch = (mg->mg_flags & MGf_MINMATCH);
update_minmatch = 0;
@@ -1047,7 +1047,7 @@ PP(pp_match)
if ((gimme != G_ARRAY && !global && rx->nparens)
|| SvTEMP(TARG) || PL_sawampersand)
r_flags |= REXEC_COPY_STR;
- if (SvSCREAM(TARG))
+ if (SvSCREAM(TARG))
r_flags |= REXEC_SCREAM;
if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
@@ -1069,7 +1069,7 @@ play_it_again:
if (!s)
goto nope;
if ( (rx->reganch & ROPT_CHECK_ALL)
- && !PL_sawampersand
+ && !PL_sawampersand
&& ((rx->reganch & ROPT_NOSCAN)
|| !((rx->reganch & RE_INTUIT_TAIL)
&& (r_flags & REXEC_SCREAM)))
@@ -1165,7 +1165,7 @@ yup: /* Confirmed by INTUIT */
rx->endp[0] = s - truebase + rx->minlen;
rx->sublen = strend - truebase;
goto gotcha;
- }
+ }
if (PL_sawampersand) {
I32 off;
@@ -1541,15 +1541,16 @@ PP(pp_helem)
U32 lval = PL_op->op_flags & OPf_MOD;
U32 defer = PL_op->op_private & OPpLVAL_DEFER;
SV *sv;
+ U32 hash = (SvFAKE(keysv) && SvREADONLY(keysv)) ? SvUVX(keysv) : 0;
if (SvTYPE(hv) == SVt_PVHV) {
- he = hv_fetch_ent(hv, keysv, lval && !defer, 0);
+ he = hv_fetch_ent(hv, keysv, lval && !defer, hash);
svp = he ? &HeVAL(he) : 0;
}
else if (SvTYPE(hv) == SVt_PVAV) {
if (PL_op->op_private & OPpLVAL_INTRO)
DIE(aTHX_ "Can't localize pseudo-hash element");
- svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, 0);
+ svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, hash);
}
else {
RETPUSHUNDEF;
@@ -1678,7 +1679,7 @@ PP(pp_iter)
/* safe to reuse old SV */
sv_setsv(*itersvp, cur);
}
- else
+ else
#endif
{
/* we need a fresh SV every time so that loop body sees a
@@ -1704,7 +1705,7 @@ PP(pp_iter)
/* safe to reuse old SV */
sv_setiv(*itersvp, cx->blk_loop.iterix++);
}
- else
+ else
#endif
{
/* we need a fresh SV every time so that loop body sees a
@@ -1723,7 +1724,7 @@ PP(pp_iter)
SvREFCNT_dec(*itersvp);
if ((sv = SvMAGICAL(av)
- ? *av_fetch(av, ++cx->blk_loop.iterix, FALSE)
+ ? *av_fetch(av, ++cx->blk_loop.iterix, FALSE)
: AvARRAY(av)[++cx->blk_loop.iterix]))
SvTEMP_off(sv);
else
@@ -1783,7 +1784,7 @@ PP(pp_subst)
else {
TARG = DEFSV;
EXTEND(SP,1);
- }
+ }
if (SvREADONLY(TARG)
|| (SvTYPE(TARG) > SVt_PVLV
&& !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))
@@ -1804,7 +1805,7 @@ PP(pp_subst)
DIE(aTHX_ "panic: do_subst");
strend = s + len;
- maxiters = 2*(strend - s) + 10; /* We can match twice at each
+ maxiters = 2*(strend - s) + 10; /* We can match twice at each
position, once with zero-length,
second time with non-zero. */
@@ -1828,7 +1829,7 @@ PP(pp_subst)
goto nope;
/* How to do it in subst? */
/* if ( (rx->reganch & ROPT_CHECK_ALL)
- && !PL_sawampersand
+ && !PL_sawampersand
&& ((rx->reganch & ROPT_NOSCAN)
|| !((rx->reganch & RE_INTUIT_TAIL)
&& (r_flags & REXEC_SCREAM))))
@@ -2006,7 +2007,7 @@ PP(pp_subst)
goto ret_no;
nope:
-ret_no:
+ret_no:
SPAGAIN;
PUSHs(&PL_sv_no);
LEAVE_SCOPE(oldsave);
@@ -2065,7 +2066,7 @@ PP(pp_leavesub)
SV *sv;
POPBLOCK(cx,newpm);
-
+
TAINT_NOT;
if (gimme == G_SCALAR) {
MARK = newsp + 1;
@@ -2101,7 +2102,7 @@ PP(pp_leavesub)
}
}
PUTBACK;
-
+
POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
PL_curpm = newpm; /* ... and pop $1 et al */
@@ -2123,7 +2124,7 @@ PP(pp_leavesublv)
SV *sv;
POPBLOCK(cx,newpm);
-
+
TAINT_NOT;
if (cx->blk_sub.lval & OPpENTERSUB_INARGS) {
@@ -2254,7 +2255,7 @@ PP(pp_leavesublv)
}
}
PUTBACK;
-
+
POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
PL_curpm = newpm; /* ... and pop $1 et al */
@@ -2275,7 +2276,7 @@ S_get_db_sub(pTHX_ SV **svp, CV *cv)
save_item(dbsv);
if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED))
- || strEQ(GvNAME(gv), "END")
+ || strEQ(GvNAME(gv), "END")
|| ((GvCV(gv) != cv) && /* Could be imported, and old sub redefined. */
!( (SvTYPE(*svp) == SVt_PVGV) && (GvCV((GV*)*svp) == cv)
&& (gv = (GV*)*svp) ))) {
@@ -2553,7 +2554,7 @@ try_autoload:
}
PL_stack_sp = mark + 1;
fp3 = (I32(*)(int,int,int))CvXSUB(cv);
- items = (*fp3)(CvXSUBANY(cv).any_i32,
+ items = (*fp3)(CvXSUBANY(cv).any_i32,
MARK - PL_stack_base + 1,
items);
PL_stack_sp = PL_stack_base + items;
@@ -2583,7 +2584,7 @@ try_autoload:
EXTEND(SP, items);
Copy(AvARRAY(av), SP + 1, items, SV*);
SP += items;
- PUTBACK ;
+ PUTBACK ;
}
}
/* We assume first XSUB in &DB::sub is the called one. */
@@ -2677,7 +2678,7 @@ try_autoload:
EXTEND(SP, items);
Copy(AvARRAY(av), SP + 1, items, SV*);
SP += items;
- PUTBACK ;
+ PUTBACK ;
}
}
#endif /* USE_THREADS */
@@ -2725,7 +2726,7 @@ try_autoload:
}
Copy(MARK,AvARRAY(av),items,SV*);
AvFILLp(av) = items - 1;
-
+
while (items--) {
if (*MARK)
SvTEMP_off(*MARK);
@@ -2755,7 +2756,7 @@ Perl_sub_crush_depth(pTHX_ CV *cv)
else {
SV* tmpstr = sv_newmortal();
gv_efullname3(tmpstr, CvGV(cv), Nullch);
- Perl_warner(aTHX_ WARN_RECURSION, "Deep recursion on subroutine \"%s\"",
+ Perl_warner(aTHX_ WARN_RECURSION, "Deep recursion on subroutine \"%s\"",
SvPVX(tmpstr));
}
}
@@ -2888,7 +2889,7 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
!(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) ||
!(ob=(SV*)GvIO(iogv)))
{
- if (!packname ||
+ if (!packname ||
((*(U8*)packname >= 0xc0 && DO_UTF8(sv))
? !isIDFIRST_utf8((U8*)packname)
: !isIDFIRST(*packname)