Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PATCH] Devel::PPPort: Implement newSVsv_nomg() and SV_NOSTEAL for sv_setsv_flags() #16998

Closed
p5pRT opened this issue May 14, 2019 · 11 comments
Closed

Comments

@p5pRT
Copy link

p5pRT commented May 14, 2019

Migrated from rt.perl.org#134103 (status was 'open')

Searchable as RT134103$

@p5pRT
Copy link
Author

p5pRT commented May 14, 2019

From @pali

First attached patch implements SV_NOSTEAL flag for sv_setsv_flags().
Second attached patch implements new newSVsv_nomg() macro via
sv_setsv_flags()/SV_NOSTEAL.

@p5pRT
Copy link
Author

p5pRT commented May 14, 2019

From @pali

0001-Devel-PPPort-Implement-SV_NOSTEAL-for-sv_setsv_flags.patch
From f90eba6bc93571ef7809a24496ffb2e7c7d2febd Mon Sep 17 00:00:00 2001
From: Pali <pali@cpan.org>
Date: Fri, 20 Jul 2018 16:49:03 +0200
Subject: [PATCH 1/2] Devel::PPPort: Implement SV_NOSTEAL for sv_setsv_flags()

---
 dist/Devel-PPPort/parts/inc/SvPV   |  1 -
 dist/Devel-PPPort/parts/inc/Sv_set | 34 +++++++++++++++++++++++++++++++++-
 dist/Devel-PPPort/t/Sv_set.t       |  6 ++++--
 3 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/dist/Devel-PPPort/parts/inc/SvPV b/dist/Devel-PPPort/parts/inc/SvPV
index 4f0ded321c..64f449ac2c 100644
--- a/dist/Devel-PPPort/parts/inc/SvPV
+++ b/dist/Devel-PPPort/parts/inc/SvPV
@@ -92,7 +92,6 @@ __UNDEFINED__  SV_IMMEDIATE_UNREF       0
 __UNDEFINED__  SV_GMAGIC                0
 __UNDEFINED__  SV_COW_DROP_PV           0
 __UNDEFINED__  SV_UTF8_NO_ENCODING      0
-__UNDEFINED__  SV_NOSTEAL               0
 __UNDEFINED__  SV_CONST_RETURN          0
 __UNDEFINED__  SV_MUTABLE_RETURN        0
 __UNDEFINED__  SV_SMAGIC                0
diff --git a/dist/Devel-PPPort/parts/inc/Sv_set b/dist/Devel-PPPort/parts/inc/Sv_set
index 30452aee66..dfa4c0f3d9 100644
--- a/dist/Devel-PPPort/parts/inc/Sv_set
+++ b/dist/Devel-PPPort/parts/inc/Sv_set
@@ -13,8 +13,26 @@
 
 __UNDEFINED__
 
+SV_NOSTEAL
+sv_setsv_flags
+
 =implementation
 
+#if ( { VERSION >= 5.7.3 } && { VERSION < 5.8.7 } ) || ( { VERSION >= 5.9.0 } && { VERSION < 5.9.2 } )
+#undef sv_setsv_flags
+#define SV_NOSTEAL 16
+#define sv_setsv_flags(dstr, sstr, flags)                                \
+  STMT_START {                                                           \
+    if (((flags) & SV_NOSTEAL) && (SvFLAGS((sstr)) & SVs_TEMP)) {        \
+      SvTEMP_off((sstr));                                                \
+      Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL);  \
+      SvTEMP_on((sstr));                                                 \
+    } else {                                                             \
+      Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL);  \
+    }                                                                    \
+  } STMT_END
+#endif
+
 __UNDEFINED__ SvMAGIC_set(sv, val) \
                 STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
                 (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
@@ -94,7 +112,19 @@ TestSvSTASH_set(sv, name)
                 SvREFCNT_dec(SvSTASH(sv));
                 SvSTASH_set(sv, (HV*) SvREFCNT_inc(gv_stashpv(name, 0)));
 
-=tests plan => 5
+IV
+Test_sv_setsv_SV_NOSTEAL()
+        PREINIT:
+                SV *sv1, *sv2;
+        CODE:
+                sv1 = sv_2mortal(newSVpv("test1", 0));
+                sv2 = sv_2mortal(newSVpv("test2", 0));
+                sv_setsv_flags(sv2, sv1, SV_NOSTEAL);
+                RETVAL = (strEQ(SvPV_nolen(sv1), "test1") && strEQ(SvPV_nolen(sv2), "test1"));
+        OUTPUT:
+                RETVAL
+
+=tests plan => 6
 
 my $foo = 5;
 ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
@@ -109,6 +139,8 @@ ok($bar->x(), 'foobar');
 Devel::PPPort::TestSvSTASH_set($bar, 'bar');
 ok($bar->x(), 'hacker');
 
+ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+
 package foo;
 
 sub x { 'foobar' }
diff --git a/dist/Devel-PPPort/t/Sv_set.t b/dist/Devel-PPPort/t/Sv_set.t
index 77a7a860db..24a7b05982 100644
--- a/dist/Devel-PPPort/t/Sv_set.t
+++ b/dist/Devel-PPPort/t/Sv_set.t
@@ -30,9 +30,9 @@ BEGIN {
     require 'testutil.pl' if $@;
   }
 
-  if (5) {
+  if (6) {
     load();
-    plan(tests => 5);
+    plan(tests => 6);
   }
 }
 
@@ -61,6 +61,8 @@ ok($bar->x(), 'foobar');
 Devel::PPPort::TestSvSTASH_set($bar, 'bar');
 ok($bar->x(), 'hacker');
 
+ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+
 package foo;
 
 sub x { 'foobar' }
-- 
2.11.0

@p5pRT
Copy link
Author

p5pRT commented May 14, 2019

From @pali

0002-Devel-PPPort-Implement-newSVsv_nomg.patch
From f5aa066d908444e197870334f09583426b6c297a Mon Sep 17 00:00:00 2001
From: Pali <pali@cpan.org>
Date: Wed, 13 Feb 2019 14:58:08 +0100
Subject: [PATCH 2/2] Devel::PPPort: Implement newSVsv_nomg()

---
 dist/Devel-PPPort/parts/inc/Sv_set | 46 +++++++++++++++++++++++++++++++++++++-
 dist/Devel-PPPort/t/Sv_set.t       | 31 +++++++++++++++++++++++--
 2 files changed, 74 insertions(+), 3 deletions(-)

diff --git a/dist/Devel-PPPort/parts/inc/Sv_set b/dist/Devel-PPPort/parts/inc/Sv_set
index dfa4c0f3d9..e3de05d8cf 100644
--- a/dist/Devel-PPPort/parts/inc/Sv_set
+++ b/dist/Devel-PPPort/parts/inc/Sv_set
@@ -15,6 +15,7 @@ __UNDEFINED__
 
 SV_NOSTEAL
 sv_setsv_flags
+newSVsv_nomg
 
 =implementation
 
@@ -33,6 +34,14 @@ sv_setsv_flags
   } STMT_END
 #endif
 
+#ifndef newSVsv_nomg
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#  define newSVsv_nomg(sv) ({ SV *_sv = newSV(0); sv_setsv_flags(_sv, (sv), SV_NOSTEAL); _sv; })
+#else
+#  define newSVsv_nomg(sv) ((PL_Sv = newSV(0)), sv_setsv_flags(PL_Sv, (sv), SV_NOSTEAL), PL_Sv)
+#endif
+#endif
+
 __UNDEFINED__ SvMAGIC_set(sv, val) \
                 STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
                 (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
@@ -124,7 +133,15 @@ Test_sv_setsv_SV_NOSTEAL()
         OUTPUT:
                 RETVAL
 
-=tests plan => 6
+SV *
+newSVsv_nomg(sv)
+        SV *sv
+        CODE:
+                RETVAL = newSVsv_nomg(sv);
+        OUTPUT:
+                RETVAL
+
+=tests plan => 10
 
 my $foo = 5;
 ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
@@ -141,6 +158,33 @@ ok($bar->x(), 'hacker');
 
 ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
 
+tie my $scalar, 'TieScalarCounter', 'string';
+
+ok tied($scalar)->{fetch}, 0;
+ok tied($scalar)->{store}, 0;
+my $copy = Devel::PPPort::newSVsv_nomg($scalar);
+ok tied($scalar)->{fetch}, 0;
+ok tied($scalar)->{store}, 0;
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+    my ($class, $value) = @_;
+    return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+    my ($self) = @_;
+    $self->{fetch}++;
+    return $self->{value};
+}
+
+sub STORE {
+    my ($self, $value) = @_;
+    $self->{store}++;
+    $self->{value} = $value;
+}
+
 package foo;
 
 sub x { 'foobar' }
diff --git a/dist/Devel-PPPort/t/Sv_set.t b/dist/Devel-PPPort/t/Sv_set.t
index 24a7b05982..ea29653af7 100644
--- a/dist/Devel-PPPort/t/Sv_set.t
+++ b/dist/Devel-PPPort/t/Sv_set.t
@@ -30,9 +30,9 @@ BEGIN {
     require 'testutil.pl' if $@;
   }
 
-  if (6) {
+  if (10) {
     load();
-    plan(tests => 6);
+    plan(tests => 10);
   }
 }
 
@@ -63,6 +63,33 @@ ok($bar->x(), 'hacker');
 
 ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
 
+tie my $scalar, 'TieScalarCounter', 'string';
+
+ok tied($scalar)->{fetch}, 0;
+ok tied($scalar)->{store}, 0;
+my $copy = Devel::PPPort::newSVsv_nomg($scalar);
+ok tied($scalar)->{fetch}, 0;
+ok tied($scalar)->{store}, 0;
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+    my ($class, $value) = @_;
+    return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+    my ($self) = @_;
+    $self->{fetch}++;
+    return $self->{value};
+}
+
+sub STORE {
+    my ($self, $value) = @_;
+    $self->{store}++;
+    $self->{value} = $value;
+}
+
 package foo;
 
 sub x { 'foobar' }
-- 
2.11.0

@p5pRT
Copy link
Author

p5pRT commented May 14, 2019

From @atoomic

On Tue, 14 May 2019 04​:47​:53 -0700, pali@​cpan.org wrote​:

First attached patch implements SV_NOSTEAL flag for sv_setsv_flags().
Second attached patch implements new newSVsv_nomg() macro via
sv_setsv_flags()/SV_NOSTEAL.

going to track this on GitHub as Dual-Life/Devel-PPPort#63
so we can get a smoker run with it

@p5pRT
Copy link
Author

p5pRT commented May 14, 2019

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented May 14, 2019

From @jkeenan

On Tue, 14 May 2019 15​:55​:58 GMT, atoomic wrote​:

On Tue, 14 May 2019 04​:47​:53 -0700, pali@​cpan.org wrote​:

First attached patch implements SV_NOSTEAL flag for sv_setsv_flags().
Second attached patch implements new newSVsv_nomg() macro via
sv_setsv_flags()/SV_NOSTEAL.

going to track this on GitHub as https://github.com/Dual-Life/Devel-
PPPort/issues/63
so we can get a smoker run with it

We're in code freeze. These patches should be placed in a branch for consideration for application to blead post-perl-5.31.0.

Thank you very much.
Jim Keenan

--
James E Keenan (jkeenan@​cpan.org)

@p5pRT
Copy link
Author

p5pRT commented Jun 1, 2019

From @pali

On Tuesday 14 May 2019 08​:55​:58 Atoomic via RT wrote​:

On Tue, 14 May 2019 04​:47​:53 -0700, pali@​cpan.org wrote​:

First attached patch implements SV_NOSTEAL flag for sv_setsv_flags().
Second attached patch implements new newSVsv_nomg() macro via
sv_setsv_flags()/SV_NOSTEAL.

going to track this on GitHub as Dual-Life/Devel-PPPort#63
so we can get a smoker run with it

In attachment is V2 version of these patches. V2 fixes compilation for Perl 5.6.2.

I'm not allowed to edit that github pull request, so I'm sending them here.

@p5pRT
Copy link
Author

p5pRT commented Jun 1, 2019

From @pali

v2-0001-Devel-PPPort-Implement-SV_NOSTEAL-for-sv_setsv_flags.patch
From 09309ee529af7cac83aed936446a21cf0adbbff2 Mon Sep 17 00:00:00 2001
From: Pali <pali@cpan.org>
Date: Fri, 20 Jul 2018 16:49:03 +0200
Subject: [PATCH 1/2] Devel::PPPort: Implement SV_NOSTEAL for sv_setsv_flags()

---
 dist/Devel-PPPort/parts/inc/SvPV   |  1 -
 dist/Devel-PPPort/parts/inc/Sv_set | 42 +++++++++++++++++++++++++++++++++++++-
 dist/Devel-PPPort/t/Sv_set.t       | 10 +++++++--
 3 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/dist/Devel-PPPort/parts/inc/SvPV b/dist/Devel-PPPort/parts/inc/SvPV
index 4f0ded321c..64f449ac2c 100644
--- a/dist/Devel-PPPort/parts/inc/SvPV
+++ b/dist/Devel-PPPort/parts/inc/SvPV
@@ -92,7 +92,6 @@ __UNDEFINED__  SV_IMMEDIATE_UNREF       0
 __UNDEFINED__  SV_GMAGIC                0
 __UNDEFINED__  SV_COW_DROP_PV           0
 __UNDEFINED__  SV_UTF8_NO_ENCODING      0
-__UNDEFINED__  SV_NOSTEAL               0
 __UNDEFINED__  SV_CONST_RETURN          0
 __UNDEFINED__  SV_MUTABLE_RETURN        0
 __UNDEFINED__  SV_SMAGIC                0
diff --git a/dist/Devel-PPPort/parts/inc/Sv_set b/dist/Devel-PPPort/parts/inc/Sv_set
index 30452aee66..36aa3eb9f9 100644
--- a/dist/Devel-PPPort/parts/inc/Sv_set
+++ b/dist/Devel-PPPort/parts/inc/Sv_set
@@ -13,8 +13,26 @@
 
 __UNDEFINED__
 
+SV_NOSTEAL
+sv_setsv_flags
+
 =implementation
 
+#if ( { VERSION >= 5.7.3 } && { VERSION < 5.8.7 } ) || ( { VERSION >= 5.9.0 } && { VERSION < 5.9.2 } )
+#undef sv_setsv_flags
+#define SV_NOSTEAL 16
+#define sv_setsv_flags(dstr, sstr, flags)                                \
+  STMT_START {                                                           \
+    if (((flags) & SV_NOSTEAL) && (SvFLAGS((sstr)) & SVs_TEMP)) {        \
+      SvTEMP_off((sstr));                                                \
+      Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL);  \
+      SvTEMP_on((sstr));                                                 \
+    } else {                                                             \
+      Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL);  \
+    }                                                                    \
+  } STMT_END
+#endif
+
 __UNDEFINED__ SvMAGIC_set(sv, val) \
                 STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
                 (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
@@ -94,7 +112,23 @@ TestSvSTASH_set(sv, name)
                 SvREFCNT_dec(SvSTASH(sv));
                 SvSTASH_set(sv, (HV*) SvREFCNT_inc(gv_stashpv(name, 0)));
 
-=tests plan => 5
+#ifdef SV_NOSTEAL
+
+IV
+Test_sv_setsv_SV_NOSTEAL()
+        PREINIT:
+                SV *sv1, *sv2;
+        CODE:
+                sv1 = sv_2mortal(newSVpv("test1", 0));
+                sv2 = sv_2mortal(newSVpv("test2", 0));
+                sv_setsv_flags(sv2, sv1, SV_NOSTEAL);
+                RETVAL = (strEQ(SvPV_nolen(sv1), "test1") && strEQ(SvPV_nolen(sv2), "test1"));
+        OUTPUT:
+                RETVAL
+
+#endif
+
+=tests plan => 6
 
 my $foo = 5;
 ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
@@ -109,6 +143,12 @@ ok($bar->x(), 'foobar');
 Devel::PPPort::TestSvSTASH_set($bar, 'bar');
 ok($bar->x(), 'hacker');
 
+if ( "$]" lt '5.007003' ) {
+    skip 'skip: no SV_NOSTEAL support', 0;
+} else {
+    ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+}
+
 package foo;
 
 sub x { 'foobar' }
diff --git a/dist/Devel-PPPort/t/Sv_set.t b/dist/Devel-PPPort/t/Sv_set.t
index 77a7a860db..9dcf97951f 100644
--- a/dist/Devel-PPPort/t/Sv_set.t
+++ b/dist/Devel-PPPort/t/Sv_set.t
@@ -30,9 +30,9 @@ BEGIN {
     require 'testutil.pl' if $@;
   }
 
-  if (5) {
+  if (6) {
     load();
-    plan(tests => 5);
+    plan(tests => 6);
   }
 }
 
@@ -61,6 +61,12 @@ ok($bar->x(), 'foobar');
 Devel::PPPort::TestSvSTASH_set($bar, 'bar');
 ok($bar->x(), 'hacker');
 
+if ( "$]" lt '5.007003' ) {
+    skip 'skip: no SV_NOSTEAL support', 0;
+} else {
+    ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+}
+
 package foo;
 
 sub x { 'foobar' }
-- 
2.11.0

@p5pRT
Copy link
Author

p5pRT commented Jun 1, 2019

From @pali

v2-0002-Devel-PPPort-Implement-newSVsv_nomg.patch
From c2388e3747b317b2e447b27270c772ec0225a18a Mon Sep 17 00:00:00 2001
From: Pali <pali@cpan.org>
Date: Wed, 13 Feb 2019 14:58:08 +0100
Subject: [PATCH 2/2] Devel::PPPort: Implement newSVsv_nomg()

---
 dist/Devel-PPPort/parts/inc/Sv_set | 60 ++++++++++++++++++++++++++++++++++++--
 dist/Devel-PPPort/t/Sv_set.t       | 41 ++++++++++++++++++++++++--
 2 files changed, 96 insertions(+), 5 deletions(-)

diff --git a/dist/Devel-PPPort/parts/inc/Sv_set b/dist/Devel-PPPort/parts/inc/Sv_set
index 36aa3eb9f9..338b6d333b 100644
--- a/dist/Devel-PPPort/parts/inc/Sv_set
+++ b/dist/Devel-PPPort/parts/inc/Sv_set
@@ -15,6 +15,7 @@ __UNDEFINED__
 
 SV_NOSTEAL
 sv_setsv_flags
+newSVsv_nomg
 
 =implementation
 
@@ -33,6 +34,14 @@ sv_setsv_flags
   } STMT_END
 #endif
 
+#if !defined(newSVsv_nomg) && defined(SV_NOSTEAL)
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#  define newSVsv_nomg(sv) ({ SV *_sv = newSV(0); sv_setsv_flags(_sv, (sv), SV_NOSTEAL); _sv; })
+#else
+#  define newSVsv_nomg(sv) ((PL_Sv = newSV(0)), sv_setsv_flags(PL_Sv, (sv), SV_NOSTEAL), PL_Sv)
+#endif
+#endif
+
 __UNDEFINED__ SvMAGIC_set(sv, val) \
                 STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
                 (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
@@ -128,7 +137,19 @@ Test_sv_setsv_SV_NOSTEAL()
 
 #endif
 
-=tests plan => 6
+#ifdef newSVsv_nomg
+
+SV *
+newSVsv_nomg(sv)
+        SV *sv
+        CODE:
+                RETVAL = newSVsv_nomg(sv);
+        OUTPUT:
+                RETVAL
+
+#endif
+
+=tests plan => 15
 
 my $foo = 5;
 ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
@@ -144,9 +165,44 @@ Devel::PPPort::TestSvSTASH_set($bar, 'bar');
 ok($bar->x(), 'hacker');
 
 if ( "$]" lt '5.007003' ) {
-    skip 'skip: no SV_NOSTEAL support', 0;
+    skip 'skip: no SV_NOSTEAL support', 0 for 1..10;
 } else {
     ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+
+    tie my $scalar, 'TieScalarCounter', 'string';
+
+    ok tied($scalar)->{fetch}, 0;
+    ok tied($scalar)->{store}, 0;
+    my $copy = Devel::PPPort::newSVsv_nomg($scalar);
+    ok tied($scalar)->{fetch}, 0;
+    ok tied($scalar)->{store}, 0;
+
+    my $fetch = $scalar;
+    ok tied($scalar)->{fetch}, 1;
+    ok tied($scalar)->{store}, 0;
+    my $copy2 = Devel::PPPort::newSVsv_nomg($scalar);
+    ok tied($scalar)->{fetch}, 1;
+    ok tied($scalar)->{store}, 0;
+    ok $copy2, 'string';
+}
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+    my ($class, $value) = @_;
+    return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+    my ($self) = @_;
+    $self->{fetch}++;
+    return $self->{value};
+}
+
+sub STORE {
+    my ($self, $value) = @_;
+    $self->{store}++;
+    $self->{value} = $value;
 }
 
 package foo;
diff --git a/dist/Devel-PPPort/t/Sv_set.t b/dist/Devel-PPPort/t/Sv_set.t
index 9dcf97951f..c1d5d05919 100644
--- a/dist/Devel-PPPort/t/Sv_set.t
+++ b/dist/Devel-PPPort/t/Sv_set.t
@@ -30,9 +30,9 @@ BEGIN {
     require 'testutil.pl' if $@;
   }
 
-  if (6) {
+  if (15) {
     load();
-    plan(tests => 6);
+    plan(tests => 15);
   }
 }
 
@@ -62,9 +62,44 @@ Devel::PPPort::TestSvSTASH_set($bar, 'bar');
 ok($bar->x(), 'hacker');
 
 if ( "$]" lt '5.007003' ) {
-    skip 'skip: no SV_NOSTEAL support', 0;
+    skip 'skip: no SV_NOSTEAL support', 0 for 1..10;
 } else {
     ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+
+    tie my $scalar, 'TieScalarCounter', 'string';
+
+    ok tied($scalar)->{fetch}, 0;
+    ok tied($scalar)->{store}, 0;
+    my $copy = Devel::PPPort::newSVsv_nomg($scalar);
+    ok tied($scalar)->{fetch}, 0;
+    ok tied($scalar)->{store}, 0;
+
+    my $fetch = $scalar;
+    ok tied($scalar)->{fetch}, 1;
+    ok tied($scalar)->{store}, 0;
+    my $copy2 = Devel::PPPort::newSVsv_nomg($scalar);
+    ok tied($scalar)->{fetch}, 1;
+    ok tied($scalar)->{store}, 0;
+    ok $copy2, 'string';
+}
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+    my ($class, $value) = @_;
+    return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+    my ($self) = @_;
+    $self->{fetch}++;
+    return $self->{value};
+}
+
+sub STORE {
+    my ($self, $value) = @_;
+    $self->{store}++;
+    $self->{value} = $value;
 }
 
 package foo;
-- 
2.11.0

@khwilliamson
Copy link
Contributor

@atoomic I think this is applied

@atoomic
Copy link
Member

atoomic commented Apr 18, 2022

indeed this was merged as Dual-Life/Devel-PPPort#64
we can close this case

@atoomic atoomic closed this as completed Apr 18, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants