@@ -500,33 +500,16 @@ static void ZEND_FASTCALL zend_jit_fetch_dim_r_helper(zend_array *ht, zval *dim,
500500 }
501501 ZEND_FALLTHROUGH ;
502502 case IS_NULL :
503- /* The array may be destroyed while throwing the notice.
504- * Temporarily increase the refcount to detect this situation. */
505- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE )) {
506- GC_ADDREF (ht );
503+ retval = zend_hash_find (ht , ZSTR_EMPTY_ALLOC ());
504+ if (!retval ) {
505+ zend_error (E_WARNING , "Undefined array key \"\"" );
506+ ZVAL_NULL (result );
507+ } else {
508+ ZVAL_COPY_DEREF (result , retval );
507509 }
508- execute_data = EG (current_execute_data );
509- opline = EX (opline );
510+
510511 zend_error (E_DEPRECATED , "Using null as an array offset is deprecated, use an empty string instead" );
511- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE ) && !GC_DELREF (ht )) {
512- zend_array_destroy (ht );
513- if (opline -> result_type & (IS_VAR | IS_TMP_VAR )) {
514- if (EG (exception )) {
515- ZVAL_UNDEF (EX_VAR (opline -> result .var ));
516- } else {
517- ZVAL_NULL (EX_VAR (opline -> result .var ));
518- }
519- }
520- return ;
521- }
522- if (EG (exception )) {
523- if (opline -> result_type & (IS_VAR | IS_TMP_VAR )) {
524- ZVAL_UNDEF (EX_VAR (opline -> result .var ));
525- }
526- return ;
527- }
528- offset_key = ZSTR_EMPTY_ALLOC ();
529- goto str_index ;
512+ return ;
530513 case IS_DOUBLE :
531514 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
532515 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
@@ -667,33 +650,15 @@ static void ZEND_FASTCALL zend_jit_fetch_dim_is_helper(zend_array *ht, zval *dim
667650 }
668651 ZEND_FALLTHROUGH ;
669652 case IS_NULL :
670- /* The array may be destroyed while throwing the notice.
671- * Temporarily increase the refcount to detect this situation. */
672- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE )) {
673- GC_ADDREF (ht );
653+ retval = zend_hash_find (ht , ZSTR_EMPTY_ALLOC ());
654+ if (!retval ) {
655+ ZVAL_NULL (result );
656+ } else {
657+ ZVAL_COPY_DEREF (result , retval );
674658 }
675- execute_data = EG (current_execute_data );
676- opline = EX (opline );
659+
677660 zend_error (E_DEPRECATED , "Using null as an array offset is deprecated, use an empty string instead" );
678- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE ) && !GC_DELREF (ht )) {
679- zend_array_destroy (ht );
680- if (opline -> result_type & (IS_VAR | IS_TMP_VAR )) {
681- if (EG (exception )) {
682- ZVAL_UNDEF (EX_VAR (opline -> result .var ));
683- } else {
684- ZVAL_NULL (EX_VAR (opline -> result .var ));
685- }
686- }
687- return ;
688- }
689- if (EG (exception )) {
690- if (opline -> result_type & (IS_VAR | IS_TMP_VAR )) {
691- ZVAL_UNDEF (EX_VAR (opline -> result .var ));
692- }
693- return ;
694- }
695- offset_key = ZSTR_EMPTY_ALLOC ();
696- goto str_index ;
661+ return ;
697662 case IS_DOUBLE :
698663 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
699664 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
@@ -819,22 +784,21 @@ static int ZEND_FASTCALL zend_jit_fetch_dim_isset_helper(zend_array *ht, zval *d
819784 return 0 ;
820785 }
821786 ZEND_FALLTHROUGH ;
822- case IS_NULL :
823- /* The array may be destroyed while throwing the notice.
824- * Temporarily increase the refcount to detect this situation. */
825- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE )) {
826- GC_ADDREF (ht );
787+ case IS_NULL : {
788+ int result ;
789+ retval = zend_hash_find (ht , ZSTR_EMPTY_ALLOC ());
790+ if (!retval ) {
791+ result = 0 ;
792+ } else {
793+ if (UNEXPECTED (Z_TYPE_P (retval ) == IS_REFERENCE )) {
794+ retval = Z_REFVAL_P (retval );
795+ }
796+ result = Z_TYPE_P (retval ) > IS_NULL ;
827797 }
798+
828799 zend_error (E_DEPRECATED , "Using null as an array offset is deprecated, use an empty string instead" );
829- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE ) && !GC_DELREF (ht )) {
830- zend_array_destroy (ht );
831- return 0 ;
832- }
833- if (EG (exception )) {
834- return 0 ;
835- }
836- offset_key = ZSTR_EMPTY_ALLOC ();
837- goto str_index ;
800+ return result ;
801+ }
838802 case IS_DOUBLE :
839803 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
840804 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
@@ -948,6 +912,13 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di
948912 }
949913 execute_data = EG (current_execute_data );
950914 opline = EX (opline );
915+
916+ retval = zend_hash_find (ht , ZSTR_EMPTY_ALLOC ());
917+ if (!retval ) {
918+ /* Key may be released while throwing the undefined index warning. */
919+ retval = zend_undefined_index_write (ht , ZSTR_EMPTY_ALLOC ());
920+ }
921+
951922 zend_error (E_DEPRECATED , "Using null as an array offset is deprecated, use an empty string instead" );
952923 if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE ) && GC_DELREF (ht ) != 1 ) {
953924 if (!GC_REFCOUNT (ht )) {
@@ -968,8 +939,7 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di
968939 }
969940 return NULL ;
970941 }
971- offset_key = ZSTR_EMPTY_ALLOC ();
972- goto str_index ;
942+ return retval ;
973943 case IS_DOUBLE :
974944 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
975945 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
@@ -1108,6 +1078,9 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_w_helper(zend_array *ht, zval *dim
11081078 }
11091079 execute_data = EG (current_execute_data );
11101080 opline = EX (opline );
1081+
1082+ retval = zend_hash_lookup (ht , ZSTR_EMPTY_ALLOC ());
1083+
11111084 zend_error (E_DEPRECATED , "Using null as an array offset is deprecated, use an empty string instead" );
11121085 if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE ) && GC_DELREF (ht ) != 1 ) {
11131086 if (!GC_REFCOUNT (ht )) {
@@ -1132,8 +1105,7 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_w_helper(zend_array *ht, zval *dim
11321105 }
11331106 return NULL ;
11341107 }
1135- offset_key = ZSTR_EMPTY_ALLOC ();
1136- goto str_index ;
1108+ return retval ;
11371109 case IS_DOUBLE :
11381110 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
11391111 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
0 commit comments