@@ -7747,13 +7747,28 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32
7747
7747
zval_ptr_dtor (& default_node .u .constant );
7748
7748
}
7749
7749
7750
- opline = zend_emit_op (NULL , opcode , NULL , & default_node );
7751
- SET_NODE (opline -> result , & var_node );
7752
- opline -> op1 .num = i + 1 ;
7753
-
7754
7750
uint32_t arg_info_flags = _ZEND_ARG_INFO_FLAGS (is_ref , is_variadic , /* is_tentative */ 0 )
7755
7751
| (is_promoted ? _ZEND_IS_PROMOTED_BIT : 0 );
7756
7752
ZEND_TYPE_FULL_MASK (arg_info -> type ) |= arg_info_flags ;
7753
+
7754
+ if (opcode == ZEND_RECV
7755
+ && type_ast
7756
+ && ZEND_TYPE_IS_COMPLEX (arg_info -> type )
7757
+ && !ZEND_TYPE_HAS_LIST (arg_info -> type )
7758
+ && ZEND_TYPE_HAS_NAME (arg_info -> type )
7759
+ && !ZEND_TYPE_HAS_LITERAL_NAME (arg_info -> type ) // TODO: necessary?
7760
+ && ZEND_TYPE_PURE_MASK (arg_info -> type ) == 0 ) {
7761
+ znode ce_name ;
7762
+ ce_name .op_type = IS_CONST ;
7763
+ ZVAL_STR_COPY (& ce_name .u .constant , ZEND_TYPE_NAME (arg_info -> type ));
7764
+ opcode = ZEND_RECV_CE ;
7765
+ opline = zend_emit_op (NULL , opcode , NULL , & ce_name );
7766
+ } else {
7767
+ opline = zend_emit_op (NULL , opcode , NULL , & default_node );
7768
+ }
7769
+ SET_NODE (opline -> result , & var_node );
7770
+ opline -> op1 .num = i + 1 ;
7771
+
7757
7772
if (opcode == ZEND_RECV ) {
7758
7773
opline -> op2 .num = type_ast ?
7759
7774
ZEND_TYPE_FULL_MASK (arg_info -> type ) : MAY_BE_ANY ;
0 commit comments