@@ -1491,9 +1491,8 @@ static inline void spl_dual_it_free(spl_dual_it_object *intern)
1491
1491
ZVAL_UNDEF (& intern -> current .key );
1492
1492
}
1493
1493
if (intern -> dit_type == DIT_CachingIterator || intern -> dit_type == DIT_RecursiveCachingIterator ) {
1494
- if (Z_TYPE (intern -> u .caching .zstr ) != IS_UNDEF ) {
1495
- zval_ptr_dtor (& intern -> u .caching .zstr );
1496
- ZVAL_UNDEF (& intern -> u .caching .zstr );
1494
+ if (intern -> u .caching .zstr ) {
1495
+ zend_string_release (intern -> u .caching .zstr );
1497
1496
}
1498
1497
if (Z_TYPE (intern -> u .caching .zchildren ) != IS_UNDEF ) {
1499
1498
zval_ptr_dtor (& intern -> u .caching .zchildren );
@@ -2161,7 +2160,6 @@ static HashTable *spl_dual_it_get_gc(zend_object *obj, zval **table, int *n)
2161
2160
case DIT_CachingIterator :
2162
2161
case DIT_RecursiveCachingIterator :
2163
2162
zend_get_gc_buffer_add_zval (gc_buffer , & object -> u .caching .zcache );
2164
- zend_get_gc_buffer_add_zval (gc_buffer , & object -> u .caching .zstr );
2165
2163
zend_get_gc_buffer_add_zval (gc_buffer , & object -> u .caching .zchildren );
2166
2164
break ;
2167
2165
case DIT_CallbackFilterIterator :
@@ -2384,18 +2382,10 @@ static inline void spl_caching_it_next(spl_dual_it_object *intern)
2384
2382
}
2385
2383
}
2386
2384
if (intern -> u .caching .flags & (CIT_TOSTRING_USE_INNER |CIT_CALL_TOSTRING )) {
2387
- int use_copy ;
2388
- zval expr_copy ;
2389
2385
if (intern -> u .caching .flags & CIT_TOSTRING_USE_INNER ) {
2390
- ZVAL_COPY_VALUE ( & intern -> u .caching .zstr , & intern -> inner .zobject );
2386
+ intern -> u .caching .zstr = zval_get_string ( & intern -> inner .zobject );
2391
2387
} else {
2392
- ZVAL_COPY_VALUE (& intern -> u .caching .zstr , & intern -> current .data );
2393
- }
2394
- use_copy = zend_make_printable_zval (& intern -> u .caching .zstr , & expr_copy );
2395
- if (use_copy ) {
2396
- ZVAL_COPY_VALUE (& intern -> u .caching .zstr , & expr_copy );
2397
- } else {
2398
- Z_TRY_ADDREF (intern -> u .caching .zstr );
2388
+ intern -> u .caching .zstr = zval_get_string (& intern -> current .data );
2399
2389
}
2400
2390
}
2401
2391
spl_dual_it_next (intern , 0 );
@@ -2498,8 +2488,8 @@ PHP_METHOD(CachingIterator, __toString)
2498
2488
convert_to_string (return_value );
2499
2489
return ;
2500
2490
}
2501
- if (Z_TYPE ( intern -> u .caching .zstr ) == IS_STRING ) {
2502
- RETURN_STR_COPY (Z_STR_P ( & intern -> u .caching .zstr ) );
2491
+ if (intern -> u .caching .zstr ) {
2492
+ RETURN_STR_COPY (intern -> u .caching .zstr );
2503
2493
} else {
2504
2494
RETURN_EMPTY_STRING ();
2505
2495
}
0 commit comments