@@ -7747,13 +7747,28 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32
77477747			zval_ptr_dtor (& default_node .u .constant );
77487748		}
77497749
7750- 		opline  =  zend_emit_op (NULL , opcode , NULL , & default_node );
7751- 		SET_NODE (opline -> result , & var_node );
7752- 		opline -> op1 .num  =  i  +  1 ;
7753- 
77547750		uint32_t  arg_info_flags  =  _ZEND_ARG_INFO_FLAGS (is_ref , is_variadic , /* is_tentative */  0 )
77557751			| (is_promoted  ? _ZEND_IS_PROMOTED_BIT  : 0 );
77567752		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+ 
77577772		if  (opcode  ==  ZEND_RECV ) {
77587773			opline -> op2 .num  =  type_ast  ?
77597774				ZEND_TYPE_FULL_MASK (arg_info -> type ) : MAY_BE_ANY ;
0 commit comments