Skip to content

Commit 3eeb577

Browse files
Avoid addref/delref where possible
1 parent 34132a7 commit 3eeb577

File tree

2 files changed

+18
-43
lines changed

2 files changed

+18
-43
lines changed

Zend/zend_execute.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2631,9 +2631,7 @@ static zend_never_inline uint8_t slow_index_convert(HashTable *ht, const zval *d
26312631
case IS_NULL:
26322632
/* The array may be destroyed while throwing the notice.
26332633
* Temporarily increase the refcount to detect this situation. */
2634-
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
2635-
GC_ADDREF(ht);
2636-
}
2634+
GC_TRY_ADDREF(ht);
26372635

26382636
zend_error(E_DEPRECATED, "Using null as an array offset is deprecated, use an empty string instead");
26392637

@@ -2718,9 +2716,7 @@ static zend_never_inline uint8_t slow_index_convert_w(HashTable *ht, const zval
27182716
case IS_NULL:
27192717
/* The array may be destroyed while throwing the notice.
27202718
* Temporarily increase the refcount to detect this situation. */
2721-
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
2722-
GC_ADDREF(ht);
2723-
}
2719+
GC_TRY_ADDREF(ht);
27242720

27252721
zend_error(E_DEPRECATED, "Using null as an array offset is deprecated, use an empty string instead");
27262722

@@ -3226,9 +3222,7 @@ static zend_never_inline zval* ZEND_FASTCALL zend_find_array_dim_slow(HashTable
32263222
null_undef_idx:
32273223
/* The array may be destroyed while throwing the notice.
32283224
* Temporarily increase the refcount to detect this situation. */
3229-
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
3230-
GC_ADDREF(ht);
3231-
}
3225+
GC_TRY_ADDREF(ht);
32323226

32333227
zend_error(E_DEPRECATED, "Using null as an array offset is deprecated, use an empty string instead");
32343228

ext/opcache/jit/zend_jit_helpers.c

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
offset_key = ZSTR_EMPTY_ALLOC();
504+
retval = zend_hash_find(ht, offset_key);
505+
if (!retval) {
506+
zend_error(E_WARNING, "Undefined array key \"\"");
507+
ZVAL_NULL(result);
508+
} else {
509+
ZVAL_COPY_DEREF(result, retval);
507510
}
508-
execute_data = EG(current_execute_data);
509-
opline = EX(opline);
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)) {
@@ -669,9 +653,8 @@ static void ZEND_FASTCALL zend_jit_fetch_dim_is_helper(zend_array *ht, zval *dim
669653
case IS_NULL:
670654
/* The array may be destroyed while throwing the notice.
671655
* Temporarily increase the refcount to detect this situation. */
672-
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
673-
GC_ADDREF(ht);
674-
}
656+
GC_TRY_ADDREF(ht);
657+
675658
execute_data = EG(current_execute_data);
676659
opline = EX(opline);
677660
zend_error(E_DEPRECATED, "Using null as an array offset is deprecated, use an empty string instead");
@@ -822,9 +805,8 @@ static int ZEND_FASTCALL zend_jit_fetch_dim_isset_helper(zend_array *ht, zval *d
822805
case IS_NULL:
823806
/* The array may be destroyed while throwing the notice.
824807
* Temporarily increase the refcount to detect this situation. */
825-
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
826-
GC_ADDREF(ht);
827-
}
808+
GC_TRY_ADDREF(ht);
809+
828810
zend_error(E_DEPRECATED, "Using null as an array offset is deprecated, use an empty string instead");
829811
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) {
830812
zend_array_destroy(ht);
@@ -943,9 +925,8 @@ static zval* ZEND_FASTCALL zend_jit_fetch_dim_rw_helper(zend_array *ht, zval *di
943925
case IS_NULL:
944926
/* The array may be destroyed while throwing the notice.
945927
* Temporarily increase the refcount to detect this situation. */
946-
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
947-
GC_ADDREF(ht);
948-
}
928+
GC_TRY_ADDREF(ht);
929+
949930
execute_data = EG(current_execute_data);
950931
opline = EX(opline);
951932
zend_error(E_DEPRECATED, "Using null as an array offset is deprecated, use an empty string instead");

0 commit comments

Comments
 (0)