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


Hello.

Trivial and initial implementation of StrPos attached.

-- 
Bacek
diff --git a/languages/perl6/src/builtins/any-str.pir 
b/languages/perl6/src/builtins/any-str.pir
index 3516a44..ba56169 100644
--- a/languages/perl6/src/builtins/any-str.pir
+++ b/languages/perl6/src/builtins/any-str.pir
@@ -46,6 +46,7 @@ the size of that file down and to emphasize their generic,
     .param int pos             :optional
     .param int has_pos         :opt_flag
     .local pmc retv
+    .local pmc strposproto
 
     if has_pos goto have_pos
     pos = 0
@@ -54,6 +55,8 @@ the size of that file down and to emphasize their generic,
     .local string s
     s = self
 
+    strposproto = get_hll_global 'StrPos'
+
   check_substring:
     if substring goto substring_search
     $I0 = length s
@@ -66,12 +69,11 @@ the size of that file down and to emphasize their generic,
     if pos < 0 goto fail
 
   done:
-    $P0 = new 'Int'
-    $P0 = pos
+    $P0 = strposproto.'new'('pos'=>pos)
     .return ($P0)
 
   fail:
-    $P0 = new 'Failure'
+    $P0 = strposproto.'new'()
     .return ($P0)
 .end
 
diff --git a/languages/perl6/src/classes/Str.pir 
b/languages/perl6/src/classes/Str.pir
index bc36b82..c058c6a 100644
--- a/languages/perl6/src/classes/Str.pir
+++ b/languages/perl6/src/classes/Str.pir
@@ -9,6 +9,8 @@ Str - Perl 6 Str class and related functions
 This file sets up the C<Perl6Str> PMC type (from F<src/pmc/perl6str.pmc>)
 as the Perl 6 C<Str> class.
 
+Also implements StrPos type as described in S29.
+
 =head1 Methods
 
 =over 4
@@ -20,7 +22,7 @@ as the Perl 6 C<Str> class.
 .include 'cclass.pasm'
 
 .sub 'onload' :anon :init :load
-    .local pmc p6meta, strproto
+    .local pmc p6meta, strproto, strposproto
     p6meta = get_hll_global ['Perl6Object'], '$!P6META'
     strproto = p6meta.'new_class'('Str', 'parent'=>'Perl6Str Any')
     p6meta.'register'('Perl6Str', 'parent'=>strproto, 'protoobject'=>strproto)
@@ -28,6 +30,8 @@ as the Perl 6 C<Str> class.
 
     $P0 = get_hll_namespace ['Str']
     '!EXPORT'('sprintf', 'from'=>$P0)
+    
+    strproto = p6meta.'new_class'('StrPos', 'parent'=>'Any', 'attr'=>'$!pos')
 .end
 
 
@@ -451,10 +455,6 @@ Note: Most users should just let their I/O handles 
autochomp instead.
 
 This word is banned in Perl 6.  You must specify units.
 
-=item index
-
-Needs to be in terms of StrPos, not Int.
-
 =item pack
 
 =item pos
@@ -482,6 +482,77 @@ Should replace vec with declared arrays of bit, uint2, 
uint4, etc.
 
 =cut
 
+.namespace ['StrPos']
+
+=over
+
+=item get_bool
+
+=cut
+
+.sub 'get_bool' :vtable :method
+    .local pmc pos
+    pos = getattribute self, '$!pos'
+    $I0 = defined pos
+    .return ($I0)
+.end
+
+=item defined
+
+Synonim for C<get_bool>
+
+=cut
+
+.sub 'defined' :vtable :method
+    # Tailcall is broken...
+    # .return self.'get_bool'()
+    $I0 = self.'get_bool'()
+    .return ($I0)
+.end
+
+=item get_pos
+
+Get stored position with defaulting to 0 and issuing warning if undefined.
+
+=cut
+
+.sub 'get_pos' :method
+    .local pmc pos
+    pos = getattribute self, '$!pos'
+    $I0 = defined pos
+    if $I0 goto ret_val
+    # TODO Issue warning or call fail() 
+    pos = 0
+  ret_val:
+    .return (pos)
+.end
+
+=item get_integer
+
+Integer version of C<get_pos>
+
+=cut
+
+.sub 'get_integer' :vtable :method
+    $P0 = self.'get_pos'()
+    $I0 = $P0
+    .return ($I0)
+.end
+
+=item get_string
+
+String version of C<get_pos>
+
+=cut
+
+.sub 'get_string' :vtable :method
+    $P0 = self.'get_pos'()
+    $S0 = $P0
+    .return ($S0)
+.end
+
+=back
+
 # Local Variables:
 #   mode: pir
 #   fill-column: 100

Reply via email to