Index: runtime/parrot/library/TAP/Parser.pir
===================================================================
--- runtime/parrot/library/TAP/Parser.pir	(revision 45504)
+++ runtime/parrot/library/TAP/Parser.pir	(working copy)
@@ -686,9 +686,13 @@
     .return (str)
 .end
 
-.sub 'run' :method :lex
-    .param pmc result           :optional # only for test
-    .param int has_result       :opt_flag
+#.sub 'run' :method
+#  L1:
+#    $P0 = self.'next'()
+#    unless null $P0 goto L1
+#.end
+
+.sub 'next' :method :lex
     .local pmc stream, spool
     stream = getattribute self, 'stream'
     if null stream goto L1
@@ -706,22 +710,21 @@
     .local pmc token
     token = grammar.'tokenize'($S0)
     self.'next_state'(token)
-    unless has_result goto L4
-    push result, token
-  L4:
     $S0 = token.'type'()
     $P0 = self.'_callback_for'($S0)
-    if null $P0 goto L5
+    if null $P0 goto L4
     $P0(token)
-    goto L6
+    goto L5
+  L4:
+    self.'_make_callback'('ELSE', token)
   L5:
-    self.'_make_callback'('ELSE', token)
-  L6:
     self.'_make_callback'('ALL', token)
     spool = getattribute self, 'spool'
-    if null spool goto L2
+    if null spool goto L6
     $S0 = token
     print spool, $S0
+  L6:
+    .yield (token)
     goto L2
   L3:
     close stream
@@ -734,12 +737,13 @@
   L7:
     self.'_finish'()
     $I0 = self.'_make_callback'('EOF', self)
-    .return ()
+    null $P0
+    .return ($P0)
   L1:
     die "no stream"
 .end
 
-.sub 'next_state' :method :lex :outer('run')
+.sub 'next_state' :method :lex :outer('next')
     .param pmc token
     .local pmc STATES, st
     STATES = get_global ['TAP';'Parser'], 'STATES'
Index: t/library/tap_parser.t
===================================================================
--- t/library/tap_parser.t	(revision 45504)
+++ t/library/tap_parser.t	(working copy)
@@ -162,6 +162,37 @@
     is($P0, 12, "version")
 .end
 
+.sub '_get_results'
+    .param pmc parser
+    .local pmc result
+    result = new 'ResizablePMCArray'
+  L1:
+    $P0 = parser.'next'()
+    if null $P0 goto L2
+    diag($P0)
+    push result, $P0
+    goto L1
+  L2:
+    .return (result)
+.end
+
+.sub '__get_results'
+    .param pmc parser
+    .local pmc result
+    result = new 'ResizablePMCArray'
+    $P0 = get_hll_global ['TAP';'Parser'], 'next'
+    .local pmc coro
+    coro = new 'Coroutine', $P0
+  L1:
+    $P0 = coro(parser)
+    if null $P0 goto L2
+    diag($P0)
+    push result, $P0
+    goto L1
+  L2:
+    .return (result)
+.end
+
 .sub 'test_tap'
     .local pmc parser, result, token
     parser = new ['TAP';'Parser']
@@ -178,8 +209,7 @@
 ok 6 - you shall not pass! # TODO should have failed
 not ok 7 - Gandalf wins.  Game over.  # TODO 'bout time!
 END_TAP
-    result = new 'ResizablePMCArray'
-    parser.'run'(result)
+    result = _get_results(parser)
     $I0 = elements result
     is($I0, 11, "elements")
 
@@ -379,8 +409,7 @@
 
 ok 2 - read the rest of the file
 END_TAP
-    result = new 'ResizablePMCArray'
-    parser.'run'(result)
+    result = _get_results(parser)
     $I0 = elements result
     is($I0, 5, "elements")
 
