marshal: array return values
[m6w6/ext-psi] / src / types / decl_extvar.c
index d85258b1726c9344d565be112217f7c3c770cbf7..efbec20768787543e22d4c56ee153dde11ef1dee 100644 (file)
@@ -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;
 }