118118typedef int (ZEND_FASTCALL * incdec_t )(zval * );
119119
120120#define get_zval_ptr (op_type , node , type ) _get_zval_ptr(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
121+ #define get_zval_ptr_delayed (op_type , node , type ) _get_zval_ptr_delayed(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
121122#define get_zval_ptr_deref (op_type , node , type ) _get_zval_ptr_deref(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
123+ #define get_zval_ptr_deref_delayed (op_type , node , type ) _get_zval_ptr_deref_delayed(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
122124#define get_zval_ptr_undef (op_type , node , type ) _get_zval_ptr_undef(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
125+ #define get_zval_ptr_undef_delayed (op_type , node , type ) _get_zval_ptr_undef_delayed(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
123126#define get_op_data_zval_ptr_r (op_type , node ) _get_op_data_zval_ptr_r(op_type, node EXECUTE_DATA_CC OPLINE_CC)
127+ #define get_op_data_zval_ptr_r_delayed (op_type , node ) _get_op_data_zval_ptr_r_delayed(op_type, node EXECUTE_DATA_CC OPLINE_CC)
124128#define get_op_data_zval_ptr_deref_r (op_type , node ) _get_op_data_zval_ptr_deref_r(op_type, node EXECUTE_DATA_CC OPLINE_CC)
129+ #define get_op_data_zval_ptr_deref_r_delayed (op_type , node ) _get_op_data_zval_ptr_deref_r_delayed(op_type, node EXECUTE_DATA_CC OPLINE_CC)
125130#define get_zval_ptr_ptr (op_type , node , type ) _get_zval_ptr_ptr(op_type, node, type EXECUTE_DATA_CC)
126131#define get_zval_ptr_ptr_undef (op_type , node , type ) _get_zval_ptr_ptr(op_type, node, type EXECUTE_DATA_CC)
127132#define get_obj_zval_ptr (op_type , node , type ) _get_obj_zval_ptr(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
133+ #define get_obj_zval_ptr_delayed (op_type , node , type ) _get_obj_zval_ptr_delayed(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
128134#define get_obj_zval_ptr_undef (op_type , node , type ) _get_obj_zval_ptr_undef(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
135+ #define get_obj_zval_ptr_undef_delayed (op_type , node , type ) _get_obj_zval_ptr_undef_delayed(op_type, node, type EXECUTE_DATA_CC OPLINE_CC)
129136#define get_obj_zval_ptr_ptr (op_type , node , type ) _get_obj_zval_ptr_ptr(op_type, node, type EXECUTE_DATA_CC)
130137
131138#define RETURN_VALUE_USED (opline ) ((opline)->result_type != IS_UNUSED)
@@ -425,6 +432,14 @@ static zend_always_inline zval *_get_zval_ptr(int op_type, znode_op node, int ty
425432 }
426433}
427434
435+ static zend_always_inline zval * _get_zval_ptr_delayed (int op_type , znode_op node , int type EXECUTE_DATA_DC OPLINE_DC )
436+ {
437+ if (op_type == IS_CONST ) {
438+ return RT_CONSTANT_DELAYED (opline , node );
439+ }
440+ return get_zval_ptr (op_type , node , type );
441+ }
442+
428443static zend_always_inline zval * _get_op_data_zval_ptr_r (int op_type , znode_op node EXECUTE_DATA_DC OPLINE_DC )
429444{
430445 if (op_type & (IS_TMP_VAR |IS_VAR )) {
@@ -445,6 +460,14 @@ static zend_always_inline zval *_get_op_data_zval_ptr_r(int op_type, znode_op no
445460 }
446461}
447462
463+ static zend_always_inline zval * _get_op_data_zval_ptr_r_delayed (int op_type , znode_op node EXECUTE_DATA_DC OPLINE_DC )
464+ {
465+ if (op_type == IS_CONST ) {
466+ return RT_CONSTANT (RT_CONSTANT_DELAYED_OPLINE (opline )+ 1 , (opline + 1 )-> op1 );
467+ }
468+ return get_op_data_zval_ptr_r (op_type , node );
469+ }
470+
448471static zend_always_inline ZEND_ATTRIBUTE_UNUSED zval * _get_zval_ptr_deref (int op_type , znode_op node , int type EXECUTE_DATA_DC OPLINE_DC )
449472{
450473 if (op_type & (IS_TMP_VAR |IS_VAR )) {
@@ -465,6 +488,14 @@ static zend_always_inline ZEND_ATTRIBUTE_UNUSED zval *_get_zval_ptr_deref(int op
465488 }
466489}
467490
491+ static zend_always_inline ZEND_ATTRIBUTE_UNUSED zval * _get_zval_ptr_deref_delayed (int op_type , znode_op node , int type EXECUTE_DATA_DC OPLINE_DC )
492+ {
493+ if (op_type == IS_CONST ) {
494+ return RT_CONSTANT_DELAYED (opline , node );
495+ }
496+ return get_zval_ptr_deref (op_type , node , type );
497+ }
498+
468499static zend_always_inline ZEND_ATTRIBUTE_UNUSED zval * _get_op_data_zval_ptr_deref_r (int op_type , znode_op node EXECUTE_DATA_DC OPLINE_DC )
469500{
470501 if (op_type & (IS_TMP_VAR |IS_VAR )) {
@@ -485,6 +516,14 @@ static zend_always_inline ZEND_ATTRIBUTE_UNUSED zval *_get_op_data_zval_ptr_dere
485516 }
486517}
487518
519+ static zend_always_inline ZEND_ATTRIBUTE_UNUSED zval * _get_op_data_zval_ptr_deref_r_delayed (int op_type , znode_op node EXECUTE_DATA_DC OPLINE_DC )
520+ {
521+ if (op_type == IS_CONST ) {
522+ return RT_CONSTANT (RT_CONSTANT_DELAYED_OPLINE (opline )+ 1 , (opline + 1 )-> op1 );
523+ }
524+ return get_op_data_zval_ptr_deref_r (op_type , node );
525+ }
526+
488527static zend_always_inline zval * _get_zval_ptr_undef (int op_type , znode_op node , int type EXECUTE_DATA_DC OPLINE_DC )
489528{
490529 if (op_type & (IS_TMP_VAR |IS_VAR )) {
@@ -505,6 +544,14 @@ static zend_always_inline zval *_get_zval_ptr_undef(int op_type, znode_op node,
505544 }
506545}
507546
547+ static zend_always_inline zval * _get_zval_ptr_undef_delayed (int op_type , znode_op node , int type EXECUTE_DATA_DC OPLINE_DC )
548+ {
549+ if (op_type == IS_CONST ) {
550+ return RT_CONSTANT_DELAYED (opline , node );
551+ }
552+ return get_zval_ptr_undef (op_type , node , type );
553+ }
554+
508555static zend_always_inline zval * _get_zval_ptr_ptr_var (uint32_t var EXECUTE_DATA_DC )
509556{
510557 zval * ret = EX_VAR (var );
@@ -533,6 +580,14 @@ static inline ZEND_ATTRIBUTE_UNUSED zval *_get_obj_zval_ptr(int op_type, znode_o
533580 return get_zval_ptr (op_type , op , type );
534581}
535582
583+ static inline ZEND_ATTRIBUTE_UNUSED zval * _get_obj_zval_ptr_delayed (int op_type , znode_op op , int type EXECUTE_DATA_DC OPLINE_DC )
584+ {
585+ if (op_type == IS_CONST ) {
586+ return RT_CONSTANT (opline , opline -> op1 );
587+ }
588+ return get_obj_zval_ptr (op_type , op , type );
589+ }
590+
536591static inline ZEND_ATTRIBUTE_UNUSED zval * _get_obj_zval_ptr_undef (int op_type , znode_op op , int type EXECUTE_DATA_DC OPLINE_DC )
537592{
538593 if (op_type == IS_UNUSED ) {
@@ -541,6 +596,14 @@ static inline ZEND_ATTRIBUTE_UNUSED zval *_get_obj_zval_ptr_undef(int op_type, z
541596 return get_zval_ptr_undef (op_type , op , type );
542597}
543598
599+ static inline ZEND_ATTRIBUTE_UNUSED zval * _get_obj_zval_ptr_undef_delayed (int op_type , znode_op op , int type EXECUTE_DATA_DC OPLINE_DC )
600+ {
601+ if (op_type == IS_CONST ) {
602+ return RT_CONSTANT (opline , opline -> op1 );
603+ }
604+ return get_obj_zval_ptr_undef (op_type , op , type );
605+ }
606+
544607static inline ZEND_ATTRIBUTE_UNUSED zval * _get_obj_zval_ptr_ptr (int op_type , znode_op node , int type EXECUTE_DATA_DC )
545608{
546609 if (op_type == IS_UNUSED ) {
@@ -2231,6 +2294,23 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_undefined_offset_delayed(zend_long lv
22312294 zend_error_delayed (E_WARNING , "Undefined array key " ZEND_LONG_FMT , lval );
22322295}
22332296
2297+ ZEND_API void ZEND_FASTCALL zend_handle_delayed_errors (void )
2298+ {
2299+ /* Clear EG(delayed_errors), as more errors may be delayed while we are handling these. */
2300+ HashTable ht ;
2301+ memcpy (& ht , & EG (delayed_errors ), sizeof (HashTable ));
2302+ zend_hash_init (& EG (delayed_errors ), 0 , NULL , NULL , 0 );
2303+
2304+ zend_error_info * info ;
2305+ ZEND_HASH_FOREACH_PTR (& ht , info ) {
2306+ zend_error_zstr_at (info -> type , info -> filename , info -> lineno , info -> message );
2307+ zend_string_release (info -> filename );
2308+ zend_string_release (info -> message );
2309+ efree (info );
2310+ } ZEND_HASH_FOREACH_END ();
2311+ zend_hash_destroy (& ht );
2312+ }
2313+
22342314ZEND_API ZEND_COLD zval * ZEND_FASTCALL zend_undefined_index_write (HashTable * ht , zend_string * offset )
22352315{
22362316 zval * retval ;
@@ -3242,6 +3322,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
32423322
32433323 if (prop_op_type == IS_CONST ) {
32443324 name = Z_STR_P (prop_ptr );
3325+ tmp_name = NULL ;
32453326 } else {
32463327 name = zval_get_tmp_string (prop_ptr , & tmp_name );
32473328 }
0 commit comments