@@ -976,7 +976,7 @@ static zend_object *spl_RecursiveTreeIterator_new(zend_class_entry *class_type)
976
976
}
977
977
/* }}} */
978
978
979
- static void spl_recursive_tree_iterator_get_prefix (spl_recursive_it_object * object , zval * return_value )
979
+ static zend_string * spl_recursive_tree_iterator_get_prefix (spl_recursive_it_object * object )
980
980
{
981
981
smart_str str = {0 };
982
982
zval has_next ;
@@ -1008,31 +1008,28 @@ static void spl_recursive_tree_iterator_get_prefix(spl_recursive_it_object *obje
1008
1008
smart_str_appendl (& str , ZSTR_VAL (object -> prefix [5 ].s ), ZSTR_LEN (object -> prefix [5 ].s ));
1009
1009
smart_str_0 (& str );
1010
1010
1011
- RETURN_NEW_STR ( str .s ) ;
1011
+ return str .s ;
1012
1012
}
1013
1013
1014
- static void spl_recursive_tree_iterator_get_entry (spl_recursive_it_object * object , zval * return_value )
1014
+ static zend_string * spl_recursive_tree_iterator_get_entry (spl_recursive_it_object * object )
1015
1015
{
1016
- zend_object_iterator * iterator = object -> iterators [object -> level ].iterator ;
1017
- zval * data ;
1016
+ zend_object_iterator * iterator = object -> iterators [object -> level ].iterator ;
1017
+ zval * data = iterator -> funcs -> get_current_data (iterator );
1018
+ if (!data ) {
1019
+ return NULL ;
1020
+ }
1018
1021
1019
- data = iterator -> funcs -> get_current_data (iterator );
1020
- if (data ) {
1021
- ZVAL_DEREF (data );
1022
+ ZVAL_DEREF (data );
1023
+ if (Z_TYPE_P (data ) == IS_ARRAY ) {
1022
1024
/* TODO: Remove this special case? */
1023
- if (Z_TYPE_P (data ) == IS_ARRAY ) {
1024
- RETVAL_INTERNED_STR (ZSTR_KNOWN (ZEND_STR_ARRAY_CAPITALIZED ));
1025
- } else {
1026
- ZVAL_COPY (return_value , data );
1027
- convert_to_string (return_value );
1028
- }
1025
+ return ZSTR_KNOWN (ZEND_STR_ARRAY_CAPITALIZED );
1029
1026
}
1027
+ return zval_get_string (data );
1030
1028
}
1031
1029
1032
- static void spl_recursive_tree_iterator_get_postfix (spl_recursive_it_object * object , zval * return_value )
1030
+ static zend_string * spl_recursive_tree_iterator_get_postfix (spl_recursive_it_object * object )
1033
1031
{
1034
- RETVAL_STR (object -> postfix [0 ].s );
1035
- Z_ADDREF_P (return_value );
1032
+ return zend_string_copy (object -> postfix [0 ].s );
1036
1033
}
1037
1034
1038
1035
/* {{{ RecursiveIteratorIterator to generate ASCII graphic trees for the entries in a RecursiveIterator */
@@ -1076,7 +1073,7 @@ PHP_METHOD(RecursiveTreeIterator, getPrefix)
1076
1073
RETURN_THROWS ();
1077
1074
}
1078
1075
1079
- spl_recursive_tree_iterator_get_prefix (object , return_value );
1076
+ RETURN_STR ( spl_recursive_tree_iterator_get_prefix (object ) );
1080
1077
} /* }}} */
1081
1078
1082
1079
/* {{{ Sets postfix as used in getPostfix() */
@@ -1108,7 +1105,12 @@ PHP_METHOD(RecursiveTreeIterator, getEntry)
1108
1105
RETURN_THROWS ();
1109
1106
}
1110
1107
1111
- spl_recursive_tree_iterator_get_entry (object , return_value );
1108
+ zend_string * entry = spl_recursive_tree_iterator_get_entry (object );
1109
+ if (!entry ) {
1110
+ // TODO: Can this happen? It's not in the stubs.
1111
+ RETURN_NULL ();
1112
+ }
1113
+ RETURN_STR (entry );
1112
1114
} /* }}} */
1113
1115
1114
1116
/* {{{ Returns the string to place after the current element */
@@ -1125,16 +1127,13 @@ PHP_METHOD(RecursiveTreeIterator, getPostfix)
1125
1127
RETURN_THROWS ();
1126
1128
}
1127
1129
1128
- spl_recursive_tree_iterator_get_postfix (object , return_value );
1130
+ RETURN_STR ( spl_recursive_tree_iterator_get_postfix (object ) );
1129
1131
} /* }}} */
1130
1132
1131
1133
/* {{{ Returns the current element prefixed and postfixed */
1132
1134
PHP_METHOD (RecursiveTreeIterator , current )
1133
1135
{
1134
- spl_recursive_it_object * object = Z_SPLRECURSIVE_IT_P (ZEND_THIS );
1135
- zval prefix , entry , postfix ;
1136
- char * ptr ;
1137
- zend_string * str ;
1136
+ spl_recursive_it_object * object = Z_SPLRECURSIVE_IT_P (ZEND_THIS );
1138
1137
1139
1138
if (zend_parse_parameters_none () == FAILURE ) {
1140
1139
RETURN_THROWS ();
@@ -1159,43 +1158,32 @@ PHP_METHOD(RecursiveTreeIterator, current)
1159
1158
}
1160
1159
}
1161
1160
1162
- ZVAL_NULL (& prefix );
1163
- ZVAL_NULL (& entry );
1164
- spl_recursive_tree_iterator_get_prefix (object , & prefix );
1165
- spl_recursive_tree_iterator_get_entry (object , & entry );
1166
- if (Z_TYPE (entry ) != IS_STRING ) {
1167
- zval_ptr_dtor (& prefix );
1168
- zval_ptr_dtor (& entry );
1161
+ zend_string * entry = spl_recursive_tree_iterator_get_entry (object );
1162
+ if (!entry ) {
1169
1163
RETURN_NULL ();
1170
1164
}
1171
- spl_recursive_tree_iterator_get_postfix (object , & postfix );
1172
1165
1173
- str = zend_string_alloc ( Z_STRLEN ( prefix ) + Z_STRLEN ( entry ) + Z_STRLEN ( postfix ), 0 );
1174
- ptr = ZSTR_VAL ( str );
1166
+ zend_string * prefix = spl_recursive_tree_iterator_get_prefix ( object );
1167
+ zend_string * postfix = spl_recursive_tree_iterator_get_postfix ( object );
1175
1168
1176
- memcpy (ptr , Z_STRVAL (prefix ), Z_STRLEN (prefix ));
1177
- ptr += Z_STRLEN (prefix );
1178
- memcpy (ptr , Z_STRVAL (entry ), Z_STRLEN (entry ));
1179
- ptr += Z_STRLEN (entry );
1180
- memcpy (ptr , Z_STRVAL (postfix ), Z_STRLEN (postfix ));
1181
- ptr += Z_STRLEN (postfix );
1182
- * ptr = 0 ;
1169
+ zend_string * result = zend_string_concat3 (
1170
+ ZSTR_VAL (prefix ), ZSTR_LEN (prefix ),
1171
+ ZSTR_VAL (entry ), ZSTR_LEN (entry ),
1172
+ ZSTR_VAL (postfix ), ZSTR_LEN (postfix ));
1183
1173
1184
- zval_ptr_dtor ( & prefix );
1185
- zval_ptr_dtor ( & entry );
1186
- zval_ptr_dtor ( & postfix );
1174
+ zend_string_release ( entry );
1175
+ zend_string_release ( prefix );
1176
+ zend_string_release ( postfix );
1187
1177
1188
- RETURN_NEW_STR (str );
1178
+ RETURN_NEW_STR (result );
1189
1179
} /* }}} */
1190
1180
1191
1181
/* {{{ Returns the current key prefixed and postfixed */
1192
1182
PHP_METHOD (RecursiveTreeIterator , key )
1193
1183
{
1194
1184
spl_recursive_it_object * object = Z_SPLRECURSIVE_IT_P (ZEND_THIS );
1195
1185
zend_object_iterator * iterator ;
1196
- zval prefix , key , postfix , key_copy ;
1197
- char * ptr ;
1198
- zend_string * str ;
1186
+ zval key ;
1199
1187
1200
1188
if (zend_parse_parameters_none () == FAILURE ) {
1201
1189
RETURN_THROWS ();
@@ -1213,31 +1201,21 @@ PHP_METHOD(RecursiveTreeIterator, key)
1213
1201
RETURN_COPY_VALUE (& key );
1214
1202
}
1215
1203
1216
- if (Z_TYPE (key ) != IS_STRING ) {
1217
- if (zend_make_printable_zval (& key , & key_copy )) {
1218
- key = key_copy ;
1219
- }
1220
- }
1221
-
1222
- spl_recursive_tree_iterator_get_prefix (object , & prefix );
1223
- spl_recursive_tree_iterator_get_postfix (object , & postfix );
1224
-
1225
- str = zend_string_alloc (Z_STRLEN (prefix ) + Z_STRLEN (key ) + Z_STRLEN (postfix ), 0 );
1226
- ptr = ZSTR_VAL (str );
1204
+ zend_string * key_str = zval_get_string (& key );
1205
+ zend_string * prefix = spl_recursive_tree_iterator_get_prefix (object );
1206
+ zend_string * postfix = spl_recursive_tree_iterator_get_postfix (object );
1227
1207
1228
- memcpy (ptr , Z_STRVAL (prefix ), Z_STRLEN (prefix ));
1229
- ptr += Z_STRLEN (prefix );
1230
- memcpy (ptr , Z_STRVAL (key ), Z_STRLEN (key ));
1231
- ptr += Z_STRLEN (key );
1232
- memcpy (ptr , Z_STRVAL (postfix ), Z_STRLEN (postfix ));
1233
- ptr += Z_STRLEN (postfix );
1234
- * ptr = 0 ;
1208
+ zend_string * result = zend_string_concat3 (
1209
+ ZSTR_VAL (prefix ), ZSTR_LEN (prefix ),
1210
+ ZSTR_VAL (key_str ), ZSTR_LEN (key_str ),
1211
+ ZSTR_VAL (postfix ), ZSTR_LEN (postfix ));
1235
1212
1236
- zval_ptr_dtor (& prefix );
1213
+ zend_string_release (key_str );
1214
+ zend_string_release (prefix );
1215
+ zend_string_release (postfix );
1237
1216
zval_ptr_dtor (& key );
1238
- zval_ptr_dtor (& postfix );
1239
1217
1240
- RETURN_NEW_STR (str );
1218
+ RETURN_NEW_STR (result );
1241
1219
} /* }}} */
1242
1220
1243
1221
static zend_function * spl_dual_it_get_method (zend_object * * object , zend_string * method , const zval * key )
0 commit comments