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
  
  
  

Reply via email to