+static inline impl_val *psi_let_func_ex(let_func *func, void *dptr, decl_type *dtype, token_t itype, impl_val *ival, zval *zvalue, void **to_free) {
+ switch (func->type) {
+ case PSI_T_BOOLVAL:
+ return psi_let_boolval(dptr, dtype, itype, ival, zvalue, to_free);
+ case PSI_T_INTVAL:
+ return psi_let_intval(dptr, dtype, itype, ival, zvalue, to_free);
+ case PSI_T_FLOATVAL:
+ return psi_let_floatval(dptr, dtype, itype, ival, zvalue, to_free);
+ case PSI_T_STRVAL:
+ return psi_let_strval(dptr, dtype, itype, ival, zvalue, to_free);
+ case PSI_T_STRLEN:
+ return psi_let_strlen(dptr, dtype, itype, ival, zvalue, to_free);
+ case PSI_T_PATHVAL:
+ return psi_let_pathval(dptr, dtype, itype, ival, zvalue, to_free);
+ case PSI_T_OBJVAL:
+ return psi_let_objval(dptr, dtype, itype, ival, zvalue, to_free);
+ case PSI_T_ZVAL:
+ return psi_let_zval(dptr, dtype, itype, ival, zvalue, to_free);
+ case PSI_T_VOID:
+ return psi_let_void(dptr, dtype, itype, ival, zvalue, to_free);
+ break;
+ case PSI_T_ARRVAL:
+ if (func->inner) {
+ decl_type *real = real_decl_type(dtype);
+
+ if (itype != PSI_T_ARRAY) {
+ SEPARATE_ARG_IF_REF(zvalue);
+ convert_to_array(zvalue);