From: Nicholas Clark <nick@ccl4.org>
Date: Fri, 5 Oct 2007 16:08:12 +0000 (+0000)
Subject: As PL_hinthv is actually tied, need to call SvSETMAGIC() after the
X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=fc92a12da48923c628ee65a44060ddf6a33f8c2d;p=p5sagit%2Fp5-mst-13.2.git

As PL_hinthv is actually tied, need to call SvSETMAGIC() after the
store to it. Gosh, the tied hash API is clunky.

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

diff --git a/mg.c b/mg.c
index 8d98b6d..827fe93 100644
--- a/mg.c
+++ b/mg.c
@@ -3008,7 +3008,8 @@ int
 Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
 {
     dVAR;
-    assert(mg->mg_len == HEf_SVKEY);
+    SV *key = (mg->mg_len == HEf_SVKEY) ? (SV *)mg->mg_ptr
+	: sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len));
 
     /* mg->mg_obj isn't being used.  If needed, it would be possible to store
        an alternative leaf in there, with PL_compiling.cop_hints being used if
@@ -3020,8 +3021,7 @@ Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
        forgetting to do it, and consequent subtle errors.  */
     PL_hints |= HINT_LOCALIZE_HH;
     PL_compiling.cop_hints_hash
-	= Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
-				 (SV *)mg->mg_ptr, sv);
+	= Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash, key, sv);
     return 0;
 }
 
diff --git a/pp_ctl.c b/pp_ctl.c
index 7f37b75..f29c313 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -3144,8 +3144,11 @@ PP(pp_require)
 	    vcmp(sv, sv_2mortal(upg_version(newSVnv(5.006), FALSE))) >= 0) {
 	  HV * hinthv = GvHV(PL_hintgv);
 	  if( hinthv ) {
-	    (void)hv_stores(hinthv, "v_string", newSViv(1));
-	    PL_hints |= HINT_LOCALIZE_HH;
+	      SV *hint = newSViv(1);
+	      (void)hv_stores(hinthv, "v_string", hint);
+	      /* This will call through to Perl_magic_sethint() which in turn
+		 sets PL_hints correctly.  */
+	      SvSETMAGIC(hint);
 	  }
 	  /* If we request a version >= 5.9.5, load feature.pm with the
 	   * feature bundle that corresponds to the required version. */