]> git.vpit.fr Git - perl/modules/Variable-Magic.git/commitdiff
Introduce VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID to cover unshift no longer calling...
authorVincent Pit <vince@profvince.com>
Thu, 27 Nov 2008 23:03:07 +0000 (00:03 +0100)
committerVincent Pit <vince@profvince.com>
Thu, 27 Nov 2008 23:16:33 +0000 (00:16 +0100)
Magic.xs
lib/Variable/Magic.pm
t/01-import.t
t/31-array.t

index 3df5970c6508db8bb94e1e11c8f8e1789dd71ab5..b4867605f663a9ed86efe80a24a64b807cd1cb5d 100644 (file)
--- a/Magic.xs
+++ b/Magic.xs
@@ -127,6 +127,13 @@ STATIC SV *vmg_clone(pTHX_ SV *sv, tTHX owner) {
 # define VMG_COMPAT_ARRAY_PUSH_NOLEN 0
 #endif
 
+/* Applied to dev-5.11 as 34908 */
+#if VMG_HAS_PERL_MAINT(5, 11, 0, 34908)
+# define VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID 1
+#else
+# define VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID 0
+#endif
+
 /* Applied to dev-5.9 as 31473 (see #43357), integrated to maint-5.8 as 32542 */
 #if VMG_HAS_PERL_MAINT(5, 8, 9, 32542) || VMG_HAS_PERL_MAINT(5, 9, 5, 31473) || VMG_HAS_PERL(5, 10, 0)
 # define VMG_COMPAT_ARRAY_UNDEF_CLEAR 1
@@ -868,6 +875,8 @@ BOOT:
  newCONSTSUB(stash, "VMG_UVAR",  newSVuv(VMG_UVAR));
  newCONSTSUB(stash, "VMG_COMPAT_ARRAY_PUSH_NOLEN",
                     newSVuv(VMG_COMPAT_ARRAY_PUSH_NOLEN));
+ newCONSTSUB(stash, "VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID",
+                    newSVuv(VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID));
  newCONSTSUB(stash, "VMG_COMPAT_ARRAY_UNDEF_CLEAR",
                     newSVuv(VMG_COMPAT_ARRAY_UNDEF_CLEAR));
  newCONSTSUB(stash, "VMG_COMPAT_SCALAR_LENGTH_NOLEN",
index 46e7ac3093076d1675b85d0f26b05b8786246675..59cf2995d4fc63470ed205b665a4ff4500ce1c47 100644 (file)
@@ -195,6 +195,8 @@ B<5.11.x>
 
 I<p32969> : 'len' magic is no longer invoked when calling C<length> with a magical scalar.
 
+I<p34908> : 'len' magic is no longer called when pushing / unshifting an element into a magical array in void context. The C<push> part was already covered by I<p25854>.
+
 =back
 
 =head1 CONSTANTS
@@ -231,6 +233,10 @@ When this constant is true, you can use the C<fetch,store,exists,delete> callbac
 
 True for perls that don't call 'len' magic when you push an element in a magical array.
 
+=head2 C<VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID>
+
+True for perls that don't call 'len' magic when you unshift in void context an element in a magical array.
+
 =head2 C<VMG_COMPAT_ARRAY_UNDEF_CLEAR>
 
 True for perls that call 'clear' magic when undefining magical arrays.
@@ -377,7 +383,7 @@ our @EXPORT         = ();
 our %EXPORT_TAGS    = (
  'funcs' =>  [ qw/wizard gensig getsig cast getdata dispell/ ],
  'consts' => [ qw/SIG_MIN SIG_MAX SIG_NBR MGf_COPY MGf_DUP MGf_LOCAL VMG_UVAR/,
-               qw/VMG_COMPAT_ARRAY_PUSH_NOLEN VMG_COMPAT_ARRAY_UNDEF_CLEAR/,
+               qw/VMG_COMPAT_ARRAY_PUSH_NOLEN VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID VMG_COMPAT_ARRAY_UNDEF_CLEAR/,
                qw/VMG_COMPAT_SCALAR_LENGTH_NOLEN/,
                qw/VMG_PERL_PATCHLEVEL/,
                qw/VMG_THREADSAFE/ ]
index 05f7e9bb279c47020fdc5355071b31a361bc8f28..1b9f066803a6f634ce1c502e6be1b0d969f0646b 100644 (file)
@@ -3,11 +3,11 @@
 use strict;
 use warnings;
 
-use Test::More tests => 18;
+use Test::More tests => 19;
 
 require Variable::Magic;
 
-for (qw/wizard gensig getsig cast getdata dispell SIG_MIN SIG_MAX SIG_NBR MGf_COPY MGf_DUP MGf_LOCAL VMG_UVAR VMG_COMPAT_ARRAY_PUSH_NOLEN VMG_COMPAT_ARRAY_UNDEF_CLEAR VMG_COMPAT_SCALAR_LENGTH_NOLEN VMG_PERL_PATCHLEVEL VMG_THREADSAFE/) {
+for (qw/wizard gensig getsig cast getdata dispell SIG_MIN SIG_MAX SIG_NBR MGf_COPY MGf_DUP MGf_LOCAL VMG_UVAR VMG_COMPAT_ARRAY_PUSH_NOLEN VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID VMG_COMPAT_ARRAY_UNDEF_CLEAR VMG_COMPAT_SCALAR_LENGTH_NOLEN VMG_PERL_PATCHLEVEL VMG_THREADSAFE/) {
  eval { Variable::Magic->import($_) };
  is($@, '', 'import ' . $_);
 }
index 9f49f2e2863b670b45fa64d205b964503038501c..bc942c7d55e99204bcd61ee457e1be0622c0915b 100644 (file)
@@ -3,9 +3,9 @@
 use strict;
 use warnings;
 
-use Test::More tests => 21;
+use Test::More tests => 24;
 
-use Variable::Magic qw/wizard cast dispell VMG_COMPAT_ARRAY_PUSH_NOLEN VMG_COMPAT_ARRAY_UNDEF_CLEAR/;
+use Variable::Magic qw/wizard cast dispell VMG_COMPAT_ARRAY_PUSH_NOLEN VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID VMG_COMPAT_ARRAY_UNDEF_CLEAR/;
 
 my @c = (0) x 12;
 my @x = (0) x 12;
@@ -66,15 +66,23 @@ check('array : assign new element');
 
 push @a, 'x';
 ++$x[1]; ++$x[2] unless VMG_COMPAT_ARRAY_PUSH_NOLEN;
-check('array : push');
+check('array : push (void)');
+
+$b = push @a, 'x';
+++$x[1]; ++$x[2] unless VMG_COMPAT_ARRAY_PUSH_NOLEN;
+check('array : push (scalar)');
 
 pop @a;
 ++$x[1]; ++$x[2];
 check('array : pop');
 
 unshift @a, 'x';
+++$x[1]; ++$x[2] unless VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID;
+check('array : unshift (void)');
+
+$b = unshift @a, 'x';
 ++$x[1]; ++$x[2];
-check('array : unshift');
+check('array : unshift (scalar)');
 
 shift @a;
 ++$x[1]; ++$x[2];
@@ -82,10 +90,14 @@ check('array : shift');
 
 $b = @a;
 ++$x[2];
-check('array : length');
+check('array : length @');
+
+$b = $#a;
+++$x[2];
+check('array : length $#');
 
 @a = map ord, @a; 
-$x[1] += 4; ++$x[2]; ++$x[3];
+$x[1] += 6; ++$x[2]; ++$x[3];
 check('array : map');
 
 @b = grep { defined && $_ >= ord('b') } @a;
@@ -93,7 +105,7 @@ check('array : map');
 check('array : grep');
 
 for (@a) { }
-$x[2] += 5;
+$x[2] += 7;
 check('array : for');
 
 {