dprintf(fd, "}\n");
}
-bool psi_impl_validate(struct psi_data *data, struct psi_impl *impl)
+bool psi_impl_validate(struct psi_data *data, struct psi_impl *impl,
+ struct psi_validate_scope *scope)
{
- if (!psi_impl_func_validate(data, impl->func)) {
+ scope->impl = impl;
+
+ if (!psi_impl_func_validate(data, impl->func, scope)) {
return false;
}
- if (!psi_return_stmt_validate(data, impl)) {
+ if (!psi_return_stmt_validate(data, scope)) {
return false;
}
- if (!psi_let_stmts_validate(data, impl)) {
+ if (!psi_let_stmts_validate(data, scope)) {
return false;
}
- if (!psi_set_stmts_validate(data, impl)) {
+ if (!psi_set_stmts_validate(data, scope)) {
return false;
}
- if (!psi_assert_stmts_validate(data, impl)) {
+ if (!psi_assert_stmts_validate(data, scope)) {
return false;
}
- if (!psi_free_stmts_validate(data, impl)) {
+ if (!psi_free_stmts_validate(data, scope)) {
return false;
}
return true;
}
}
+struct psi_decl_arg *psi_impl_get_decl_arg(struct psi_impl *impl,
+ struct psi_decl_var *var)
+{
+ struct psi_return_stmt *ret;
+
+ if (psi_plist_get(impl->stmts.ret, 0, &ret)) {
+ if (ret->exp->args) {
+ size_t i = 0;
+ struct psi_decl_var *arg;
+
+ while (psi_plist_get(ret->exp->args, i++, &arg)) {
+ if (zend_string_equals(var->name, arg->name)) {
+ return var->arg = arg->arg;
+ }
+ }
+ }
+ }
+
+ return psi_decl_get_arg(impl->decl, var);
+}
+
struct psi_let_stmt *psi_impl_get_let(struct psi_impl *impl,
struct psi_decl_var* var)
{
struct psi_impl_arg *iarg;
while (psi_plist_get(impl->func->args, i++, &iarg)) {
- if (!strcmp(var->name, iarg->var->name)) {
+ if (zend_string_equals(var->name, iarg->var->name)) {
return var->arg = iarg;
}
}
if (let->exp->kind != PSI_LET_TMP) {
continue;
}
- if (strcmp(let->exp->var->name, var->name)) {
+ if (!zend_string_equals(let->exp->var->name, var->name)) {
continue;
}
return var->arg = let->exp->var->arg;