cvsuser     05/03/24 23:44:20

  Modified:    imcc     imcc.y symreg.c symreg.h
               imcc/t/syn pcc.t
  Log:
  MMD 6 - parse @MULTI types
  
  Revision  Changes    Path
  1.157     +26 -14    parrot/imcc/imcc.y
  
  Index: imcc.y
  ===================================================================
  RCS file: /cvs/public/parrot/imcc/imcc.y,v
  retrieving revision 1.156
  retrieving revision 1.157
  diff -u -r1.156 -r1.157
  --- imcc.y    24 Mar 2005 16:13:31 -0000      1.156
  +++ imcc.y    25 Mar 2005 07:44:19 -0000      1.157
  @@ -51,7 +51,7 @@
    */
   static Class * current_class;
   static Instruction * current_call;
  -static SymReg *cur_obj;
  +static SymReg *cur_obj, *cur_call;
   int cur_pmc_type;      /* used in mk_ident */
   IMC_Unit * cur_unit;
   SymReg *cur_namespace; /* ugly hack for mk_address */
  @@ -362,9 +362,9 @@
   %type <i> labels _labels label  statement sub_call
   %type <i> pcc_sub_call
   %type <sr> sub_param sub_params pcc_arg pcc_result pcc_args pcc_results
  -%type <sr> pcc_returns pcc_return pcc_call arg the_sub
  +%type <sr> pcc_returns pcc_return pcc_call arg the_sub multi_type
   %type <t> pcc_return_many
  -%type <t> pcc_proto pcc_sub_proto proto sub_proto multi
  +%type <t> pcc_proto pcc_sub_proto proto sub_proto multi multi_types
   %type <i> instruction assignment if_statement labeled_inst opt_label 
op_assign
   %type <i> func_assign
   %type <i> opt_invocant
  @@ -576,21 +576,18 @@
        sub_label_op_c
           {
             Instruction *i = iSUBROUTINE(cur_unit, $3);
  -          /*
  -           * $<sr>$ is the SymReg value of this action rule
  -           */
  -          i->r[1] = $<sr>$ = mk_pcc_sub(interp, str_dup(i->r[0]->name), 0);
  +          i->r[1] = cur_call = mk_pcc_sub(interp, str_dup(i->r[0]->name), 0);
             add_namespace(interp, cur_unit);
           }
  -     sub_proto '\n' { $<sr>4->pcc_sub->pragma = $5; }
  +     sub_proto '\n' { cur_call->pcc_sub->pragma = $5; }
        sub_params
  -     sub_body  ESUB { $$ = 0; }
  +     sub_body  ESUB { $$ = 0; cur_call = NULL; }
      ;
   
   sub_params:
        /* empty */                       { $$ = 0; } %prec LOW_PREC
      | '\n'                              { $$ = 0; }
  -   | sub_params sub_param '\n'         { add_pcc_param($<sr>-3, $2);}
  +   | sub_params sub_param '\n'         { add_pcc_param(cur_call, $2);}
      ;
   
   sub_param:
  @@ -606,7 +603,22 @@
      | multi          { $$ = P_NONE; }
      ;
   
  -multi: MULTI '(' ')'  { $$ = 0; }
  +multi: MULTI '(' multi_types ')'  { $$ = 0; }
  +   ;
  +
  +multi_types:
  +     /* empty */     { $$ = 0; }
  +   | multi_types COMMA multi_type { $$ = 0; add_pcc_multi(cur_call, $3); }
  +   | multi_type      { $$ = 0;  add_pcc_multi(cur_call, $1);}
  +   ;
  +
  +multi_type:
  +     INTV             { $$ = mk_const(interp, str_dup("int"), 'S'); }
  +   | FLOATV           { $$ = mk_const(interp, str_dup("num"), 'S'); }
  +   | PMCV             { $$ = mk_const(interp, str_dup("pmc"), 'S'); }
  +   | STRINGV          { $$ = mk_const(interp, str_dup("string"), 'S'); }
  +   | '_'              { $$ = mk_const(interp, str_dup("pmc"), 'S'); }
  +   | IDENTIFIER       { $$ = mk_const(interp, $1, 'S'); }
      ;
   
   sub_body:
  @@ -619,13 +631,13 @@
        IDENTIFIER
            {
               Instruction *i = iSUBROUTINE(cur_unit, mk_sub_label(interp, $3));
  -            i->r[1] = $<sr>$ = mk_pcc_sub(interp, str_dup(i->r[0]->name), 0);
  +            i->r[1] = cur_call = mk_pcc_sub(interp, str_dup(i->r[0]->name), 
0);
               add_namespace(interp, cur_unit);
   
            }
  -     sub_proto '\n' { $<sr>4->pcc_sub->pragma = $5; }
  +     sub_proto '\n' { cur_call->pcc_sub->pragma = $5; }
        sub_params
  -     sub_body  ESUB { $$ = 0; }
  +     sub_body  ESUB { $$ = 0; cur_call = NULL; }
      ;
   
   pcc_sub_call:
  
  
  
  1.61      +9 -0      parrot/imcc/symreg.c
  
  Index: symreg.c
  ===================================================================
  RCS file: /cvs/public/parrot/imcc/symreg.c,v
  retrieving revision 1.60
  retrieving revision 1.61
  diff -u -r1.60 -r1.61
  --- symreg.c  24 Mar 2005 14:08:16 -0000      1.60
  +++ symreg.c  25 Mar 2005 07:44:19 -0000      1.61
  @@ -190,6 +190,15 @@
   }
   
   void
  +add_pcc_multi(SymReg *r, SymReg * arg)
  +{
  +    int n = r->pcc_sub->nmulti;
  +    r->pcc_sub->multi = realloc(r->pcc_sub->multi, (n + 1) * sizeof(SymReg 
*));
  +    r->pcc_sub->multi[n] = arg;
  +    r->pcc_sub->nmulti++;
  +}
  +
  +void
   add_pcc_return(SymReg *r, SymReg * arg)
   {
       add_pcc_result(r, arg);
  
  
  
  1.62      +3 -0      parrot/imcc/symreg.h
  
  Index: symreg.h
  ===================================================================
  RCS file: /cvs/public/parrot/imcc/symreg.h,v
  retrieving revision 1.61
  retrieving revision 1.62
  diff -u -r1.61 -r1.62
  --- symreg.h  13 Jan 2005 15:25:01 -0000      1.61
  +++ symreg.h  25 Mar 2005 07:44:19 -0000      1.62
  @@ -127,6 +127,7 @@
   void add_pcc_result(SymReg *r, SymReg * arg);
   void add_pcc_param(SymReg *r, SymReg * arg);
   void add_pcc_return(SymReg *r, SymReg * arg);
  +void add_pcc_multi(SymReg *r, SymReg * arg);
   void add_namespace(Parrot_Interp interpreter, struct _IMC_Unit *);
   
   typedef enum {
  @@ -150,6 +151,8 @@
       SymReg *cc;
       SymReg ** ret;
       int nret;
  +    SymReg ** multi;
  +    int nmulti;
       pragma_enum_t pragma;
       int calls_a_sub;
       int nci;
  
  
  
  1.51      +7 -1      parrot/imcc/t/syn/pcc.t
  
  Index: pcc.t
  ===================================================================
  RCS file: /cvs/public/parrot/imcc/t/syn/pcc.t,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- pcc.t     24 Mar 2005 16:13:32 -0000      1.50
  +++ pcc.t     25 Mar 2005 07:44:20 -0000      1.51
  @@ -1,6 +1,6 @@
   #!perl -w
   # Copyright: 2001-2005 The Perl Foundation.  All Rights Reserved.
  -# $Id: pcc.t,v 1.50 2005/03/24 16:13:32 leo Exp $
  +# $Id: pcc.t,v 1.51 2005/03/25 07:44:20 leo Exp $
   
   use strict;
   use Parrot::Test tests => 42;
  @@ -1522,6 +1522,12 @@
   .sub foo @MULTI()
       print "ok 1\n"
   .end
  +.sub f1 @MULTI(int)
  +.end
  +.sub f2 @MULTI(int, float)
  +.end
  +.sub f3 @MULTI(Integer, Any, _)
  +.end
   CODE
   ok 1
   OUT
  
  
  

Reply via email to