From: Nicholas Clark <nick@ccl4.org>
Date: Thu, 18 Oct 2007 12:32:42 +0000 (+0000)
Subject: No need to call strlen() on the result of CopSTASHPV() when unthreaded,
X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=8e3a4a3079a43c5cf5fb5f844ffb0b9d1d8b571d;p=p5sagit%2Fp5-mst-13.2.git

No need to call strlen() on the result of CopSTASHPV() when unthreaded,
as the length is already known. Hence conditionally compile out the
logic related to the call to strlen() from S_method_common(), and use
newSVhek in S_gv_get_super_pkg().

p4raw-id: //depot/perl@32130
---

diff --git a/gv.c b/gv.c
index 241e616..a9eb65a 100644
--- a/gv.c
+++ b/gv.c
@@ -564,7 +564,12 @@ S_gv_get_super_pkg(pTHX_ const char* name, I32 namelen)
     superisa = GvAVn(gv);
     GvMULTI_on(gv);
     sv_magic((SV*)superisa, (SV*)gv, PERL_MAGIC_isa, NULL, 0);
+#ifdef USE_ITHREADS
     av_push(superisa, newSVpv(CopSTASHPV(PL_curcop), 0));
+#else
+    av_push(superisa, newSVhek(CopSTASH(PL_curcop)
+			       ? HvNAME_HEK(CopSTASH(PL_curcop)) : NULL));
+#endif
 
     return stash;
 }
diff --git a/pp_hot.c b/pp_hot.c
index 6fb53d4..423c4c8 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -3097,16 +3097,24 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
 	}
 	if (!sep || ((sep - name) == 5 && strnEQ(name, "SUPER", 5))) {
 	    /* the method name is unqualified or starts with SUPER:: */
+#ifndef USE_ITHREADS
+	    if (sep)
+		stash = CopSTASH(PL_curcop);
+#else
 	    bool need_strlen = 1;
 	    if (sep) {
 		packname = CopSTASHPV(PL_curcop);
 	    }
-	    else if (stash) {
+	    else
+#endif
+	    if (stash) {
 		HEK * const packhek = HvNAME_HEK(stash);
 		if (packhek) {
 		    packname = HEK_KEY(packhek);
 		    packlen = HEK_LEN(packhek);
+#ifdef USE_ITHREADS
 		    need_strlen = 0;
+#endif
 		} else {
 		    goto croak;
 		}
@@ -3117,8 +3125,10 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
 		Perl_croak(aTHX_
 			   "Can't use anonymous symbol table for method lookup");
 	    }
-	    else if (need_strlen)
+#ifdef USE_ITHREADS
+	    if (need_strlen)
 		packlen = strlen(packname);
+#endif
 
 	}
 	else {