X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fdecl_extvar.c;h=efbec20768787543e22d4c56ee153dde11ef1dee;hb=f8b910b8bc0326683697c639288900b6a095368b;hp=d85258b1726c9344d565be112217f7c3c770cbf7;hpb=c9384515a81cb64d345b299908b2852f51bb8e6e;p=m6w6%2Fext-psi diff --git a/src/types/decl_extvar.c b/src/types/decl_extvar.c index d85258b..efbec20 100644 --- a/src/types/decl_extvar.c +++ b/src/types/decl_extvar.c @@ -70,6 +70,14 @@ bool psi_decl_extvar_validate(struct psi_data *data, 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); + } + } if (!evar->sym) { #ifndef RTLD_NEXT # define RTLD_NEXT ((void *) -1l) @@ -77,7 +85,7 @@ 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); if (!evar->sym) { data->error(data, evar->arg->var->token, PSI_WARNING, "Failed to locate symbol '%s': %s", evar->arg->var->name, @@ -121,6 +129,8 @@ struct psi_decl *psi_decl_extvar_setter(struct psi_decl_extvar *evar) func_var->name = realloc(func_var->name, strlen(evar->arg->var->name) + sizeof("_set")); strcat(func_var->name, "_set"); + decl->extvar = 1; + return decl; } @@ -139,6 +149,8 @@ struct psi_decl *psi_decl_extvar_getter(struct psi_decl_extvar *evar) func_var->name = realloc(func_var->name, strlen(evar->arg->var->name) + sizeof("_get")); strcat(func_var->name, "_get"); + decl->extvar = 1; + return decl; }