This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
As PL_hinthv is actually tied, need to call SvSETMAGIC() after the
authorNicholas Clark <nick@ccl4.org>
Fri, 5 Oct 2007 16:08:12 +0000 (16:08 +0000)
committerNicholas Clark <nick@ccl4.org>
Fri, 5 Oct 2007 16:08:12 +0000 (16:08 +0000)
store to it. Gosh, the tied hash API is clunky.

p4raw-id: //depot/perl@32032

mg.c
pp_ctl.c

diff --git a/mg.c b/mg.c
index 8d98b6d..827fe93 100644 (file)
--- 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;
 }
 
index 7f37b75..f29c313 100644 (file)
--- 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. */