📄 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 + -