Change 29851 by [EMAIL PROTECTED] on 2007/01/17 15:41:23

        Integrate:
        [ 27104]
        Fix bug #38439 - reference to typeglob assignment needs to be based
        on SvROK(sstr) rather than SvTYPE(sstr) == SVt_RV.
        
        [ 27111]
        Rename S_glob_assign to S_glob_assign_glob
        Rename S_pvgv_assign to S_glob_assign_ref
        
        I don't think that they share enough common code to merge them.

Affected files ...

... //depot/maint-5.8/perl/sv.c#283 integrate
... //depot/maint-5.8/perl/t/op/gv.t#7 integrate

Differences ...

==== //depot/maint-5.8/perl/sv.c#283 (text) ====
Index: perl/sv.c
--- perl/sv.c#282~29850~        2007-01-17 06:15:59.000000000 -0800
+++ perl/sv.c   2007-01-17 07:41:23.000000000 -0800
@@ -2896,7 +2896,7 @@
 */
 
 static void
-S_glob_assign(pTHX_ SV *dstr, SV *sstr, const int dtype)
+S_glob_assign_glob(pTHX_ SV *dstr, SV *sstr, const int dtype)
 {
     if (dtype != SVt_PVGV) {
        const char * const name = GvNAME(sstr);
@@ -2931,7 +2931,7 @@
 }
 
 static void
-S_pvgv_assign(pTHX_ SV *dstr, SV *sstr) {
+S_glob_assign_ref(pTHX_ SV *dstr, SV *sstr) {
     SV * const sref = SvREFCNT_inc(SvRV(sstr));
     SV *dref = NULL;
     const int intro = GvINTRO(dstr);
@@ -3120,21 +3120,6 @@
     case SVt_RV:
        if (dtype < SVt_RV)
            sv_upgrade(dstr, SVt_RV);
-       else if (dtype == SVt_PVGV &&
-                SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
-           sstr = SvRV(sstr);
-           if (sstr == dstr) {
-               if (GvIMPORTED(dstr) != GVf_IMPORTED
-                   && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
-               {
-                   GvIMPORTED_on(dstr);
-               }
-               GvMULTI_on(dstr);
-               return;
-           }
-           S_glob_assign(aTHX_ dstr, sstr, dtype);
-           return;
-       }
        break;
     case SVt_PV:
     case SVt_PVFM:
@@ -3164,7 +3149,7 @@
 
     case SVt_PVGV:
        if (dtype <= SVt_PVGV) {
-           S_glob_assign(aTHX_ dstr, sstr, dtype);
+           S_glob_assign_glob(aTHX_ dstr, sstr, dtype);
            return;
        }
        /* FALL THROUGH */
@@ -3175,7 +3160,7 @@
            if ((int)SvTYPE(sstr) != stype) {
                stype = SvTYPE(sstr);
                if (stype == SVt_PVGV && dtype <= SVt_PVGV) {
-                   S_glob_assign(aTHX_ dstr, sstr, dtype);
+                   S_glob_assign_glob(aTHX_ dstr, sstr, dtype);
                    return;
                }
            }
@@ -3189,9 +3174,25 @@
     sflags = SvFLAGS(sstr);
 
     if (sflags & SVf_ROK) {
+       if (dtype == SVt_PVGV &&
+           SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
+           sstr = SvRV(sstr);
+           if (sstr == dstr) {
+               if (GvIMPORTED(dstr) != GVf_IMPORTED
+                   && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
+               {
+                   GvIMPORTED_on(dstr);
+               }
+               GvMULTI_on(dstr);
+               return;
+           }
+           S_glob_assign_glob(aTHX_ dstr, sstr, dtype);
+           return;
+       }
+
        if (dtype >= SVt_PV) {
            if (dtype == SVt_PVGV) {
-               S_pvgv_assign(aTHX_ dstr, sstr);
+               S_glob_assign_ref(aTHX_ dstr, sstr);
                return;
            }
            if (SvPVX_const(dstr)) {

==== //depot/maint-5.8/perl/t/op/gv.t#7 (xtext) ====
Index: perl/t/op/gv.t
--- perl/t/op/gv.t#6~29785~     2007-01-13 08:56:44.000000000 -0800
+++ perl/t/op/gv.t      2007-01-17 07:41:23.000000000 -0800
@@ -12,7 +12,7 @@
 use warnings;
 
 require './test.pl';
-plan( tests => 127 );
+plan( tests => 131 );
 
 # type coersion on assignment
 $foo = 'foo';
@@ -347,6 +347,25 @@
 is (eval 'plunk', "Value", "Constant has correct value");
 is (ref \$::{plunk}, 'GLOB', "Symbol table has full typeglob");
 
+{
+    use vars qw($glook $smek $foof);
+    # Check reference assignment isn't affected by the SV type (bug #38439)
+    $glook = 3;
+    $smek = 4;
+    $foof = "halt and cool down";
+
+    my $rv = \*smek;
+    is($glook, 3);
+    *glook = $rv;
+    is($glook, 4);
+
+    my $pv = "";
+    $pv = \*smek;
+    is($foof, "halt and cool down");
+    *foof = $pv;
+    is($foof, 4);
+}
+
 format =
 .
 
End of Patch.

Reply via email to