1 /* this code is for the automatic genteration
2 of call back parameters
18 #define getop(x,C) (C->inst[C->nextinst - 5 - 2 * x].opcode)
20 void Auto_EiC_CallBack(code_t *callback, va_list ap)
23 int i,N = callback->inst[callback->nextinst-3].val.ival;
26 switch(getop(i,callback)) {
28 setArg(i,callback, double, va_arg(ap,double));
32 setArg(i,callback, int, va_arg(ap,int));
36 setArg(i,callback, long, va_arg(ap,long));
39 v.p.ep = v.p.sp = v.p.p = va_arg(ap,void *);
40 setArg(i,callback, val_t , v);
46 EiC_listcode(callback);
54 int EiC_genCallBackCode(token_t * e1)
56 void EiC_listcode(code_t *);
57 int EiC_IsFunc(int t);
59 int i, lineno = CurrentLineNo();
63 if(EiC_gettype(e1->Type) == t_pointer)
64 Type = nextType(e1->Type);
68 f = (func_t *) EiC_getInf(Type);
70 if (f && getFNp(f) && !getFcallBack(f)) {
74 if(EiC_gettype(Type) == t_builtin)
75 e2.Val.vfunc = e1->Sym->val.vfunc;
79 EiC_generate(&e2.Code,pushptr,&e2.Val,0);
81 setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
84 EiC_generate(&e2.Code,bump,&e2.Val,0);
85 setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
88 /* watch for the void argument */
89 if(EiC_gettype(getFPty(f,0)) != t_void) {
91 e2.Val.ival = getFNp(f);
92 EiC_generate(&e2.Code,checkar,&e2.Val,1);
93 setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
95 for (i = 0; i < getFNp(f); i++) {
97 e2.Type = getFPty(f,i);
99 if(EiC_gettype(e2.Type) == t_var)
100 EiC_error("\n Sorry, you can't pass a variadic function through EiC's callBack interface");
104 EiC_generate(&e2.Code, stoval, &e2.Val, 0);
105 setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
110 EiC_generate(&e2.Code, pushint, &e2.Val, 0);
111 setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
114 if(EiC_gettype(Type) == t_builtin)
115 EiC_generate(&e2.Code,call,&e2.Val,0);
117 EiC_generate(&e2.Code,eiccall,&e2.Val,0);
119 setCodeLineNo(&e2.Code,e2.Code.nextinst-1,0);
122 EiC_generate(&e2.Code,halt,&e2.Val,0);
123 setCodeLineNo(&e2.Code,e2.Code.nextinst-1,0);
125 if(!EiC_ParseError) {
126 code_t *code = xcalloc(1,sizeof(*code));
128 code->Filename=e1->Sym->fname;
130 if(EiC_gettype(Type) == t_builtin)
131 code->parent = e1->Sym->val.vfunc;
133 code->parent=e1->Sym;
134 setFcallBack(f,code);