projects
/
m6w6
/
ext-psi
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
fix leaks
[m6w6/ext-psi]
/
src
/
types
/
let_callback.c
diff --git
a/src/types/let_callback.c
b/src/types/let_callback.c
index 322e3b096a73fe0507e08c64c0e2df308677829a..45639f82449dbded4f8c76252f6a796915ea9e9d 100644
(file)
--- a/
src/types/let_callback.c
+++ b/
src/types/let_callback.c
@@
-78,13
+78,14
@@
static inline bool psi_let_callback_validate_decl_args(struct psi_data *data,
return true;
}
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;
{
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_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) {
cb_type = psi_decl_type_get_real(cb_var->arg->type);
if (cb_type->type != PSI_T_FUNCTION) {
@@
-95,10
+96,10
@@
bool psi_let_callback_validate(struct psi_data *data, struct psi_let_exp *exp,
}
cb->decl = cb_type->real.func;
}
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;
}
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)) {
return false;
}
while (psi_plist_get(cb->args, i++, &set_exp)) {
@@
-110,9
+111,17
@@
bool psi_let_callback_validate(struct psi_data *data, struct psi_let_exp *exp,
dvar->arg = cb_var->arg;
}
}
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;
}
return false;
}
+ scope->cb_decl = NULL;
+ scope->current_set = parent_set;
}
return true;
}
return true;