📄 callback.c
字号:
/* this code is for the automatic genteration
of call back parameters
*/
#include <stdlib.h>
#include <varargs.h>
#include "MachSet.h"
#include "global.h"
#include "func.h"
#include "xalloc.h"
#include "typesets.h"
#include "error.h"
#include "symbol.h"
#include "preproc.h"
#include "eic.h"
#include "emitter.h"
#define getop(x,C) (C->inst[C->nextinst - 5 - 2 * x].opcode)
void Auto_EiC_CallBack(code_t *callback, va_list ap)
{
val_t v;
int i,N = callback->inst[callback->nextinst-3].val.ival;
for(i=0;i<N;i++) {
switch(getop(i,callback)) {
case pushdouble:
setArg(i,callback, double, va_arg(ap,double));
break;
case pushint:
case pushuint:
setArg(i,callback, int, va_arg(ap,int));
break;
case pushlong:
case pushulong:
setArg(i,callback, long, va_arg(ap,long));
break;
case pushptr:
v.p.ep = v.p.sp = v.p.p = va_arg(ap,void *);
setArg(i,callback, val_t , v);
break;
}
}
#if 0
EiC_listcode(callback);
#endif
}
#if 1
int EiC_genCallBackCode(token_t * e1)
{
void EiC_listcode(code_t *);
int EiC_IsFunc(int t);
func_t *f;
int i, lineno = CurrentLineNo();
type_expr * Type;
if(EiC_gettype(e1->Type) == t_pointer)
Type = nextType(e1->Type);
else
Type = e1->Type;
f = (func_t *) EiC_getInf(Type);
if (f && getFNp(f) && !getFcallBack(f)) {
token_t e2;
EiC_inittoken(&e2);
if(EiC_gettype(Type) == t_builtin)
e2.Val.vfunc = e1->Sym->val.vfunc;
else
e2.Val.p.p = e1->Sym;
EiC_generate(&e2.Code,pushptr,&e2.Val,0);
setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
e2.Val.ival = 1;
EiC_generate(&e2.Code,bump,&e2.Val,0);
setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
/* watch for the void argument */
if(EiC_gettype(getFPty(f,0)) != t_void) {
e2.Val.ival = getFNp(f);
EiC_generate(&e2.Code,checkar,&e2.Val,1);
setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
for (i = 0; i < getFNp(f); i++) {
e2.Pflag = 0;
e2.Type = getFPty(f,i);
if(EiC_gettype(e2.Type) == t_var)
EiC_error("\n Sorry, you can't pass a variadic function through EiC's callBack interface");
setConst(e2.Type);
EiC_output(&e2);
EiC_generate(&e2.Code, stoval, &e2.Val, 0);
setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
unsetConst(e2.Type);
}
} else
e2.Val.ival = 0;
EiC_generate(&e2.Code, pushint, &e2.Val, 0);
setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
if(EiC_gettype(Type) == t_builtin)
EiC_generate(&e2.Code,call,&e2.Val,0);
else
EiC_generate(&e2.Code,eiccall,&e2.Val,0);
setCodeLineNo(&e2.Code,e2.Code.nextinst-1,0);
e2.Val.p.p = NULL;
EiC_generate(&e2.Code,halt,&e2.Val,0);
setCodeLineNo(&e2.Code,e2.Code.nextinst-1,0);
if(!EiC_ParseError) {
code_t *code = xcalloc(1,sizeof(*code));
*code = e2.Code;
code->Filename=e1->Sym->fname;
code->prev=NULL;
if(EiC_gettype(Type) == t_builtin)
code->parent = e1->Sym->val.vfunc;
else
code->parent=e1->Sym;
setFcallBack(f,code);
}
e2.Type = NULL;
EiC_freetoken(&e2);
}
return 1;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -