From: Nicholas Clark 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. */