zend_string'ify
[m6w6/ext-psi] / src / types / let_callback.c
index 7d44f33a98c9b7f73ea7826a7641ffbd519ab144..7126b12e23a8f3d43d7cebd159f134361023eb81 100644 (file)
@@ -44,10 +44,10 @@ void psi_let_callback_free(struct psi_let_callback **cb_ptr)
                *cb_ptr = NULL;
                psi_let_func_free(&cb->func);
                psi_plist_free(cb->args);
-               psi_plist_free(cb->cb_args);
-               if (cb->token) {
-                       free(cb->token);
+               if (cb->cb_args) {
+                       psi_plist_free(cb->cb_args);
                }
+               psi_token_free(&cb->token);
                free(cb);
        }
 }
@@ -65,7 +65,7 @@ static inline bool psi_let_callback_validate_decl_args(struct psi_data *data,
                        data->error(data, cb->token, PSI_WARNING,
                                        "Argument count of callback statement of implementation '%s'"
                                        "does not match argument count of callback declaration '%s'",
-                                       impl->func->name, cb_decl->func->var->name);
+                                       impl->func->name->val, cb_decl->func->var->name->val);
                        return false;
                }
 
@@ -76,39 +76,50 @@ static inline bool psi_let_callback_validate_decl_args(struct psi_data *data,
        return true;
 }
 
-bool psi_let_callback_validate(struct psi_data *data, struct psi_let_exp *exp,
-               struct psi_let_callback *cb, struct psi_impl *impl)
+bool psi_let_callback_validate(struct psi_data *data, struct psi_let_callback *cb,
+               struct psi_validate_scope *scope)
 {
        size_t i = 0;
        struct psi_decl_type *cb_type;
+       struct psi_let_exp *exp = scope->current_let;
        struct psi_decl_var *cb_var = exp->var;
-       struct psi_set_exp *set_exp;
+       struct psi_set_exp *set_exp, *parent_set = scope->current_set;
 
        cb_type = psi_decl_type_get_real(cb_var->arg->type);
        if (cb_type->type != PSI_T_FUNCTION) {
                data->error(data, cb_var->token, PSI_WARNING,
                                "Expected a function: %s",
-                               cb_var->name);
+                               cb_var->name->val);
                return false;
        }
        cb->decl = cb_type->real.func;
 
-       if (!psi_decl_validate_nodl(data, cb->decl,  NULL /* FIXME type_stack */)) {
+       if (!psi_decl_validate_nodl(data, cb->decl, scope)) {
                return false;
        }
-       if (!psi_let_callback_validate_decl_args(data, cb, cb->decl, impl)) {
+       if (!psi_let_callback_validate_decl_args(data, cb, cb->decl, scope->impl)) {
                return false;
        }
        while (psi_plist_get(cb->args, i++, &set_exp)) {
-               struct psi_decl_var *cb_var, *dvar = psi_set_exp_get_decl_var(set_exp);
+               if (cb->cb_args) {
+                       struct psi_decl_var *cb_var;
 
-               if (psi_plist_get(cb->cb_args, i - 1, &cb_var)) {
-                       dvar->arg = cb_var->arg;
+                       if (psi_plist_get(cb->cb_args, i - 1, &cb_var)) {
+                               struct psi_decl_var *dvar = psi_set_exp_get_decl_var(set_exp);
+                               dvar->arg = cb_var->arg;
+                       }
                }
 
-               if (!psi_set_exp_validate(data, set_exp, impl, cb->decl)) {
+               scope->current_set = set_exp;
+               scope->cb_decl = cb->decl;
+
+               if (!psi_set_exp_validate(data, set_exp, scope)) {
+                       scope->cb_decl = NULL;
+                       scope->current_set = parent_set;
                        return false;
                }
+               scope->cb_decl = NULL;
+               scope->current_set = parent_set;
        }
 
        return true;
@@ -130,8 +141,8 @@ void psi_let_callback_dump(int fd, struct psi_let_callback *callback,
                }
        }
        dprintf(fd, ") as %s(%s(",
-                       callback->func->name,
-                       callback->func->var->name);
+                       callback->func->name->val,
+                       callback->func->var->name->val);
 
        if (callback->args) {
                size_t i = 0, last = psi_plist_count(callback->args);