Skip to content

Commit d7eea8e

Browse files
committed
Store cached string as zend_string
This makes the code a bit simpler.
1 parent 88c57df commit d7eea8e

File tree

2 files changed

+7
-17
lines changed

2 files changed

+7
-17
lines changed

ext/spl/spl_iterators.c

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1491,9 +1491,8 @@ static inline void spl_dual_it_free(spl_dual_it_object *intern)
14911491
ZVAL_UNDEF(&intern->current.key);
14921492
}
14931493
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);
14971496
}
14981497
if (Z_TYPE(intern->u.caching.zchildren) != IS_UNDEF) {
14991498
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)
21612160
case DIT_CachingIterator:
21622161
case DIT_RecursiveCachingIterator:
21632162
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);
21652163
zend_get_gc_buffer_add_zval(gc_buffer, &object->u.caching.zchildren);
21662164
break;
21672165
case DIT_CallbackFilterIterator:
@@ -2384,18 +2382,10 @@ static inline void spl_caching_it_next(spl_dual_it_object *intern)
23842382
}
23852383
}
23862384
if (intern->u.caching.flags & (CIT_TOSTRING_USE_INNER|CIT_CALL_TOSTRING)) {
2387-
int use_copy;
2388-
zval expr_copy;
23892385
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);
23912387
} 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);
23992389
}
24002390
}
24012391
spl_dual_it_next(intern, 0);
@@ -2498,8 +2488,8 @@ PHP_METHOD(CachingIterator, __toString)
24982488
convert_to_string(return_value);
24992489
return;
25002490
}
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);
25032493
} else {
25042494
RETURN_EMPTY_STRING();
25052495
}

ext/spl/spl_iterators.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ typedef struct _spl_dual_it_object {
129129
} limit;
130130
struct {
131131
zend_long flags; /* CIT_* */
132-
zval zstr;
132+
zend_string *zstr;
133133
zval zchildren;
134134
zval zcache;
135135
} caching;

0 commit comments

Comments
 (0)