X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fdecl.c;h=2d974808b7bd8ee3d7cf735632ba22ad8f878876;hb=8d1d1243a8a42b0046ac670808913b3bb06c994b;hp=b4685f6de41efbdaec5c50129b845d33b86957c2;hpb=894e0ce93f9ce82109e904ae35c249bf6abe54f1;p=m6w6%2Fext-psi diff --git a/src/types/decl.c b/src/types/decl.c index b4685f6..2d97480 100644 --- a/src/types/decl.c +++ b/src/types/decl.c @@ -25,19 +25,23 @@ #include "php_psi_stdinc.h" +#include "php_psi.h" + #include +#include + #include "data.h" #define PSI_FUNC_REDIRS #include "php_psi_posix.h" -struct psi_decl *psi_decl_init(struct psi_decl_abi *abi, - struct psi_decl_arg *func, struct psi_plist *args) +struct psi_decl *psi_decl_init(struct psi_decl_arg *func, struct psi_plist *args) { struct psi_decl *d = calloc(1, sizeof(*d)); - d->abi = abi; + d->func = func; d->args = args; + return d; } @@ -85,9 +89,8 @@ static inline bool psi_decl_validate_func(struct psi_data *data, { struct psi_func_redir *redir; - if (!strcmp(func->var->name, "dlsym")) { - data->error(data, func->token, PSI_WARNING, - "Cannot dlsym dlsym (sic!)"); + if (!func->var->name) { + data->error(data, func->token, PSI_WARNING, "Cannot load anonymous decl"); return false; } @@ -114,9 +117,10 @@ static inline bool psi_decl_validate_func(struct psi_data *data, return true; } -bool psi_decl_validate(struct psi_data *data, struct psi_decl *decl, void *dl) +bool psi_decl_validate(struct psi_data *data, struct psi_decl *decl, void *dl, + struct psi_validate_stack *type_stack) { - if (!psi_decl_validate_nodl(data, decl)) { + if (!psi_decl_validate_nodl(data, decl, type_stack)) { return false; } if (!psi_decl_validate_func(data, decl, decl->func, dl)) { @@ -126,14 +130,17 @@ bool psi_decl_validate(struct psi_data *data, struct psi_decl *decl, void *dl) return true; } -bool psi_decl_validate_nodl(struct psi_data *data, struct psi_decl *decl) +bool psi_decl_validate_nodl(struct psi_data *data, struct psi_decl *decl, + struct psi_validate_stack *type_stack) { - if (!psi_decl_abi_validate(data, decl->abi)) { + if (!decl->abi) { + decl->abi = psi_decl_abi_init("default"); + } else if (!psi_decl_abi_validate(data, decl->abi)) { data->error(data, decl->abi->token, PSI_WARNING, "Invalid calling convention: '%s'", decl->abi->token->text); return false; } - if (!psi_decl_arg_validate(data, decl->func)) { + if (!psi_decl_arg_validate(data, decl->func, type_stack)) { return false; } if (decl->args) { @@ -141,7 +148,12 @@ bool psi_decl_validate_nodl(struct psi_data *data, struct psi_decl *decl) struct psi_decl_arg *arg; while (psi_plist_get(decl->args, i++, &arg)) { - if (!psi_decl_arg_validate(data, arg)) { + if (!arg->var->name) { + arg->var->name = malloc(7); + snprintf(arg->var->name, 6, "arg%zu", i); + arg->var->fqn = strdup(arg->var->name); + } + if (!psi_decl_arg_validate(data, arg, type_stack)) { return false; } } @@ -149,3 +161,17 @@ bool psi_decl_validate_nodl(struct psi_data *data, struct psi_decl *decl) return true; } + +bool psi_decl_is_blacklisted(const char *name) +{ + char *blacklisted; + size_t i = 0; + + while (psi_plist_get(PSI_G(blacklist).decls, i++, &blacklisted)) { + if (!fnmatch(blacklisted, name, 0)) { + return true; + } + } + return false; +} +