X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcontext.c;h=3b5c734e106da577a7aa90a3cf4bea0d876eecab;hp=ba9fabb9cc8e0c0d5ed4542e9f92d96cf1a33f1e;hb=ad859923be758c210e2ad4226eb8e3b09bcf91eb;hpb=e16c15d5936c3b57b05e49570fb9526920de8188 diff --git a/src/context.c b/src/context.c index ba9fabb..3b5c734 100644 --- a/src/context.c +++ b/src/context.c @@ -180,6 +180,10 @@ static struct psi_predef_decl { PSI_DECLS {0} }; +static struct psi_predef_decl psi_predef_vararg_decls[] = { + PSI_VA_DECLS + {0} +}; static struct psi_predef_struct { token_t type_tag; @@ -992,6 +996,24 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr decl_args *args = init_decl_args(NULL); decl *decl = init_decl(init_decl_abi("default"), func, args); + for (farg = &predef_decl[1]; farg->type_tag; ++farg) { + decl_type *arg_type = init_decl_type(farg->type_tag, farg->type_name); + decl_var *arg_var = init_decl_var(farg->var_name, farg->pointer_level, farg->array_size); + decl_arg *darg = init_decl_arg(arg_type, arg_var); + args = add_decl_arg(args, darg); + } + + T.decls = add_decl(T.decls, decl); + predef_decl = farg; + } + + for (predef_decl = &psi_predef_vararg_decls[0]; predef_decl->type_tag; ++predef_decl) { + struct psi_predef_decl *farg; + decl_type *ftype = init_decl_type(predef_decl->type_tag, predef_decl->type_name); + decl_var *fname = init_decl_var(predef_decl->var_name, predef_decl->pointer_level, predef_decl->array_size); + decl_arg *func = init_decl_arg(ftype, fname); + decl_args *args = init_decl_args(NULL); + decl *decl = init_decl(init_decl_abi("default"), func, args); for (farg = &predef_decl[1]; farg->type_tag; ++farg) { decl_type *arg_type = init_decl_type(farg->type_tag, farg->type_name); @@ -999,6 +1021,7 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr decl_arg *darg = init_decl_arg(arg_type, arg_var); args = add_decl_arg(args, darg); } + args->varargs = 1; T.decls = add_decl(T.decls, decl); predef_decl = farg; @@ -1214,9 +1237,9 @@ zend_function_entry *PSI_ContextCompile(PSI_Context *C) } -void PSI_ContextCall(PSI_Context *C, impl_val *ret_val, decl *decl) +void PSI_ContextCall(PSI_Context *C, decl_callinfo *decl_call, impl_vararg *va) { - C->ops->call(C, ret_val, decl); + C->ops->call(C, decl_call, va); } static inline void dump_decl_type(int fd, decl_type *t) { @@ -1404,8 +1427,8 @@ void PSI_ContextDump(PSI_Context *C, int fd) dprintf(fd, " = %s", iarg->def->text); } } - if (impl->func->args->vararg) { - impl_arg *vararg = impl->func->args->vararg; + if (impl->func->args->vararg.name) { + impl_arg *vararg = impl->func->args->vararg.name; dprintf(fd, ", %s %s...$%s", vararg->type->name,