zval passthru
[m6w6/ext-psi] / src / context_validate.c
index 87aba784064c7d3f1fd2a907940d6a482d9bdb49..180b34d94c3e3b652f7e20e1184a4bbe13019020 100644 (file)
@@ -531,9 +531,6 @@ static inline int validate_decl_func(PSI_Data *data, void *dl, decl *decl, decl_
                return 0;
        }
 
-       if (!validate_decl_arg(data, func)) {
-               return 0;
-       }
        for (redir = &psi_func_redirs[0]; redir->name; ++redir) {
                if (!strcmp(func->var->name, redir->name)) {
                        decl->call.sym = redir->func;
@@ -552,14 +549,13 @@ static inline int validate_decl_func(PSI_Data *data, void *dl, decl *decl, decl_
        }
        return 1;
 }
-
-static inline int validate_decl(PSI_Data *data, void *dl, decl *decl) {
+static inline int validate_decl_nodl(PSI_Data *data, decl *decl) {
        if (!validate_decl_abi(data, decl->abi)) {
                data->error(data, decl->abi->token, PSI_WARNING,
                                "Invalid calling convention: '%s'", decl->abi->token->text);
                return 0;
        }
-       if (!validate_decl_func(data, dl, decl, decl->func)) {
+       if (!validate_decl_arg(data, decl->func)) {
                return 0;
        }
        if (decl->args) {
@@ -573,6 +569,15 @@ static inline int validate_decl(PSI_Data *data, void *dl, decl *decl) {
        }
        return 1;
 }
+static inline int validate_decl(PSI_Data *data, void *dl, decl *decl) {
+       if (!validate_decl_nodl(data, decl)) {
+               return 0;
+       }
+       if (!validate_decl_func(data, dl, decl, decl->func)) {
+               return 0;
+       }
+       return 1;
+}
 static inline decl_arg *locate_decl_var_arg(decl_var *var, decl_args *args, decl_arg *func) {
        size_t i;
 
@@ -719,27 +724,14 @@ static inline int validate_decl_enum(PSI_Data *data, decl_enum *e) {
 
 static inline int validate_set_value_handler(set_value *set) {
        switch (set->func->type) {
-       case PSI_T_TO_BOOL:
-               set->func->handler = psi_to_bool;
-               break;
-       case PSI_T_TO_INT:
-               set->func->handler = psi_to_int;
-               break;
-       case PSI_T_TO_FLOAT:
-               set->func->handler = psi_to_double;
-               break;
-       case PSI_T_TO_STRING:
-               set->func->handler = psi_to_string;
-               break;
-       case PSI_T_TO_ARRAY:
-               set->func->handler = psi_to_array;
-               break;
-       case PSI_T_TO_OBJECT:
-               set->func->handler = psi_to_object;
-               break;
-       case PSI_T_VOID:
-               set->func->handler = psi_to_void;
-               break;
+       case PSI_T_TO_BOOL:             set->func->handler = psi_to_bool;               break;
+       case PSI_T_TO_INT:              set->func->handler = psi_to_int;                break;
+       case PSI_T_TO_FLOAT:    set->func->handler = psi_to_double;             break;
+       case PSI_T_TO_STRING:   set->func->handler = psi_to_string;             break;
+       case PSI_T_TO_ARRAY:    set->func->handler = psi_to_array;              break;
+       case PSI_T_TO_OBJECT:   set->func->handler = psi_to_object;             break;
+       case PSI_T_VOID:                set->func->handler = psi_to_void;               break;
+       case PSI_T_ZVAL:                set->func->handler = psi_to_zval;               break;
        case PSI_T_ELLIPSIS:
                if (set->outer.set && set->outer.set->func->type == PSI_T_TO_ARRAY) {
                        set->func->handler = psi_to_recursive;
@@ -938,6 +930,7 @@ static inline int validate_let_func(PSI_Data *data, let_func *func, impl *impl)
        case PSI_T_PATHVAL:             func->handler = psi_let_pathval;        break;
        case PSI_T_ARRVAL:              func->handler = psi_let_arrval;         break;
        case PSI_T_OBJVAL:              func->handler = psi_let_objval;         break;
+       case PSI_T_ZVAL:                func->handler = psi_let_zval;           break;
        EMPTY_SWITCH_DEFAULT_CASE();
        }
        return 1;
@@ -963,7 +956,7 @@ static inline int validate_let_callback(PSI_Data *data, decl_var *cb_var, let_ca
                }
        }
 
-       if (!validate_decl(data, NULL, cb_func)) {
+       if (!validate_decl_nodl(data, cb_func)) {
                return 0;
        }