cvsuser 05/02/28 00:30:36
Modified: . MANIFEST
Added: imcc/t/syn tail.t
Log:
check_tail_call: test
Courtesy of Bob Rogers <[EMAIL PROTECTED]>
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
@@ -1872,6 +1872,7 @@
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 @MAIN
$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 @MAIN
$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 @MAIN
$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