From: Nicholas Clark <nick@ccl4.org>
Date: Sun, 31 Dec 2006 16:58:18 +0000 (+0000)
Subject: Rationalise the logic in lex_start for creating a new temporary if the
X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=10efb74f64fe893d58bec201ca5044ac1e94c795;p=p5sagit%2Fp5-mst-13.2.git

Rationalise the logic in lex_start for creating a new temporary if the
passed in SV is read only or doesn't end in ';'. Also, allow a NULL
pointer to imply a zero length string, which saves creating a mortal
in pp_require, only for it to be ignored in favour of a new SV.

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

diff --git a/embed.fnc b/embed.fnc
index abbb518..c4dc7c7 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -399,7 +399,7 @@ p	|OP*	|jmaybe		|NN OP* arg
 pP	|I32	|keyword	|NN const char* d|I32 len|bool all_keywords
 Ap	|void	|leave_scope	|I32 base
 p	|void	|lex_end
-p	|void	|lex_start	|NN SV* line
+p	|void	|lex_start	|NULLOK SV* line
 Ap	|void	|op_null	|NN OP* o
 p	|void	|op_clear	|NN OP* o
 Ap	|void	|op_refcnt_lock
diff --git a/pp_ctl.c b/pp_ctl.c
index 36f0963..28b0484 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -3377,7 +3377,7 @@ PP(pp_require)
 
     ENTER;
     SAVETMPS;
-    lex_start(sv_2mortal(newSVpvs("")));
+    lex_start(NULL);
     SAVEGENERICSV(PL_rsfp_filters);
     PL_rsfp_filters = NULL;
 
diff --git a/proto.h b/proto.h
index a0d3b95..e988ca7 100644
--- a/proto.h
+++ b/proto.h
@@ -1016,9 +1016,7 @@ PERL_CALLCONV I32	Perl_keyword(pTHX_ const char* d, I32 len, bool all_keywords)
 
 PERL_CALLCONV void	Perl_leave_scope(pTHX_ I32 base);
 PERL_CALLCONV void	Perl_lex_end(pTHX);
-PERL_CALLCONV void	Perl_lex_start(pTHX_ SV* line)
-			__attribute__nonnull__(pTHX_1);
-
+PERL_CALLCONV void	Perl_lex_start(pTHX_ SV* line);
 PERL_CALLCONV void	Perl_op_null(pTHX_ OP* o)
 			__attribute__nonnull__(pTHX_1);
 
diff --git a/toke.c b/toke.c
index eaa7e6b..7166194 100644
--- a/toke.c
+++ b/toke.c
@@ -660,10 +660,16 @@ Perl_lex_start(pTHX_ SV *line)
 #endif
     PL_lex_inwhat = 0;
     PL_sublex_info.sub_inwhat = 0;
-    s = SvPV_const(line, len);
-    if (SvREADONLY(line) || !len || s[len-1] != ';') {
-	PL_linestr = len ? newSVsv(line) : newSVpvn(s, 0);
-	if (!len || s[len-1] != ';')
+    if (line) {
+	s = SvPV_const(line, len);
+    } else {
+	len = 0;
+    }
+    if (!len) {
+	PL_linestr = newSVpvs("\n;");
+    } else if (SvREADONLY(line) || s[len-1] != ';') {
+	PL_linestr = newSVsv(line);
+	if (s[len-1] != ';')
 	    sv_catpvs(PL_linestr, "\n;");
     } else {
 	SvTEMP_off(line);