fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / filehandle.t
blob14dec85e6c146ef35034604e12d1d2ea49bbc144
1 #!perl
2 # Copyright (C) 2006-2010, Parrot Foundation.
3 # $Id$
5 use strict;
6 use warnings;
7 use lib qw( . lib ../lib ../../lib );
9 use Test::More;
10 use Parrot::Test tests => 23;
11 use Parrot::Test::Util 'create_tempfile';
12 use Parrot::Test::Util 'create_tempfile';
14 =head1 NAME
16 t/pmc/filehandle.t - test the FileHandle PMC
18 =head1 SYNOPSIS
20     % prove t/pmc/filehandle.t
22 =head1 DESCRIPTION
24 Tests the FileHandle PMC.
26 =cut
28 # L<PDD22/I\/O PMC API/=item new>
29 pir_output_is( <<'CODE', <<'OUT', 'new' );
30 .sub 'test' :main
31     $P0 = new ['FileHandle']
32     say "ok 1 - $P0 = new ['FileHandle']"
33 .end
34 CODE
35 ok 1 - $P0 = new ['FileHandle']
36 OUT
38 my (undef, $temp_file) = create_tempfile( UNLINK => 1 );
40 # L<PDD22/I\/O PMC API/=item open.*=item close>
41 pir_output_is( <<"CODE", <<'OUT', 'open and close - synchronous' );
42 .sub 'test' :main
43     .local int i
44     \$P1 = new ['FileHandle']
45     \$P1.'open'('README')
46     say 'ok 1 - \$P1.open(\$S1)'
48     \$P1.'close'()
49     say 'ok 2 - \$P1.close()'
51     \$P3 = new ['FileHandle']
52     \$P3.'open'('$temp_file', 'rw')
53     say 'ok 3 - \$P3.open(\$S1, \$S2) # rw mode'
54     \$P3.'close'()
56     \$P3.'open'()
57     say 'ok 4 - \$P3.open()         # reopening'
58     \$P3.'close'()
60   test_5:
61     \$P5 = new ['FileHandle']
62     push_eh eh_bad_file_1
63     \$P5.'open'('bad.file')
64     pop_eh
66   test_6:
67     \$P6 = new ['FileHandle']
68     push_eh eh_bad_file_2
69     \$P6.'open'('bad.file', 'r')
70     pop_eh
72   test_7:
73     \$P7 = new ['FileHandle']
74     \$P7.'open'('$temp_file', 'w')
75     say 'ok 7 - \$P7.open(\$S1, \$S2) # new file, write mode succeeds'
77     i = \$P7.'is_closed'()
78     print 'is_closed: '
79     say i
80     \$P7.'close'()
81     i = \$P7.'is_closed'()
82     print 'is_closed after close: '
83     say i
85     goto end
87   eh_bad_file_1:
88     say 'ok 5 - \$P5.open(\$S1)      # with bad file'
89     goto test_6
91   eh_bad_file_2:
92     say "ok 6 - \$P6.open(\$S1, \$S2) # with bad file"
93     goto test_7
95   end:
96 .end
97 CODE
98 ok 1 - $P1.open($S1)
99 ok 2 - $P1.close()
100 ok 3 - $P3.open($S1, $S2) # rw mode
101 ok 4 - $P3.open()         # reopening
102 ok 5 - $P5.open($S1)      # with bad file
103 ok 6 - $P6.open($S1, $S2) # with bad file
104 ok 7 - $P7.open($S1, $S2) # new file, write mode succeeds
105 is_closed: 0
106 is_closed after close: 1
109 pir_output_is( <<'CODE', <<'OUT', 'wrong open' );
110 .include 'except_types.pasm'
112 .sub main :main
113     .local pmc fh, eh
114     .local int i
115     i = 1
116     eh = new['ExceptionHandler']
117     eh = .EXCEPTION_PIO_ERROR
118     set_addr eh, catchnoname
119     push_eh eh
120     fh = new['FileHandle']
121     # Open without filename
122     fh.'open'()
123     i = 0
124     goto reportnoname
125   catchnoname:
126     finalize eh
127   reportnoname:
128     say i
130     i = 0
131     set_addr eh, catchreopen
132     fh.'open'('README')
133     i = 1
134     # Open already opened
135     fh.'open'('README')
136     i = 0
137     goto reportreopen
138   catchreopen:
139     finalize eh
140   reportreopen:
141     say i
142     pop_eh
143 .end
144 CODE
149 pir_output_is( <<'CODE', <<'OUT', 'isatty' );
150 .sub 'test' :main
151     .local pmc fh
152     .local int i
153     fh = new ['FileHandle']
154     i = fh.'isatty'()
155     print i
156     say ' unopened FileHandle is not a tty'
157     fh.'open'('README')
158     i = fh.'isatty'()
159     print i
160     say ' regular file is not a tty'
161 .end
162 CODE
163 0 unopened FileHandle is not a tty
164 0 regular file is not a tty
167 SKIP: {
168     skip 'no asynch calls yet' => 1;
170     pir_output_is( <<'CODE', <<'OUT', 'open and close - asynchronous' );
171 .sub 'test' :main
172     $P1 = # TT #1204 create a callback here
173     $P0 = new ['FileHandle']
175     $P0.'open'('README')
176     say 'ok 1 - $P0.open($S1)'
178     $P0.'close'()
179     say 'ok 2 - $P0.close($P1)'
181     $P0.'open'('README', 'rw')
182     say 'ok 3 - $P0.open($S1, $S2)'
184     $P0.'close'()
185     $P0.'open'()
186     say 'ok 4 - $P0.open()'
188   cleanup:
189     $P0.'close'()
190 .end
191 CODE
192 ok 1 - $P0.open($S1)
193 ok 2 - $P0.close()
194 ok 3 - $P0.open($S1, $S2)
195 ok 4 - $P0.open()
199 # L<PDD22/I\/O PMC API/=item read>
200 pir_output_is(
201     <<'CODE', <<'OUT', 'read - synchronous' );
202 .sub 'test' :main
203     $P0 = new ['FileHandle']
204     $P0.'open'('README')
206     $S0 = $P0.'read'(14) # bytes
207     if $S0 == 'This is Parrot' goto ok_1
208     print 'not '
209   ok_1:
210     say 'ok 1 - $S0 = $P1.read($I2)'
212     $S0 = $P0.'read'(9)  # bytes
213     if $S0 == ', version' goto ok_2
214     print 'not '
215   ok_2:
216     say 'ok 2 - $S0 = $P1.read($I2) # again on same stream'
217 .end
218 CODE
219 ok 1 - $S0 = $P1.read($I2)
220 ok 2 - $S0 = $P1.read($I2) # again on same stream
223 # L<PDD22/I\/O PMC API/=item print>
224 pir_output_is( <<"CODE", <<'OUT', 'print - synchronous' );
225 .sub 'test' :main
227     \$P0 = new ['FileHandle']
228     \$P0.'open'('$temp_file', 'w')
230     \$P0.'print'(123)
231     say 'ok 1 - \$P0.print(\$I1)'
232     \$P0.'print'(456.789)
233     say 'ok 2 - \$P0.print(\$N1)'
234     \$P0.'print'("squawk\\n")
235     say 'ok 3 - \$P0.print(\$S1)'
236     \$P1 = new ['Integer']
237     \$P1 = 42
238     \$P0.'print'(\$P1)
239     say 'ok 4 - \$P0.print(\$P1)'
241     \$P0.'close'()
243     \$P1 = new ['FileHandle']
244     \$P1.'open'('$temp_file', 'r')
246     \$S0 = \$P1.'read'(3) # bytes
247     if \$S0 == "123" goto ok_5
248     print 'not '
249   ok_5:
250     say 'ok 5 - read integer back from file'
252     \$S0 = \$P1.'read'(16) # bytes
253     if \$S0 == "456.789squawk\\n42" goto ok_6
254     say \$S0
256     print 'not '
257   ok_6:
258     say 'ok 6 - read string back from file'
260     \$P1.'close'()
261 .end
262 CODE
263 ok 1 - $P0.print($I1)
264 ok 2 - $P0.print($N1)
265 ok 3 - $P0.print($S1)
266 ok 4 - $P0.print($P1)
267 ok 5 - read integer back from file
268 ok 6 - read string back from file
271 (undef, $temp_file) = create_tempfile( UNLINK => 1 );
273 # L<PDD22/I\/O PMC API/=item print.*=item readline>
274 pir_output_is( <<"CODE", <<'OUT', 'readline - synchronous' );
275 .sub 'test' :main
276     load_bytecode 'String/Utils.pbc'
277     .local pmc chomp
278                chomp = get_global ['String';'Utils'], 'chomp'
280     \$P0 = new ['FileHandle']
281     \$P0.'open'('$temp_file', 'w')
282     \$P0.'print'("foobarbaz\\n42")
283     \$P0.'close'()
285     \$P1 = new ['FileHandle']
286     \$P1.'open'('$temp_file')
288     \$S0 = \$P1.'readline'()
289     \$S0 = chomp( \$S0 )
290     if \$S0 == 'foobarbaz' goto ok_1
291     print 'not '
292   ok_1:
293     say 'ok 1 - \$S0 = \$P1.readline()'
295     \$S0 = \$P1.'readline'()
296     \$S0 = chomp( \$S0 )
297     if \$S0 == '42' goto ok_2
298     print 'not '
299   ok_2:
300     say 'ok 2 - \$S0 = \$P1.readline() # again on same stream'
302     \$P1.'close'()
303 .end
304 CODE
305 ok 1 - $S0 = $P1.readline()
306 ok 2 - $S0 = $P1.readline() # again on same stream
309 my $LINES;
310 ($LINES, $temp_file) = create_tempfile( UNLINK => 1 );
312 for my $counter (1 .. 10000) {
313     print $LINES $counter, "\n";
315 close $LINES;
317 pir_output_is( <<"CODE", <<'OUT', 'readline 10,000 lines' );
318 .sub 'test' :main
319     load_bytecode 'String/Utils.pbc'
320     .local pmc chomp
321                chomp = get_global ['String';'Utils'], 'chomp'
322     .local string test_line
323     .local pmc filehandle
324     .local int counter
325     filehandle = new ['FileHandle']
326     filehandle.'open'('$temp_file')
328     counter = 0
329   read_loop:
330     inc counter
331     # read in the file one line at a time...
332     \$I0 = filehandle.'eof'()
333     if \$I0 goto end_read_loop
335     test_line = filehandle.'readline'()
336     if test_line == "" goto end_read_loop
337     test_line = chomp( test_line )
338     \$I1 = test_line
339     if \$I1 == counter goto read_loop
340       print "not "
341 ## the following lines provide more extensive debugging
342 ## output on a readline failure
343 #      print counter
344 #      print " = "
345 #      print \$I1
346 #      print "\\n"
347 #      counter = \$I1
348 #      goto read_loop
350   end_read_loop:
351     if counter > 1 goto read_something
352       print "not "
353   read_something:
354     say 'ok 1 - read 10,000 lines'
355     filehandle.'close'()
356 .end
357 CODE
358 ok 1 - read 10,000 lines
362 # TT #1204 test reading long chunks, eof, and across newlines
364 # TT #1204 pir_output_is( <<'CODE', <<'OUT', 'print, read, and readline - asynchronous', todo => 'not yet implemented' );
366 # L<PDD22/I\/O PMC API/=item record_separator>
367 pir_output_is( <<'CODE', <<'OUT', 'record_separator', todo => 'not yet implemented' );
368 .sub 'test' :main
369     $P0 = new ['FileHandle']
371     $S0 = $P0.'record_separator'()
372     if $S0 == "\n" goto ok_1
373     print 'not '
374   ok_1:
375     say 'ok 1 - $S0 = $P1.record_separator() # default'
377     $S99 = 'abc'
378     $P0.'record_separator'($S99)
379     $S0 = $P0.'record_separator'()
380     if $S0 == $S99 goto ok_2
381     print 'not '
382   ok_2:
383     say 'ok 2 - $P0.record_separator($S1)'
385     $P0.'print'(123)
386     $S0 = $P0.'record_separator'()
387     $P0.'print'($S0)
388     $P0.'print'(456)
390     $S0 = $P0.'readline'()
391     if $S0 == '123abc' goto ok_3
392     print 'not '
393   ok_3:
394     say 'ok 3 - $P0.record_separator() # .readline works as expected'
395 .end
396 CODE
397 ok 1 - $S0 = $P1.record_separator() # default
398 ok 2 - $P0.record_separator($S1)
399 ok 3 - $P0.record_separator() # .readline works as expected
402 # L<PDD22/I\/O PMC API/=item buffer_type>
403 pir_output_is( <<'CODE', <<'OUT', 'buffer_type' );
404 .sub 'test' :main
405     $P0 = new ['FileHandle']
407     $P0.'buffer_type'('unbuffered')
408     $S0 = $P0.'buffer_type'()
409     if $S0 == 'unbuffered' goto ok_1
410     print 'not '
411   ok_1:
412     say 'ok 1 - $S0 = $P1.buffer_type() # unbuffered'
414     $P0.'buffer_type'('line-buffered')
415     $S0 = $P0.'buffer_type'()
416     if $S0 == 'line-buffered' goto ok_2
417     print 'not '
418   ok_2:
419     say 'ok 2 - $S0 = $P1.buffer_type() # line-buffered'
421     $P0.'buffer_type'('full-buffered')
422     $S0 = $P0.'buffer_type'()
423     if $S0 == 'full-buffered' goto ok_3
424     print 'not '
425   ok_3:
426     say 'ok 3 - $S0 = $P1.buffer_type() # full-buffered'
428 .end
429 CODE
430 ok 1 - $S0 = $P1.buffer_type() # unbuffered
431 ok 2 - $S0 = $P1.buffer_type() # line-buffered
432 ok 3 - $S0 = $P1.buffer_type() # full-buffered
435 # TT #1204 test effects of buffer_type, not just set/get
437 # TT #1177
438 # L<PDD22/I\/O PMC API/=item buffer_size>
439 # NOTES: try setting positive, zero, negative int
440 # perform print and read ops
441 # change buffer size while it contains data
442 # try with all 'buffer_type' modes
444 (undef, $temp_file) = create_tempfile( UNLINK => 1 );
446 pir_output_is( <<"CODE", <<'OUT', 'buffer_size' );
447 .sub 'test' :main
448     \$P0 = new ['FileHandle']
450     \$P0.'buffer_type'('full-buffered')
451     \$P0.'buffer_size'(42)
452     say 'ok 1 - \$P0.buffer_size(42)     # set buffer size'
454     \$I0 = \$P0.'buffer_size'()
456     # The set buffer size is a minimum, the I/O subsystem may scale it upward
457     # to a round block, so test that the buffer size is equal or greater than
458     # the set size.
459     if \$I0 >= 42 goto ok_2
460     print 'not '
461   ok_2:
462     say 'ok 2 - \$I0 = \$P0.buffer_size() # get buffer size'
464     \$P0.'open'('$temp_file', 'w')
466     \$P0.'print'(1234567890)
467     \$P0.'close'()
469     \$P1 = new ['FileHandle']
470     \$P1.'open'('$temp_file')
472     \$S0 = \$P1.'readline'()
474     if \$S0 == '1234567890' goto ok_3
475     print 'not '
476   ok_3:
477     say 'ok 3 - \$S0 = \$P0.readline()    # buffer flushed'
479     \$P1.'close'()
481 .end
482 CODE
483 ok 1 - $P0.buffer_size(42)     # set buffer size
484 ok 2 - $I0 = $P0.buffer_size() # get buffer size
485 ok 3 - $S0 = $P0.readline()    # buffer flushed
488 # L<PDD22/I\/O PMC API/=item encoding>
489 pir_output_is( <<'CODE', <<'OUT', 'encoding' );
490 .sub 'test' :main
491     $P0 = new ['FileHandle']
493     $P0.'encoding'('utf8')
494     $S0 = $P0.'encoding'()
495     if $S0 == 'utf8' goto ok_1
496     print 'not '
497   ok_1:
498     say 'ok 1 - $S0 = $P1.encoding() # utf8'
500 .end
501 CODE
502 ok 1 - $S0 = $P1.encoding() # utf8
505 (undef, $temp_file) = create_tempfile( UNLINK => 1 );
507 pir_output_is( <<"CODE", <<'OUT', 'encoding - read/write' );
508 .sub 'test' :main
509     \$P0 = new ['FileHandle']
510     \$P0.'encoding'('utf8')
512     \$P0.'open'('$temp_file', 'w')
514     \$P0.'print'(1234567890)
515     \$P0.'print'("\\n")
516     \$S0 = iso-8859-1:"TÖTSCH"
517     \$P0.'print'(\$S0)
518     \$P0.'close'()
520     \$P1 = new ['FileHandle']
521     \$P1.'encoding'('utf8')
523     \$P1.'open'('$temp_file')
525     .local string line
526     line = \$P1.'readline'()
527     if line == "1234567890\\n" goto ok_1
528 print line
529     print 'not '
530   ok_1:
531     say 'ok 1 - \$S1 = \$P1.readline() # read with utf8 encoding on'
533     line = \$P1.'readline'()
534     if line == \$S0 goto ok_2
535 print line
536     print 'not '
537   ok_2:
538     say 'ok 2 - \$S2 = \$P1.readline() # read iso-8859-1 string'
540     \$P1.'close'()
542     \$I1 = encoding line
543     \$S2 = encodingname \$I1
544     if \$S2 == 'utf8' goto ok_3
545     print \$S2
546     print 'not '
547   ok_3:
548     say 'ok 3 # utf8 encoding'
550 .end
551 CODE
552 ok 1 - $S1 = $P1.readline() # read with utf8 encoding on
553 ok 2 - $S2 = $P1.readline() # read iso-8859-1 string
554 ok 3 # utf8 encoding
558 (undef, $temp_file) = create_tempfile( UNLINK => 1 );
560 # L<PDD22/I\/O PMC API/=item mode>
561 pir_output_is( <<'CODE', <<'OUT', 'mode' );
562 .sub 'test' :main
563     $P0 = new ['FileHandle']
565     $P0.'open'('README')
566     $S0 = $P0.'mode'()
568     if $S0 == 'r' goto ok_1
569     print 'not '
570   ok_1:
571     say 'ok 1 - $S0 = $P0.mode() # get read mode'
573     $P0.'close'()
575 .end
576 CODE
577 ok 1 - $S0 = $P0.mode() # get read mode
580 pir_output_is( <<"CODE", <<"OUTPUT", "readall - closed filehandle" );
581 .sub main :main
582     \$S0 = <<"EOS"
583 line 1
584 line 2
585 line 3
587     .local pmc pio, pio2
588     pio = new ['FileHandle']
589     pio.'open'("$temp_file", "w")
590     pio.'print'(\$S0)
591     pio.'close'()
592     pio2 = new ['FileHandle']
593     \$S1 = pio2.'readall'('$temp_file')
594     if \$S0 == \$S1 goto ok
595     print "not "
597     say "ok"
598 .end
599 CODE
601 OUTPUT
603 pir_output_is( <<"CODE", <<"OUTPUT", "readall() - opened filehandle" );
604 .sub main :main
605     \$S0 = <<"EOS"
606 line 1
607 line 2
608 line 3
610     .local pmc pio, pio2
611     pio = new ['FileHandle']
612     pio.'open'("$temp_file", "w")
613     pio.'print'(\$S0)
614     pio.'close'()
616     pio2 = new ['FileHandle']
617     pio2.'open'("$temp_file", "r")
618     \$S1 = pio2.'readall'()
619     if \$S0 == \$S1 goto ok
620     print "not "
622     say "ok"
623 .end
624 CODE
626 OUTPUT
628 pir_output_is( <<'CODE', <<'OUTPUT', "readall - failure conditions" );
629 .include 'except_types.pasm'
630 .sub main :main
631     .local pmc fh, eh
632     fh = new ['FileHandle']
633     eh = new ['ExceptionHandler']
634     eh.'handle_types'(.EXCEPTION_PIO_ERROR)
635     set_addr eh, catch1
636     push_eh eh
637     # Using unopened FileHandle
638     fh.'readall'()
639     say 'should never happen'
640     goto test2
641   catch1:
642     finalize eh
643     say 'caught unopened'
644   test2:
645     set_addr eh, catch2
646     fh.'open'('README')
647     # Using opened FileHandle with the filepath option
648     fh.'readall'('README')
649     say 'should never happen'
650     goto end
651   catch2:
652     finalize eh
653     say 'caught reopen'
654   end:
655 .end
656 CODE
657 caught unopened
658 caught reopen
659 OUTPUT
661 pir_output_is( <<"CODE", <<"OUTPUT", "readall() - utf8 on closed filehandle" );
662 .sub 'main'
663     .local pmc ifh
664     ifh = new ['FileHandle']
665     ifh.'encoding'('utf8')
667     \$S0 = ifh.'readall'('$temp_file')
669     \$I0 = encoding \$S0
670     \$S1 = encodingname \$I0
672     say \$S1
673 .end
674 CODE
675 utf8
676 OUTPUT
678 pir_output_is( <<"CODE", <<"OUTPUT", "readall() - utf8 on opened filehandle" );
679 .sub 'main'
680     .local pmc ifh
681     ifh = new ['FileHandle']
682     ifh.'encoding'('utf8')
683     ifh.'open'('$temp_file')
685     \$S0 = ifh.'readall'()
687     \$I0 = encoding \$S0
688     \$S1 = encodingname \$I0
690     say \$S1
691 .end
692 CODE
693 utf8
694 OUTPUT
696 pir_output_is( <<'CODE', <<"OUTPUT", "exit status" );
697 .include 'iglobals.pasm'
698 .sub 'main'
699     .local pmc pipe, conf, interp
700     .local string cmd
702     interp = getinterp
703     conf = interp[.IGLOBALS_CONFIG_HASH]
705     cmd = conf['build_dir']
707     .local string aux
708     aux = conf['slash']
709     cmd .= aux
710     aux = conf['test_prog']
711     cmd .= aux
712     aux = conf['exe']
713     cmd .= aux
715     pipe = new ['FileHandle']
716     pipe.'open'(cmd, "rp")
717     pipe.'readall'()
718     pipe.'close'()
719     print "expect 0 exit status: "
720     $I0 = pipe.'exit_status'()
721     say $I0
723     cmd .= ' --this_is_not_a_valid_option'
724     pipe = new ['FileHandle']
725     pipe.'open'(cmd, "rp")
726     pipe.'readall'()
727     pipe.'close'()
728     print "expect 1 exit status: "
729     $I0 = pipe.'exit_status'()
730     $I0 = $I0 != 0
731     say $I0
733 .end
734 CODE
735 expect 0 exit status: 0
736 expect 1 exit status: 1
737 OUTPUT
739 pir_output_is( sprintf(<<'CODE', $temp_file), <<'OUTPUT', "timely destruction" );
740 .const string temp_file = '%s'
741 .sub main :main
742     interpinfo $I0, 2    # GC mark runs
743     $P0 = new ['FileHandle']
744     $P0.'open'(temp_file, 'w')
745         needs_destroy $P0
746     print $P0, "a line\n"
747     null $P0            # kill it
748     sweep 0            # a lazy GC has to close the PIO
749     $P0 = new ['FileHandle']
750     $P0.'open'(temp_file, 'r')
751     $S0 = $P0.'read'(20)
752     print $S0
753 .end
754 CODE
755 a line
756 OUTPUT
758 my (undef, $no_such_file) = create_tempfile( UNLINK => 1, OPEN => 0 );
760 pir_output_is( sprintf( <<'CODE', $no_such_file, $temp_file ), <<'OUTPUT', "get_bool" );
761 .const string no_such_file = '%s'
762 .const string temp_file    = '%s'
764 .sub main :main
765     push_eh read_non_existent_file
766     $P0 = new ['FileHandle']
767     $P0.'open'(no_such_file, 'r')
769     print "Huh: '"
770     print no_such_file
771     print "' exists? - not "
772 ok1:
773     say "ok 1"
775     $P0 = new ['FileHandle']
776     $P0.'open'(temp_file, 'w')
777     $P0.'print'("a line\n")
778     $P0.'print'("a line\n")
779     $P0.'close'()
781     $P0 = new ['FileHandle']
782     $P0.'open'(temp_file, 'r')
783     if $P0, ok2
784     print "not "
785 ok2:    say "ok 2"
786     $S0 = $P0.'read'(1024)
787     $S0 = $P0.'read'(1024)
788     unless $P0, ok3
789     print "not "
790 ok3:    say "ok 3"
791     defined $I0, $P0
792     if $I0, ok4
793     print "not "
794 ok4:    say "ok 4"
795     $P0.'close'()
796     defined $I0, $P0        # closed file is still defined
797     if $I0, ok5
798     print "not "
799 ok5:    say "ok 5"
800     unless $P0, ok6        # but false
801     print "not "
802 ok6:    say "ok 6"
803     .return ()
804 read_non_existent_file:
805     pop_eh
806     branch ok1
807 .end
808 CODE
809 ok 1
810 ok 2
811 ok 3
812 ok 4
813 ok 5
814 ok 6
815 OUTPUT
817 # TT #1178
818 # L<PDD22/I\/O PMC API/=item get_fd>
819 # NOTES: this is going to be platform dependent
821 # Local Variables:
822 #   mode: cperl
823 #   cperl-indent-level: 4
824 #   fill-column: 100
825 # End:
826 # vim: expandtab shiftwidth=4: