X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fdecl_extvar.c;h=c6a77aa436d6db0dda922b1ce536112a0f097a28;hp=d85258b1726c9344d565be112217f7c3c770cbf7;hb=2559f07a178b681dc240e20153ff5abdff54cb34;hpb=c9384515a81cb64d345b299908b2852f51bb8e6e diff --git a/src/types/decl_extvar.c b/src/types/decl_extvar.c index d85258b..c6a77aa 100644 --- a/src/types/decl_extvar.c +++ b/src/types/decl_extvar.c @@ -30,6 +30,8 @@ #include #include +#include + #include "data.h" struct psi_decl_extvar *psi_decl_extvar_init(struct psi_decl_arg *arg) @@ -46,9 +48,7 @@ void psi_decl_extvar_free(struct psi_decl_extvar **evar_ptr) struct psi_decl_extvar *evar = *evar_ptr; *evar_ptr = NULL; - if (evar->token) { - free(evar->token); - } + psi_token_free(&evar->token); psi_decl_arg_free(&evar->arg); psi_decl_free(&evar->getter); psi_decl_free(&evar->setter); @@ -66,10 +66,18 @@ bool psi_decl_extvar_validate(struct psi_data *data, evar->size = psi_decl_arg_get_size(evar->arg); if (!evar->size) { data->error(data, evar->arg->var->token, PSI_WARNING, - "Failed to calculate size of symbol '%s'", evar->arg->var->name); + "Failed to calculate size of symbol '%s'", evar->arg->var->name->val); return false; } + 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); + } + } if (!evar->sym) { #ifndef RTLD_NEXT # define RTLD_NEXT ((void *) -1l) @@ -77,10 +85,10 @@ bool psi_decl_extvar_validate(struct psi_data *data, #ifndef RTLD_DEFAULT # define RTLD_DEFAULT ((void *) 0) #endif - evar->sym = dlsym(scope->dlopened ?: RTLD_DEFAULT, evar->arg->var->name); + 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, + "Failed to locate symbol '%s': %s", evar->arg->var->name->val, dlerror() ?: "not found"); return false; } @@ -107,7 +115,8 @@ void psi_decl_extvar_dump(int fd, struct psi_decl_extvar *evar) struct psi_decl *psi_decl_extvar_setter(struct psi_decl_extvar *evar) { - struct psi_decl_type *func_type = psi_decl_type_init(PSI_T_VOID, "void"); + zend_string *type_str = zend_string_init_interned(ZEND_STRS("void"), 1); + struct psi_decl_type *func_type = psi_decl_type_init(PSI_T_VOID, type_str); struct psi_decl_var *func_var = psi_decl_var_copy(evar->arg->var); struct psi_decl_arg *func = psi_decl_arg_init(func_type, func_var); struct psi_decl_type *arg_type = psi_decl_type_copy(evar->arg->type); @@ -115,11 +124,19 @@ struct psi_decl *psi_decl_extvar_setter(struct psi_decl_extvar *evar) struct psi_decl_arg *arg = psi_decl_arg_init(arg_type, arg_var); struct psi_plist *args = psi_plist_init((psi_plist_dtor) psi_decl_arg_free); struct psi_decl *decl = psi_decl_init(func, psi_plist_add(args, &arg)); + smart_str name = {0}; + + zend_string_release(type_str); func_var->pointer_level = 0; func_var->array_size = 0; - func_var->name = realloc(func_var->name, strlen(evar->arg->var->name) + sizeof("_set")); - strcat(func_var->name, "_set"); + + 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); + + decl->extvar = 1; return decl; } @@ -135,9 +152,14 @@ struct psi_decl *psi_decl_extvar_getter(struct psi_decl_extvar *evar) struct psi_decl_var *func_var = psi_decl_var_copy(evar->arg->var); struct psi_decl_arg *func = psi_decl_arg_init(func_type, func_var); struct psi_decl *decl = psi_decl_init(func, NULL); + smart_str name = {0}; + + 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 = realloc(func_var->name, strlen(evar->arg->var->name) + sizeof("_get")); - strcat(func_var->name, "_get"); + decl->extvar = 1; return decl; }