# New Ticket Created by  "Chris Davaz" 
# Please include the string:  [perl #59184]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=59184 >


I have implemented the limit parameter on both Str.split(String,
Integer) and Str.split(Regex, Integer). In doing so I had to change
the method signature of Str.split(String) to ".sub 'split' :method
:multi(_, _)" from ".sub 'split' :method :multi('String')". The former
method signature is the correct one anyway as the latter just
restricts the invoker to being a 'String' and doesn't say anything
about the argument type.

All the tests except for one in split.p6 "pass" (verify by just
looking at the output). The one that doesn't pass is:

say 102030405.split(0).perl;

which produces:

["1.", "2", "3e+", "8"]

Note that this bug is not introduced by the patch, it was only
discovered because now we can do Int.split(Int).
Index: src/builtins/any-str.pir
===================================================================
--- src/builtins/any-str.pir	(revision 31332)
+++ src/builtins/any-str.pir	(working copy)
@@ -197,8 +197,10 @@
 .end
 
 .namespace['Any']
-.sub 'split' :method :multi('String')
+.sub 'split' :method :multi(_, _)
     .param string delim
+    .param int count        :optional
+    .param int has_count    :opt_flag
     .local string objst
     .local pmc pieces
     .local pmc tmps
@@ -214,6 +216,10 @@
     len = pieces
     i = 0
   loop:
+    unless has_count goto skip_count
+    dec count
+    if count < 0 goto done
+  skip_count:
     if i == len goto done
 
     tmps = new 'Perl6Str'
@@ -229,6 +235,8 @@
 
 .sub 'split' :method :multi(_, 'Sub')
     .param pmc regex
+    .param int count        :optional
+    .param int has_count    :opt_flag
     .local pmc match
     .local pmc retv
     .local int start_pos
@@ -244,6 +252,10 @@
     goto done
 
   loop:
+    unless has_count goto skip_count
+    dec count
+    if count < 0 goto done
+  skip_count:
     match = regex($S0, 'continue' => start_pos)
     end_pos = match.'from'()
     end_pos -= start_pos

Attachment: split.p6
Description: Binary data

Reply via email to