X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fdecl.c;h=f948b014350ad08028d41098457f537cee43ab32;hp=300f5bdd36b6e1a782285e54423dbfbb3e2064bf;hb=1124354f4666e9d10d9ad3acfa45fdba3b99cfc6;hpb=02e801eabbe26a129ea05e6723c94e10bb653dab diff --git a/src/types/decl.c b/src/types/decl.c index 300f5bd..f948b01 100644 --- a/src/types/decl.c +++ b/src/types/decl.c @@ -23,21 +23,25 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#include "php_psi_stdinc.h" - -#include "php_psi.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# include "php_config.h" +#endif -#include #include +#include +#include "php_psi.h" #include "data.h" +#include "dl.h" #define PSI_FUNC_REDIRS -#include "php_psi_posix.h" +#include "php_psi_predef.h" struct psi_decl *psi_decl_init(struct psi_decl_arg *func, struct psi_plist *args) { - struct psi_decl *d = calloc(1, sizeof(*d)); + struct psi_decl *d = pecalloc(1, sizeof(*d), 1); d->func = func; d->args = args; @@ -58,37 +62,42 @@ void psi_decl_free(struct psi_decl **d_ptr) psi_plist_free(d->args); } if (d->redir) { - free(d->redir); + zend_string_release(d->redir); } - free(d); + pefree(d, 1); } } -void psi_decl_dump(int fd, struct psi_decl *decl) +void psi_decl_dump(struct psi_dump *dump, struct psi_decl *decl) { - psi_decl_abi_dump(fd, decl->abi); - dprintf(fd, " "); + if (decl->abi) { + psi_decl_abi_dump(dump, decl->abi); + } + PSI_DUMP(dump, " "); /* FIXME: functions returning arrays */ - psi_decl_arg_dump(fd, decl->func, 0); - dprintf(fd, "("); + psi_decl_arg_dump(dump, decl->func, 0); + PSI_DUMP(dump, "("); if (decl->args) { size_t i; struct psi_decl_arg *arg; for (i = 0; psi_plist_get(decl->args, i, &arg); ++i) { if (i) { - dprintf(fd, ", "); + PSI_DUMP(dump, ", "); } - psi_decl_arg_dump(fd, arg, 0); + psi_decl_arg_dump(dump, arg, 0); } if (decl->varargs) { - dprintf(fd, ", ..."); + PSI_DUMP(dump, ", ..."); } } + if (decl->func->var->array_size) { + PSI_DUMP(dump, ")[%u]", decl->func->var->array_size); + } if (decl->redir) { - dprintf(fd, ") __asm__ (\"%s\");", decl->redir); + PSI_DUMP(dump, ") __asm__ (\"%s\");", decl->redir->val); } else { - dprintf(fd, ");"); + PSI_DUMP(dump, ");"); } } @@ -103,33 +112,22 @@ static inline bool psi_decl_validate_func(struct psi_data *data, } for (redir = &psi_func_redirs[0]; redir->name; ++redir) { - if (!strcmp(func->var->name, redir->name)) { + if (!strcmp(func->var->name->val, redir->name)) { decl->sym = redir->func; + break; } } if (!decl->sym) { - size_t i = 0; - void *dl; - - while (!decl->sym && psi_plist_get(data->file.dlopened, i++, &dl)) { - decl->sym = dlsym(dl, decl->redir ?: func->var->name); - } + decl->sym = psi_dlsym(data->file.dlopened, func->var->name->val, + decl->redir ? decl->redir->val : NULL); } if (!decl->sym) { -#ifndef RTLD_NEXT -# define RTLD_NEXT ((void *) -1l) -#endif -#ifndef RTLD_DEFAULT -# define RTLD_DEFAULT ((void *) 0) -#endif - decl->sym = dlsym(RTLD_DEFAULT, decl->redir ?: func->var->name); - if (!decl->sym) { - data->error(data, func->token, PSI_WARNING, - "Failed to locate symbol '%s(%s)': %s", - func->var->name, decl->redir ?: "", - dlerror() ?: "not found"); - return false; - } + data->error(data, func->token, PSI_WARNING, + "Failed to locate symbol '%s(%s)': %s", + func->var->name->val, + decl->redir ? decl->redir->val : "", + psi_dlerror() ?: "not found"); + return false; } return true; } @@ -151,10 +149,11 @@ bool psi_decl_validate_nodl(struct psi_data *data, struct psi_decl *decl, struct psi_validate_scope *scope) { if (!decl->abi) { - decl->abi = psi_decl_abi_init("default"); + decl->abi = psi_decl_abi_init(NULL); } 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); + "Invalid calling convention: '%s'", + decl->abi->token->text->val); return false; } if (!psi_decl_arg_validate(data, decl->func, scope)) { @@ -166,9 +165,13 @@ bool psi_decl_validate_nodl(struct psi_data *data, struct psi_decl *decl, while (psi_plist_get(decl->args, i++, &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); + smart_str name = {0}; + + smart_str_appendl_ex(&name, ZEND_STRL("arg"), 1); + smart_str_append_unsigned_ex(&name, i, 1); + + arg->var->name = smart_str_extract(&name); + arg->var->fqn = zend_string_copy(arg->var->name); } if (!psi_decl_arg_validate(data, arg, scope)) { return false; @@ -206,4 +209,3 @@ struct psi_decl_arg *psi_decl_get_arg(struct psi_decl *decl, struct psi_decl_var return psi_decl_arg_get_by_var(var, decl->args, decl->func); } -