X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fdecl_extvar.c;h=24ff39a0284cce4b550af4a14865b16a30aa951d;hp=4490a0a12781454cdc1de111dde0a11e1ef3ceb6;hb=32cdc02a91cd535ae21e9a775664995f4691a824;hpb=216e7ac3b97aed5a5d65c511dc061c78be90e79d diff --git a/src/types/decl_extvar.c b/src/types/decl_extvar.c index 4490a0a..24ff39a 100644 --- a/src/types/decl_extvar.c +++ b/src/types/decl_extvar.c @@ -27,9 +27,7 @@ #include "php_psi.h" -#include #include - #include #include "data.h" @@ -71,27 +69,14 @@ bool psi_decl_extvar_validate(struct psi_data *data, } if (!evar->sym) { - size_t i = 0; - void *dl; - - while (!evar->sym && psi_plist_get(data->file.dlopened, i++, &dl)) { - evar->sym = dlsym(dl, evar->arg->var->name->val); - } + evar->sym = psi_dlsym(data->file.dlopened, evar->arg->var->name->val, + evar->redir ? evar->redir->val : NULL); } if (!evar->sym) { -#ifndef RTLD_NEXT -# define RTLD_NEXT ((void *) -1l) -#endif -#ifndef RTLD_DEFAULT -# define RTLD_DEFAULT ((void *) 0) -#endif - evar->sym = dlsym(RTLD_DEFAULT, evar->arg->var->name->val); - if (!evar->sym) { - data->error(data, evar->arg->var->token, PSI_WARNING, - "Failed to locate symbol '%s': %s", evar->arg->var->name->val, - dlerror() ?: "not found"); - return false; - } + data->error(data, evar->arg->var->token, PSI_WARNING, + "Failed to locate symbol '%s': %s", evar->arg->var->name->val, + dlerror() ?: "not found"); + return false; } evar->getter = psi_decl_extvar_getter(evar); @@ -106,11 +91,11 @@ bool psi_decl_extvar_validate(struct psi_data *data, return true; } -void psi_decl_extvar_dump(int fd, struct psi_decl_extvar *evar) +void psi_decl_extvar_dump(struct psi_dump *dump, struct psi_decl_extvar *evar) { - dprintf(fd, "extern "); - psi_decl_arg_dump(fd, evar->arg, 0); - dprintf(fd, ";\n"); + PSI_DUMP(dump, "extern "); + psi_decl_arg_dump(dump, evar->arg, 0); + PSI_DUMP(dump, ";\n"); } struct psi_decl *psi_decl_extvar_setter(struct psi_decl_extvar *evar) @@ -134,7 +119,7 @@ struct psi_decl *psi_decl_extvar_setter(struct psi_decl_extvar *evar) smart_str_append_ex(&name, func_var->name, 1); smart_str_appendl_ex(&name, ZEND_STRL("_set"), 1); zend_string_release(func_var->name); - func_var->name = smart_str_extract(&name); + func_var->name = zend_new_interned_string(smart_str_extract(&name)); decl->extvar = 1; @@ -157,7 +142,7 @@ struct psi_decl *psi_decl_extvar_getter(struct psi_decl_extvar *evar) smart_str_append_ex(&name, func_var->name, 1); smart_str_appendl_ex(&name, ZEND_STRL("_get"), 1); zend_string_release(func_var->name); - func_var->name = smart_str_extract(&name); + func_var->name = zend_new_interned_string(smart_str_extract(&name)); decl->extvar = 1; @@ -166,7 +151,12 @@ struct psi_decl *psi_decl_extvar_getter(struct psi_decl_extvar *evar) void psi_decl_extvar_get(struct psi_decl_extvar *evar, void *ptr) { - memcpy(ptr, evar->sym, evar->size); + if (evar->arg->var->array_size) { + /* arrays are passed as pointer */ + *(void **) ptr = evar->sym; + } else { + memcpy(ptr, evar->sym, evar->size); + } } @@ -182,4 +172,3 @@ bool psi_decl_extvar_is_blacklisted(const char *name) } return false; } -