changeset 507:425f768aba68

*** empty log message ***
author kono
date Sat, 24 Dec 2005 22:12:10 +0900
parents 96af6754acd3
children d8102a46b78d
files mc-parse.c
diffstat 1 files changed, 38 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mc-parse.c	Sat Dec 24 21:01:50 2005 +0900
+++ b/mc-parse.c	Sat Dec 24 22:12:10 2005 +0900
@@ -1766,20 +1766,53 @@
 extern void
 pfdecl(NMTBL *n)
 {
-    int sd = stypedecl;
+    int e;
+    int args,nargs,cargs;
+    NMTBL *a,*n1;
 
     if(!chk) gen_enter(n->nm);
     extrn_use(n);
     local_static_list = &null_nptr;
     retlabel=fwdlabel();
 
-    fnptr=n;
+    fnptr=get_nptr();
+    fnptr->ty=n->ty;
+    fnptr->nm=n->nm;
+    fnptr->sc=n->sc;
+    fnptr->attr=n->attr;
+    fnptr->next=0;
+    
+    for(args=n->dsp,nargs=0;args;args=cadr(args)) {
+	// make copied called function argment
+	n1 = get_nptr();
+	a = (NMTBL*)caddr(args);
+	n1->ty = a->ty;
+	n1->nm = a->nm;
+	n1->sc = a->sc;
+	n1->attr = a->attr;
+
+	n1->dsp = a->dsp; // def have to be called?
+
+	nargs=list4(car(args),nargs,(int)n1,cadddr(args));
+    }
+    fnptr->dsp=reverse0(nargs);
+    
     retcont = 0;
     tmp_struct = 0;
 
-    arg_register(fnptr);
+    disp=0;
+    arg_register(fnptr); // should fix n1->dsp
+
+    for(args=fnptr->dsp,cargs=0;args;args=cadr(args)) {
+	a = (NMTBL*)caddr(args);
+	// make call function argment for gen_inline
+        e=list3(a->sc==IVAR?LVAR:a->sc,a->dsp,(int)a);
+	cargs = list3(e,cargs,a->ty);
+    }
+    e = list4(INLINE,list2(FNAME,(int)fnptr),reverse0(cargs),
+	list3(car(fnptr->ty),cadr(fnptr->ty),caddr(fnptr->ty)));
+
     typedefed=0;
-    conv->function_(fnptr,sd); conv->lc_();
     init_vars=0;
 
     if(!chk) gen_enter1();
@@ -1787,8 +1820,7 @@
     control=1;
     cslabel = -1;
 
-    g_expr_u(pexpr(car(attr_value(n,INLINE))));
-    conv->function_end_(); conv->rc_();
+    gen_inline(e);
     if(!chk) gen_leave(control,n->nm);
 
     retpending = 0;