X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=src%2Ftypes%2Flet_callback.c;h=7126b12e23a8f3d43d7cebd159f134361023eb81;hb=09529efcde471127419e141807b83b37077003a0;hp=7d44f33a98c9b7f73ea7826a7641ffbd519ab144;hpb=46a52f66821e6fb4d0fbce884a69e8e57244c008;p=m6w6%2Fext-psi diff --git a/src/types/let_callback.c b/src/types/let_callback.c index 7d44f33..7126b12 100644 --- a/src/types/let_callback.c +++ b/src/types/let_callback.c @@ -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);