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