Revert "pos in lvalue context now returns a PVMG instead of a PVLV."
authorFather Chrysostomos <sprout@cpan.org>
Thu, 16 Jun 2011 21:51:33 +0000 (14:51 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 17 Jun 2011 03:17:20 +0000 (20:17 -0700)
This reverts commit 571f0e8653a532c34edde36e797ecba446978b1c.

I’m afraid I have to revert this, as it does not modify sv_reftype
accordingly, and doing so would add *more* complexity (the opposite
of what that commit was trying to achieve) and slow down ref() at run
time, by making it search for pos magic.

mg.c
pod/perldelta.pod
pp.c

diff --git a/mg.c b/mg.c
index 64c7d20..1bdf5c4 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -2064,9 +2064,10 @@ int
 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
 {
     dVAR;
-    SV *const lsv = mg->mg_obj;
+    SV* const lsv = LvTARG(sv);
 
     PERL_ARGS_ASSERT_MAGIC_GETPOS;
+    PERL_UNUSED_ARG(mg);
 
     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
        MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
@@ -2086,13 +2087,14 @@ int
 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
 {
     dVAR;
-    SV *const lsv = mg->mg_obj;
+    SV* const lsv = LvTARG(sv);
     SSize_t pos;
     STRLEN len;
     STRLEN ulen = 0;
     MAGIC* found;
 
     PERL_ARGS_ASSERT_MAGIC_SETPOS;
+    PERL_UNUSED_ARG(mg);
 
     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
        found = mg_find(lsv, PERL_MAGIC_regex_global);
index a70e6a6..cbb1bfc 100644 (file)
@@ -867,11 +867,6 @@ last place where the core stores data beyond SvLEN().
 
 =item *
 
-C<pos> in lvalue context now returns a PVMG instead of a PVLV, storing the
-target SV in C<mg_obj>, instead of C<LvTARG()>.
-
-=item *
-
 Simplified logic in C<Perl_sv_magic()> introduces a small change of
 behaviour for error cases involving unknown magic types. Previously, if
 C<Perl_sv_magic()> was passed a magic type unknown to it, it would
diff --git a/pp.c b/pp.c
index f87e0dd..385f1be 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -361,8 +361,10 @@ PP(pp_pos)
     dVAR; dSP; dPOPss;
 
     if (PL_op->op_flags & OPf_MOD || LVRET) {
-       SV * const ret = sv_2mortal(newSV_type(SVt_PVMG));  /* Not TARG RT#67838 */
-       sv_magic(ret, sv, PERL_MAGIC_pos, NULL, 0);
+       SV * const ret = sv_2mortal(newSV_type(SVt_PVLV));  /* Not TARG RT#67838 */
+       sv_magic(ret, NULL, PERL_MAGIC_pos, NULL, 0);
+       LvTYPE(ret) = '.';
+       LvTARG(ret) = SvREFCNT_inc_simple(sv);
        PUSHs(ret);    /* no SvSETMAGIC */
        RETURN;
     }