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.