PERL CVS PARROT 34 CVS COMMIT PARROT IMCC T SYN TAIL T
Date: 28 Feb 2005 08:30:37 -0000

Subject: cvs commit: parrot/imcc/t/syn tail.t
From: leo@no-spam (Leopold Toetsch)

cvsuser 05/02/28 00:30:36

Modified: . MANIFEST Added: imcc/t/syn tail.t Log:
check_tail_call: test Courtesy of Bob Rogers <rogers-perl6@no-spam>
Revision Changes Path 1.834 +1 -0 parrot/MANIFEST Index: MANIFEST ===================================================================
RCS file: /cvs/public/parrot/MANIFEST,v retrieving revision 1.833
retrieving revision 1.834
diff -u -r1.833 -r1.834
--- MANIFEST 23 Feb 2005 23:27:27 -0000 1.833
+++ MANIFEST 28 Feb 2005 08:30:35 -0000 1.834
@@no-spam -1872,6 +1872,7 @@no-spam imcc/t/syn/pcc.t []
imcc/t/syn/pod.t []
imcc/t/syn/scope.t []
+imcc/t/syn/tail.t []
imcc/unit.h []
include/parrot/autoprefix.h [devel]include include/parrot/caches.h [devel]include 1.1 parrot/imcc/t/syn/tail.t Index: tail.t ===================================================================
#!perl use strict;
use TestCompiler tests => 3;
##############################
# Parrot Calling Conventions: Tail call optimization.
$ENV{TEST_PROG_ARGS} = '-Oc';
output_is(<<'CODE', <<'OUT', "tail call optimization, final position");
.sub _main @no-spam $P1 = new PerlInt $P1 = 20
$P2 = new PerlInt $P2 = 3
newsub $P99, .Sub, _floor ($P3, $P4) = _funcall($P99, $P1, $P2)
print "_floor returned "
print argcP print " values, "
print $P3
print " and "
print $P4
print ".\n"
newsub $P98, .Sub, _fib_step ($P3, $P4, $P5) = _funcall($P98, $P1, $P2)
print "_fib_step returned "
print argcP print " values, "
print $P3
print ", "
print $P4
print ", and "
print $P5
print ".\n"
.end .sub _funcall non_prototyped .param pmc function .local pmc argv argv = foldup 1
print "[doing _funcall]\n"
$I33 = defined function if $I33 goto doit bad_func:
printerr "_funcall: Bad function.\n"
die doit:
.pcc_begin prototyped .flatten_arg argv .pcc_call function .pcc_end .pcc_begin_return .pcc_end_return .end ## Return quotient and remainder as two integers.
.sub _floor .param pmc arg1
.param pmc arg2
$P1 = new PerlInt $P1 = arg1 / arg2
## truncate.
$I1 = $P1
$P1 = $I1
$P2 = new PerlInt $P2 = arg1 % arg2
.pcc_begin_return .return $P1
.return $P2
.pcc_end_return .end ## Return the sum and the two arguments as three integers.
.sub _fib_step .param pmc arg1
.param pmc arg2
$P1 = new PerlInt $P1 = arg1 + arg2
.pcc_begin_return .return $P1
.return arg1
.return arg2
.pcc_end_return .end CODE [doing _funcall]
_floor returned 2 values, 6 and 2.
[doing _funcall]
_fib_step returned 3 values, 23, 20, and 3.
OUT output_is(<<'CODE', <<'OUT', "tail call optimization, intermediate position");

.sub _main @no-spam $P1 = new PerlInt $P1 = 20
$P2 = new PerlInt $P2 = 3
newsub $P99, .Sub, _floor ($P3, $P4) = _funcall($P99, $P1, $P2)
print "_floor returned "
print argcP print " values, "
print $P3
print " and "
print $P4
print ".\n"
newsub $P98, .Sub, _fib_step ($P3, $P4, $P5) = _funcall($P98, $P1, $P2)
print "_fib_step returned "
print argcP print " values, "
print $P3
print ", "
print $P4
print ", and "
print $P5
print ".\n"
.end .sub _funcall non_prototyped .param pmc function .local pmc argv argv = foldup 1
print "[doing _funcall]\n"
$I33 = defined function unless $I33 goto bad_func doit:
.pcc_begin prototyped .flatten_arg argv .pcc_call function .pcc_end .pcc_begin_return .pcc_end_return bad_func:
printerr "_funcall: Bad function.\n"
die .end ## Return quotient and remainder as two integers.
.sub _floor .param pmc arg1
.param pmc arg2
$P1 = new PerlInt $P1 = arg1 / arg2
## truncate.
$I1 = $P1
$P1 = $I1
$P2 = new PerlInt $P2 = arg1 % arg2
.pcc_begin_return .return $P1
.return $P2
.pcc_end_return .end ## Return the sum and the two arguments as three integers.
.sub _fib_step .param pmc arg1
.param pmc arg2
$P1 = new PerlInt $P1 = arg1 + arg2
.pcc_begin_return .return $P1
.return arg1
.return arg2
.pcc_end_return .end CODE [doing _funcall]
_floor returned 2 values, 6 and 2.
[doing _funcall]
_fib_step returned 3 values, 23, 20, and 3.
OUT output_is(<<'CODE', <<'OUT', "tail call optimization, implicit final return");

.sub _main @no-spam $P1 = new PerlInt $P1 = 20
$P2 = new PerlInt $P2 = 3
newsub $P99, .Sub, _floor ($P3, $P4) = _funcall($P99, $P1, $P2)
print "_floor returned "
print argcP print " values, "
print $P3
print " and "
print $P4
print ".\n"
newsub $P98, .Sub, _fib_step ($P3, $P4, $P5) = _funcall($P98, $P1, $P2)
print "_fib_step returned "
print argcP print " values, "
print $P3
print ", "
print $P4
print ", and "
print $P5
print ".\n"
.end .sub _funcall non_prototyped .param pmc function .local pmc argv argv = foldup 1
print "[doing _funcall]\n"
$I33 = defined function if $I33 goto doit bad_func:
printerr "_funcall: Bad function.\n"
die doit:
.pcc_begin prototyped .flatten_arg argv .pcc_call function .pcc_end .end ## Return quotient and remainder as two integers.
.sub _floor .param pmc arg1
.param pmc arg2
$P1 = new PerlInt $P1 = arg1 / arg2
## truncate.
$I1 = $P1
$P1 = $I1
$P2 = new PerlInt $P2 = arg1 % arg2
.pcc_begin_return .return $P1
.return $P2
.pcc_end_return .end ## Return the sum and the two arguments as three integers.
.sub _fib_step .param pmc arg1
.param pmc arg2
$P1 = new PerlInt $P1 = arg1 + arg2
.pcc_begin_return .return $P1
.return arg1
.return arg2
.pcc_end_return .end CODE [doing _funcall]
_floor returned 2 values, 6 and 2.
[doing _funcall]
_fib_step returned 3 values, 23, 20, and 3.
OUT