struct psi_impl_var *var)
{
struct psi_let_func *func = calloc(1, sizeof(*func));
func->type = type;
struct psi_impl_var *var)
{
struct psi_let_func *func = calloc(1, sizeof(*func));
func->type = type;
- dprintf(fd, "%s(%s\t/* fqn=%s */", func->name, func->var->name, func->var->fqn);
+ dprintf(fd, "%s(%s\t/* fqn=%s */", func->name->val, func->var->name->val,
+ func->var->fqn->val);
default:
data->error(data, func->var->token, PSI_WARNING,
"Unknown `let` cast function '%s' of implementation '%s'",
default:
data->error(data, func->var->token, PSI_WARNING,
"Unknown `let` cast function '%s' of implementation '%s'",
struct psi_let_exp *inner;
while (psi_plist_get(func->inner, i++, &inner)) {
struct psi_let_exp *inner;
while (psi_plist_get(func->inner, i++, &inner)) {
struct psi_decl_arg *sub_arg;
inner->outer = exp;
if (name) {
sub_arg = psi_decl_arg_get_by_name(sub_args, name);
struct psi_decl_arg *sub_arg;
inner->outer = exp;
if (name) {
sub_arg = psi_decl_arg_get_by_name(sub_args, name);
}
if (!name || !sub_arg) {
/* remove expr for portability with different struct members */
psi_plist_del(func->inner, --i, NULL);
psi_let_exp_free(&inner);
}
if (!name || !sub_arg) {
/* remove expr for portability with different struct members */
psi_plist_del(func->inner, --i, NULL);
psi_let_exp_free(&inner);
- } else if (!psi_let_exp_validate(data, inner, impl)) {
- return false;
+ } else {
+ scope->current_let = inner;
+ if (!psi_let_exp_validate(data, inner, scope)) {
+ scope->current_let = exp;
+ return false;
+ }
+ scope->current_let = exp;
data->error(data, sub_var->token, E_WARNING,
"Inner `set` statement casts on pointers must"
" reference the same variable");
return false;
}
data->error(data, sub_var->token, E_WARNING,
"Inner `set` statement casts on pointers must"
" reference the same variable");
return false;
}
- if (!psi_let_exp_validate(data, inner, impl)) {
+ scope->current_let = inner;
+ if (!psi_let_exp_validate(data, inner, scope)) {
+ scope->current_let = exp;
} else {
data->error(data, let_var->token, PSI_WARNING,
"Inner let statement's values must refer to a structure or"
" array type, got '%s%s' for '%s'", var_typ->name,
psi_t_indirection(let_var->arg->var->pointer_level),
} else {
data->error(data, let_var->token, PSI_WARNING,
"Inner let statement's values must refer to a structure or"
" array type, got '%s%s' for '%s'", var_typ->name,
psi_t_indirection(let_var->arg->var->pointer_level),
-bool psi_let_func_validate(struct psi_data *data, struct psi_let_exp *val,
- struct psi_let_func *func, struct psi_impl *impl)
+bool psi_let_func_validate(struct psi_data *data, struct psi_let_func *func,
+ struct psi_validate_scope *scope)
- if (!psi_impl_var_validate(data, func->var, impl, val, NULL)) {
+ if (!psi_impl_var_validate(data, func->var, scope)) {
- if (!validate_let_func_inner(data, val, func, impl)) {
+ if (!validate_let_func_inner(data, func, scope)) {
* we only want to set supplied data on unions
*/
if (!zend_symtable_str_exists(Z_ARRVAL_P(frame_arg->zval_ptr),
* we only want to set supplied data on unions
*/
if (!zend_symtable_str_exists(Z_ARRVAL_P(frame_arg->zval_ptr),
struct psi_call_frame *frame);
void exec_let_func_arrval_seq(struct psi_let_func *func,
struct psi_call_frame *frame);
void exec_let_func_arrval_seq(struct psi_let_func *func,
struct psi_call_frame_argument *frame_arg,
struct psi_let_exp *inner_let_exp, void *container,
struct psi_call_frame *frame)
{
struct psi_call_frame_argument *frame_arg,
struct psi_let_exp *inner_let_exp, void *container,
struct psi_call_frame *frame)
{
- ptr = let_fn(&val, darg_type, 0, NULL, zval_ptr, &temp);
+ ptr = let_fn(&val, darg, 0, NULL, zval_ptr, &temp);
frame_arg = psi_call_frame_get_argument(frame, func->var->fqn);
if (frame_arg->zval_ptr && Z_TYPE_P(frame_arg->zval_ptr) != IS_ARRAY) {
frame_arg = psi_call_frame_get_argument(frame, func->var->fqn);
if (frame_arg->zval_ptr && Z_TYPE_P(frame_arg->zval_ptr) != IS_ARRAY) {
if (frame_arg->zval_ptr) {
while (psi_plist_get(func->inner, i++, &inner)) {
if (frame_arg->zval_ptr) {
while (psi_plist_get(func->inner, i++, &inner)) {
- darg_member = psi_decl_arg_get_by_name(darg_members,
- psi_let_exp_get_decl_var_name(inner));
+ zend_string *var_name = psi_let_exp_get_decl_var_name(inner);
+ darg_member = psi_decl_arg_get_by_name(darg_members, var_name);
exec_let_func_arrval_inner(func, darg, darg_member, frame_arg,
inner, container, frame);
exec_let_func_arrval_inner(func, darg, darg_member, frame_arg,
inner, container, frame);
container = ecalloc(arcount + 1, psi_decl_var_get_size(inner->var));
inner->var->pointer_level -= inner->is_reference;
container = ecalloc(arcount + 1, psi_decl_var_get_size(inner->var));
inner->var->pointer_level -= inner->is_reference;
- exec_let_func_arrval_seq(func, darg, darg_type, frame_arg, inner,
- container, frame);
+ exec_let_func_arrval_seq(func, darg, frame_arg, inner, container, frame);
- frame_sym->ival_ptr = let_fn(&frame_sym->temp_val,
- psi_decl_type_get_real(darg->type),
+ frame_sym->ival_ptr = let_fn(&frame_sym->temp_val, darg,