@@ -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 );
@@ -464,22 +460,6 @@ static zval *spl_array_read_dimension(zend_object *object, zval *offset, int typ
464460 return spl_array_read_dimension_ex (1 , object , offset , type , rv );
465461} /* }}} */
466462
467- /*
468- * The assertion(HT_ASSERT_RC1(ht)) failed because the refcount was increased manually when intern->is_child is true.
469- * We have to set the refcount to 1 to make assertion success and restore the refcount to the original value after
470- * modifying the array when intern->is_child is true.
471- */
472- static uint32_t spl_array_set_refcount (bool is_child , HashTable * ht , uint32_t refcount ) /* {{{ */
473- {
474- uint32_t old_refcount = 0 ;
475- if (is_child ) {
476- old_refcount = GC_REFCOUNT (ht );
477- GC_SET_REFCOUNT (ht , refcount );
478- }
479-
480- return old_refcount ;
481- } /* }}} */
482-
483463static void spl_array_write_dimension_ex (int check_inherited , zend_object * object , zval * offset , zval * value ) /* {{{ */
484464{
485465 spl_array_object * intern = spl_array_from_obj (object );
@@ -503,19 +483,12 @@ static void spl_array_write_dimension_ex(int check_inherited, zend_object *objec
503483 }
504484
505485 Z_TRY_ADDREF_P (value );
506-
507- uint32_t refcount = 0 ;
508486 if (!offset || Z_TYPE_P (offset ) == IS_NULL ) {
509487 ht = spl_array_get_hash_table (intern );
510488 if (UNEXPECTED (ht == intern -> sentinel_array )) {
511489 return ;
512490 }
513- refcount = spl_array_set_refcount (intern -> is_child , ht , 1 );
514491 zend_hash_next_index_insert (ht , value );
515-
516- if (refcount ) {
517- spl_array_set_refcount (intern -> is_child , ht , refcount );
518- }
519492 return ;
520493 }
521494
@@ -530,17 +503,13 @@ static void spl_array_write_dimension_ex(int check_inherited, zend_object *objec
530503 spl_hash_key_release (& key );
531504 return ;
532505 }
533- refcount = spl_array_set_refcount ( intern -> is_child , ht , 1 );
506+
534507 if (key .key ) {
535508 zend_hash_update_ind (ht , key .key , value );
536509 spl_hash_key_release (& key );
537510 } else {
538511 zend_hash_index_update (ht , key .h , value );
539512 }
540-
541- if (refcount ) {
542- spl_array_set_refcount (intern -> is_child , ht , refcount );
543- }
544513} /* }}} */
545514
546515static void spl_array_write_dimension (zend_object * object , zval * offset , zval * value ) /* {{{ */
@@ -570,8 +539,6 @@ static void spl_array_unset_dimension_ex(int check_inherited, zend_object *objec
570539 }
571540
572541 ht = spl_array_get_hash_table (intern );
573- uint32_t refcount = spl_array_set_refcount (intern -> is_child , ht , 1 );
574-
575542 if (key .key ) {
576543 zval * data = zend_hash_find (ht , key .key );
577544 if (data ) {
@@ -596,10 +563,6 @@ static void spl_array_unset_dimension_ex(int check_inherited, zend_object *objec
596563 } else {
597564 zend_hash_index_del (ht , key .h );
598565 }
599-
600- if (refcount ) {
601- spl_array_set_refcount (intern -> is_child , ht , refcount );
602- }
603566} /* }}} */
604567
605568static void spl_array_unset_dimension (zend_object * object , zval * offset ) /* {{{ */
@@ -973,15 +936,6 @@ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *ar
973936 } else {
974937 //??? TODO: try to avoid array duplication
975938 ZVAL_ARR (& intern -> array , zend_array_dup (Z_ARR_P (array )));
976-
977- if (intern -> is_child ) {
978- Z_TRY_DELREF (intern -> bucket -> val );
979- /*
980- * replace bucket->val with copied array, so the changes between
981- * parent and child object can affect each other.
982- */
983- ZVAL_COPY (& intern -> bucket -> val , & intern -> array );
984- }
985939 }
986940 } else {
987941 if (Z_OBJ_HT_P (array ) == & spl_handler_ArrayObject ) {
@@ -1854,15 +1808,6 @@ PHP_METHOD(RecursiveArrayIterator, hasChildren)
18541808static void spl_instantiate_child_arg (zend_class_entry * pce , zval * retval , zval * arg1 , zval * arg2 ) /* {{{ */
18551809{
18561810 object_init_ex (retval , pce );
1857- spl_array_object * new_intern = Z_SPLARRAY_P (retval );
1858- /*
1859- * set new_intern->is_child is true to indicate that the object was created by
1860- * RecursiveArrayIterator::getChildren() method.
1861- */
1862- new_intern -> is_child = true;
1863-
1864- /* find the bucket of parent object. */
1865- new_intern -> bucket = (Bucket * )((char * )(arg1 ) - XtOffsetOf (Bucket , val ));;
18661811 zend_call_known_instance_method_with_2_params (pce -> constructor , Z_OBJ_P (retval ), NULL , arg1 , arg2 );
18671812}
18681813/* }}} */
0 commit comments