lift single lib statement restriction
[m6w6/ext-psi] / src / types / decl_extvar.c
index 5e7f14a4ad70c0a63bff1f32ab5821de70891e25..e49804c105b31b80ca21ea72591134e382d34ce8 100644 (file)
@@ -57,10 +57,9 @@ void psi_decl_extvar_free(struct psi_decl_extvar **evar_ptr)
 }
 
 bool psi_decl_extvar_validate(struct psi_data *data,
-               struct psi_decl_extvar *evar, void *dl,
-               struct psi_validate_stack *type_stack)
+               struct psi_decl_extvar *evar, struct psi_validate_scope *scope)
 {
-       if (!psi_decl_arg_validate(data, evar->arg, type_stack)) {
+       if (!psi_decl_arg_validate(data, evar->arg, scope)) {
                return false;
        }
 
@@ -71,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)
@@ -78,7 +85,7 @@ bool psi_decl_extvar_validate(struct psi_data *data,
 #ifndef RTLD_DEFAULT
 # define RTLD_DEFAULT ((void *) 0)
 #endif
-               evar->sym = dlsym(dl ?: 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,
@@ -88,11 +95,11 @@ bool psi_decl_extvar_validate(struct psi_data *data,
        }
 
        evar->getter = psi_decl_extvar_getter(evar);
-       if (!psi_decl_validate_nodl(data, evar->getter, type_stack)) {
+       if (!psi_decl_validate_nodl(data, evar->getter, scope)) {
                return false;
        }
        evar->setter = psi_decl_extvar_setter(evar);
-       if (!psi_decl_validate_nodl(data, evar->setter, type_stack)) {
+       if (!psi_decl_validate_nodl(data, evar->setter, scope)) {
                return false;
        }
 
@@ -117,6 +124,8 @@ struct psi_decl *psi_decl_extvar_setter(struct psi_decl_extvar *evar)
        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));
 
+       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");