[perl #78462] Don't warn for splice(@a,MAX_LEN)
authorEric Brine <ikegami@adaelis.com>
Wed, 2 Mar 2011 22:30:17 +0000 (17:30 -0500)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 21 Jun 2011 15:37:57 +0000 (08:37 -0700)
The intent of splice(@a,MAX_LEN) is quite clearly to truncate
the array if it's too large. There's no reason to warn if it's
currently smaller than the max length.

pod/perldelta.pod
pp.c
t/lib/warnings/pp

index 8c2d3fd..b8f4cc2 100644 (file)
@@ -28,6 +28,11 @@ here, but most should go in the L</Performance Enhancements> section.
 
 [ List each enhancement as a =head2 entry ]
 
+=head2 C<splice()> doesn't warn when truncating
+
+You can now limit the size of an array using C<splice(@a,MAX_LEN)> without
+worrying about warnings.
+
 =head1 Security
 
 XXX Any security-related notices go here.  In particular, any security
diff --git a/pp.c b/pp.c
index 385f1be..d3d4cc8 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -5434,6 +5434,7 @@ S_deref_plain_array(pTHX_ AV *ary)
 PP(pp_splice)
 {
     dVAR; dSP; dMARK; dORIGMARK;
+    int num_args = (SP - MARK);
     register AV *ary = DEREF_PLAIN_ARRAY(MUTABLE_AV(*++MARK));
     register SV **src;
     register SV **dst;
@@ -5477,7 +5478,8 @@ PP(pp_splice)
        length = AvMAX(ary) + 1;
     }
     if (offset > AvFILLp(ary) + 1) {
-       Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
+       if (num_args > 2)
+           Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "splice() offset past end of array" );
        offset = AvFILLp(ary) + 1;
     }
     after = AvFILLp(ary) + 1 - (offset + length);
index d158144..2251b94 100644 (file)
@@ -46,6 +46,25 @@ EXPECT
 Attempt to use reference as lvalue in substr at - line 5.
 ########
 # pp.c
+use warnings 'misc' ;
+@a = qw( a b c );
+splice(@a, 4, 0, 'e') ;
+@a = qw( a b c );
+splice(@a, 4, 1) ;
+@a = qw( a b c );
+splice(@a, 4) ;
+no warnings 'misc' ;
+@a = qw( a b c );
+splice(@a, 4, 0, 'e') ;
+@a = qw( a b c );
+splice(@a, 4, 1) ;
+@a = qw( a b c );
+splice(@a, 4) ;
+EXPECT
+splice() offset past end of array at - line 4.
+splice() offset past end of array at - line 6.
+########
+# pp.c
 use warnings 'uninitialized' ;
 *x = *{ undef() };
 no warnings 'uninitialized' ;