@@ -44,8 +44,6 @@ typedef struct _spl_array_object {
4444 uint32_t ht_iter ;
4545 int ar_flags ;
4646 unsigned char nApplyCount ;
47- bool is_child ;
48- Bucket * bucket ;
4947 zend_function * fptr_offset_get ;
5048 zend_function * fptr_offset_set ;
5149 zend_function * fptr_offset_has ;
@@ -166,8 +164,6 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zend_o
166164 object_properties_init (& intern -> std , class_type );
167165
168166 intern -> ar_flags = 0 ;
169- intern -> is_child = false;
170- intern -> bucket = NULL ;
171167 intern -> ce_get_iterator = spl_ce_ArrayIterator ;
172168 if (orig ) {
173169 spl_array_object * other = spl_array_from_obj (orig );
@@ -465,22 +461,6 @@ static zval *spl_array_read_dimension(zend_object *object, zval *offset, int typ
465461 return spl_array_read_dimension_ex (1 , object , offset , type , rv );
466462} /* }}} */
467463
468- /*
469- * The assertion(HT_ASSERT_RC1(ht)) failed because the refcount was increased manually when intern->is_child is true.
470- * We have to set the refcount to 1 to make assertion success and restore the refcount to the original value after
471- * modifying the array when intern->is_child is true.
472- */
473- static uint32_t spl_array_set_refcount (bool is_child , HashTable * ht , uint32_t refcount ) /* {{{ */
474- {
475- uint32_t old_refcount = 0 ;
476- if (is_child ) {
477- old_refcount = GC_REFCOUNT (ht );
478- GC_SET_REFCOUNT (ht , refcount );
479- }
480-
481- return old_refcount ;
482- } /* }}} */
483-
484464static void spl_array_write_dimension_ex (int check_inherited , zend_object * object , zval * offset , zval * value ) /* {{{ */
485465{
486466 spl_array_object * intern = spl_array_from_obj (object );
@@ -504,19 +484,12 @@ static void spl_array_write_dimension_ex(int check_inherited, zend_object *objec
504484 }
505485
506486 Z_TRY_ADDREF_P (value );
507-
508- uint32_t refcount = 0 ;
509487 if (!offset || Z_TYPE_P (offset ) == IS_NULL ) {
510488 ht = spl_array_get_hash_table (intern );
511489 if (UNEXPECTED (ht == intern -> sentinel_array )) {
512490 return ;
513491 }
514- refcount = spl_array_set_refcount (intern -> is_child , ht , 1 );
515492 zend_hash_next_index_insert (ht , value );
516-
517- if (refcount ) {
518- spl_array_set_refcount (intern -> is_child , ht , refcount );
519- }
520493 return ;
521494 }
522495
@@ -531,17 +504,13 @@ static void spl_array_write_dimension_ex(int check_inherited, zend_object *objec
531504 spl_hash_key_release (& key );
532505 return ;
533506 }
534- refcount = spl_array_set_refcount ( intern -> is_child , ht , 1 );
507+
535508 if (key .key ) {
536509 zend_hash_update_ind (ht , key .key , value );
537510 spl_hash_key_release (& key );
538511 } else {
539512 zend_hash_index_update (ht , key .h , value );
540513 }
541-
542- if (refcount ) {
543- spl_array_set_refcount (intern -> is_child , ht , refcount );
544- }
545514} /* }}} */
546515
547516static void spl_array_write_dimension (zend_object * object , zval * offset , zval * value ) /* {{{ */
@@ -571,8 +540,6 @@ static void spl_array_unset_dimension_ex(int check_inherited, zend_object *objec
571540 }
572541
573542 ht = spl_array_get_hash_table (intern );
574- uint32_t refcount = spl_array_set_refcount (intern -> is_child , ht , 1 );
575-
576543 if (key .key ) {
577544 zval * data = zend_hash_find (ht , key .key );
578545 if (data ) {
@@ -597,10 +564,6 @@ static void spl_array_unset_dimension_ex(int check_inherited, zend_object *objec
597564 } else {
598565 zend_hash_index_del (ht , key .h );
599566 }
600-
601- if (refcount ) {
602- spl_array_set_refcount (intern -> is_child , ht , refcount );
603- }
604567} /* }}} */
605568
606569static void spl_array_unset_dimension (zend_object * object , zval * offset ) /* {{{ */
@@ -972,15 +935,6 @@ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *ar
972935 } else {
973936 //??? TODO: try to avoid array duplication
974937 ZVAL_ARR (& intern -> array , zend_array_dup (Z_ARR_P (array )));
975-
976- if (intern -> is_child ) {
977- Z_TRY_DELREF (intern -> bucket -> val );
978- /*
979- * replace bucket->val with copied array, so the changes between
980- * parent and child object can affect each other.
981- */
982- ZVAL_COPY (& intern -> bucket -> val , & intern -> array );
983- }
984938 }
985939 } else {
986940 php_error_docref (NULL , E_DEPRECATED ,
@@ -1850,15 +1804,6 @@ PHP_METHOD(RecursiveArrayIterator, hasChildren)
18501804static void spl_instantiate_child_arg (zend_class_entry * pce , zval * retval , zval * arg1 , zval * arg2 ) /* {{{ */
18511805{
18521806 object_init_ex (retval , pce );
1853- spl_array_object * new_intern = Z_SPLARRAY_P (retval );
1854- /*
1855- * set new_intern->is_child is true to indicate that the object was created by
1856- * RecursiveArrayIterator::getChildren() method.
1857- */
1858- new_intern -> is_child = true;
1859-
1860- /* find the bucket of parent object. */
1861- new_intern -> bucket = (Bucket * )((char * )(arg1 ) - XtOffsetOf (Bucket , val ));;
18621807 zend_call_known_instance_method_with_2_params (pce -> constructor , Z_OBJ_P (retval ), NULL , arg1 , arg2 );
18631808}
18641809/* }}} */
0 commit comments