@@ -500,33 +500,17 @@ 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+
513+ return ;
530514 case IS_DOUBLE :
531515 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
532516 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
@@ -667,33 +651,17 @@ static void ZEND_FASTCALL zend_jit_fetch_dim_is_helper(zend_array *ht, zval *dim
667651 }
668652 ZEND_FALLTHROUGH ;
669653 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 );
654+ retval = zend_hash_find (ht , ZSTR_EMPTY_ALLOC ());
655+ if (!retval ) {
656+ zend_error (E_WARNING , "Undefined array key \"\"" );
657+ ZVAL_NULL (result );
658+ } else {
659+ ZVAL_COPY_DEREF (result , retval );
674660 }
675- execute_data = EG (current_execute_data );
676- opline = EX (opline );
661+
677662 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 ;
663+
664+ return ;
697665 case IS_DOUBLE :
698666 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
699667 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
@@ -819,22 +787,20 @@ static int ZEND_FASTCALL zend_jit_fetch_dim_isset_helper(zend_array *ht, zval *d
819787 return 0 ;
820788 }
821789 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 );
790+ case IS_NULL : {
791+ zval * result ;
792+ retval = zend_hash_find (ht , ZSTR_EMPTY_ALLOC ());
793+ if (!retval ) {
794+ zend_error (E_WARNING , "Undefined array key \"\"" );
795+ ZVAL_NULL (result );
796+ } else {
797+ ZVAL_COPY_DEREF (result , retval );
827798 }
799+
828800 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 ;
801+
802+ return Z_TYPE_P (retval ) > IS_NULL ;
803+ }
838804 case IS_DOUBLE :
839805 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
840806 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
@@ -940,36 +906,20 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di
940906 return NULL ;
941907 }
942908 ZEND_FALLTHROUGH ;
943- case IS_NULL :
944- /* The array may be destroyed while throwing the notice.
945- * Temporarily increase the refcount to detect this situation. */
946- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE )) {
947- GC_ADDREF (ht );
909+ case IS_NULL : {
910+ zval * result ;
911+ retval = zend_hash_find (ht , ZSTR_EMPTY_ALLOC ());
912+ if (!retval ) {
913+ zend_error (E_WARNING , "Undefined array key \"\"" );
914+ ZVAL_NULL (result );
915+ } else {
916+ ZVAL_COPY_DEREF (result , retval );
948917 }
949- execute_data = EG (current_execute_data );
950- opline = EX (opline );
918+
951919 zend_error (E_DEPRECATED , "Using null as an array offset is deprecated, use an empty string instead" );
952- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE ) && GC_DELREF (ht ) != 1 ) {
953- if (!GC_REFCOUNT (ht )) {
954- zend_array_destroy (ht );
955- }
956- if (opline -> result_type & (IS_VAR | IS_TMP_VAR )) {
957- if (EG (exception )) {
958- ZVAL_UNDEF (EX_VAR (opline -> result .var ));
959- } else {
960- ZVAL_NULL (EX_VAR (opline -> result .var ));
961- }
962- }
963- return NULL ;
964- }
965- if (EG (exception )) {
966- if (opline -> result_type & (IS_VAR | IS_TMP_VAR )) {
967- ZVAL_UNDEF (EX_VAR (opline -> result .var ));
968- }
969- return NULL ;
970- }
971- offset_key = ZSTR_EMPTY_ALLOC ();
972- goto str_index ;
920+
921+ return retval ;
922+ }
973923 case IS_DOUBLE :
974924 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
975925 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
@@ -1100,40 +1050,20 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_w_helper(zend_array *ht, zval *dim
11001050 return NULL ;
11011051 }
11021052 ZEND_FALLTHROUGH ;
1103- case IS_NULL :
1104- /* The array may be destroyed while throwing the notice.
1105- * Temporarily increase the refcount to detect this situation. */
1106- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE )) {
1107- GC_ADDREF (ht );
1053+ case IS_NULL : {
1054+ zval * result ;
1055+ retval = zend_hash_find (ht , ZSTR_EMPTY_ALLOC ());
1056+ if (!retval ) {
1057+ zend_error (E_WARNING , "Undefined array key \"\"" );
1058+ ZVAL_NULL (result );
1059+ } else {
1060+ ZVAL_COPY_DEREF (result , retval );
11081061 }
1109- execute_data = EG (current_execute_data );
1110- opline = EX (opline );
1062+
11111063 zend_error (E_DEPRECATED , "Using null as an array offset is deprecated, use an empty string instead" );
1112- if (!(GC_FLAGS (ht ) & IS_ARRAY_IMMUTABLE ) && GC_DELREF (ht ) != 1 ) {
1113- if (!GC_REFCOUNT (ht )) {
1114- zend_array_destroy (ht );
1115- }
1116- if (opline -> result_type & (IS_VAR | IS_TMP_VAR )) {
1117- if (EG (exception )) {
1118- ZVAL_UNDEF (EX_VAR (opline -> result .var ));
1119- } else {
1120- ZVAL_NULL (EX_VAR (opline -> result .var ));
1121- }
1122- }
1123- if (opline -> opcode == ZEND_ASSIGN_DIM
1124- && ((opline + 1 )-> op1_type & (IS_VAR | IS_TMP_VAR ))) {
1125- zval_ptr_dtor_nogc (EX_VAR ((opline + 1 )-> op1 .var ));
1126- }
1127- return NULL ;
1128- }
1129- if (EG (exception )) {
1130- if (opline -> result_type & (IS_VAR | IS_TMP_VAR )) {
1131- ZVAL_UNDEF (EX_VAR (opline -> result .var ));
1132- }
1133- return NULL ;
1134- }
1135- offset_key = ZSTR_EMPTY_ALLOC ();
1136- goto str_index ;
1064+
1065+ return NULL ;
1066+ }
11371067 case IS_DOUBLE :
11381068 hval = zend_dval_to_lval (Z_DVAL_P (dim ));
11391069 if (!zend_is_long_compatible (Z_DVAL_P (dim ), hval )) {
0 commit comments