The attached patch is supposed to do two things:

   1.  Makes it possible to say ".flatten foo" as part of a
.pcc_begin_return/.pcc_end_return sequence.  Remarkably, this part of
the patch is only a one-line change; the internals for call & return are
closer than the syntax.

   2.  Makes ".flatten" equivalent to ".flatten_arg" for all other
purposes, to emphasize the similarity.

   Unfortunately, though this patch works as intended, it also has a
number of bizarre side-effects.  Here's the summary of failing tests:

    imcc/t/syn/macro.t    3   768    23    3  13.04%  11-12 23
    t/op/string_cs.t      9  2304    28    9  32.14%  1-2 8 20 23-26 28
    t/op/stringu.t        8  2048    14    8  57.14%  2-9
    t/pmc/eval.t          1   256     9    1  11.11%  4

The imcc/t/syn/macro.t failures (the ones I understand, anyway) are
because it won't accept "ok" as a macro parameter name -- it thinks "ok"
is a USTRINGC and not an IDENTIFIER; the t/pmc/eval.t case seems to be
similar.  The t/op/string_cs.t and t/op/stringu.t cases, on the other
hand, say

        error:imcc:syntax error, unexpected LABEL

at every point where it scans a "unicode:" or "ascii:" prefix.  FWIW,
all works well if I skip the lexer changes and just change pcc_return to
add "| FLATTEN target".

   So clearly something is busted in the lexer.  Either I made an error
(though that hardly seems likely, since the changes are so small), or I
didn't rebuild everything properly after changing imcc.y or imcc.l.
It's remotely conceivable that there's a bug in bison and/or flex (I'm
using the SuSE RPM versions bison-1.875-51.4 and flex-2.5.4a-293).

   Or it could be that something else is busted.  Unfortunately, I don't
have the expertise to nail it down, and am getting fed up after putting
in about 8 hours over the last five days.  Is there a yacc guru out
there who could please give me a hint?

   TIA,

                                        -- Bob Rogers
                                           http://rgrjr.dyndns.org/

Index: imcc/imcc.l
===================================================================
RCS file: /cvs/public/parrot/imcc/imcc.l,v
retrieving revision 1.124
diff -u -r1.124 imcc.l
--- imcc/imcc.l 28 Feb 2005 10:41:18 -0000      1.124
+++ imcc/imcc.l 21 Mar 2005 02:20:34 -0000
@@ -193,6 +193,7 @@
 
 ".sym"          return(LOCAL);
 ".arg"          return(ARG);
+".flatten"      return(FLATTEN);
 ".flatten_arg"  return(FLATTEN_ARG);
 ".sub"          return(SUB);
 ".end"          return(ESUB);
Index: imcc/imcc.y
===================================================================
RCS file: /cvs/public/parrot/imcc/imcc.y,v
retrieving revision 1.154
diff -u -r1.154 imcc.y
--- imcc/imcc.y 30 Nov 2004 09:35:10 -0000      1.154
+++ imcc/imcc.y 21 Mar 2005 02:20:35 -0000
@@ -332,7 +332,7 @@
 %nonassoc <t> PARAM
 
 %token <t> PRAGMA
-%token <t> CALL GOTO ARG FLATTEN_ARG IF UNLESS END SAVEALL RESTOREALL
+%token <t> CALL GOTO ARG FLATTEN_ARG FLATTEN IF UNLESS END SAVEALL RESTOREALL
 %token <t> NEW NEWSUB NEWCLOSURE NEWCOR NEWCONT
 %token <t> NAMESPACE ENDNAMESPACE CLASS ENDCLASS FIELD DOT_METHOD
 %token <t> SUB SYM LOCAL CONST
@@ -719,6 +719,9 @@
 
 pcc_arg:
      ARG var                           {  $$ = $2; }
+   | FLATTEN target                    { $2->type |= VT_FLATTEN; $$ = $2; }
+   /* .flatten is preferred, for symmetry with pcc_return, but .flatten_arg is
+      accepted for backwards compatibility. */
    | FLATTEN_ARG target                {  $2->type |= VT_FLATTEN; $$ = $2; }
    ;
 
@@ -765,6 +768,7 @@
 
 pcc_return:
      RETURN var    {  $$ = $2; }
+   | FLATTEN target                {  $2->type |= VT_FLATTEN; $$ = $2; }
    ;
 
 pcc_return_many:
@@ -1088,6 +1092,9 @@
 arg:
      var
                    { $$ = $1; }
+   | FLATTEN target                    { $2->type |= VT_FLATTEN; $$ = $2; }
+   /* .flatten is preferred, for symmetry with pcc_return, but .flatten_arg is
+      accepted for backwards compatibility. */
    | FLATTEN_ARG target
                    { $2->type |= VT_FLATTEN; $$ = $2; }
    ;
Index: imcc/t/syn/tail.t
===================================================================
RCS file: /cvs/public/parrot/imcc/t/syn/tail.t,v
retrieving revision 1.2
diff -u -r1.2 tail.t
--- imcc/t/syn/tail.t   4 Mar 2005 17:49:04 -0000       1.2
+++ imcc/t/syn/tail.t   21 Mar 2005 02:20:35 -0000
@@ -3,7 +3,7 @@
 # $Id: tail.t,v 1.2 2005/03/04 17:49:04 bernhard Exp $
 
 use strict;
-use Parrot::Test tests => 3;
+use Parrot::Test tests => 4;
 
 ##############################
 # Parrot Calling Conventions:  Tail call optimization.
@@ -271,3 +271,67 @@
 [doing _funcall]
 _fib_step returned 3 values, 23, 20, and 3.
 OUT
+
+pir_output_is(<<'CODE', <<'OUT', ".flatten_arg in return");
+
+.sub _main @MAIN
+
+       $P1 = new PerlInt
+       $P1 = 20
+       $P2 = new PerlInt
+       $P2 = 3
+       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
+
+       $I33 = defined function
+       unless $I33 goto bad_func
+doit:
+       .pcc_begin prototyped
+       .flatten_arg argv
+       .pcc_call function
+       .pcc_end
+       $P35 = foldup
+        $I35 = $P35
+        print "[got "
+        print $I35
+        print " results]\n"
+       .pcc_begin_return
+       .flatten $P35
+       .pcc_end_return
+bad_func:
+       printerr "_funcall:  Bad function.\n"
+       die
+.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
+[got 3 results]
+_fib_step returned 3 values, 23, 20, and 3.
+OUT

Reply via email to