@@ -126,7 +126,7 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
126
126
/* {{{ zend_user_it_new_iterator */
127
127
ZEND_API void zend_user_it_new_iterator (zend_class_entry * ce , zval * object , zval * retval )
128
128
{
129
- zend_call_method_with_0_params (object , ce , & ce -> iterator_funcs . zf_new_iterator , "getiterator" , retval );
129
+ zend_call_method_with_0_params (object , ce , & ce -> iterator_funcs_ptr -> zf_new_iterator , "getiterator" , retval );
130
130
}
131
131
/* }}} */
132
132
@@ -162,7 +162,7 @@ ZEND_API int zend_user_it_valid(zend_object_iterator *_iter)
162
162
zval more ;
163
163
int result ;
164
164
165
- zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs . zf_valid , "valid" , & more );
165
+ zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_valid , "valid" , & more );
166
166
if (Z_TYPE (more ) != IS_UNDEF ) {
167
167
result = i_zend_is_true (& more );
168
168
zval_ptr_dtor (& more );
@@ -180,7 +180,7 @@ ZEND_API zval *zend_user_it_get_current_data(zend_object_iterator *_iter)
180
180
zval * object = & iter -> it .data ;
181
181
182
182
if (Z_ISUNDEF (iter -> value )) {
183
- zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs . zf_current , "current" , & iter -> value );
183
+ zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_current , "current" , & iter -> value );
184
184
}
185
185
return & iter -> value ;
186
186
}
@@ -193,7 +193,7 @@ ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *ke
193
193
zval * object = & iter -> it .data ;
194
194
zval retval ;
195
195
196
- zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs . zf_key , "key" , & retval );
196
+ zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_key , "key" , & retval );
197
197
198
198
if (Z_TYPE (retval ) != IS_UNDEF ) {
199
199
ZVAL_ZVAL (key , & retval , 1 , 1 );
@@ -214,7 +214,7 @@ ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter)
214
214
zval * object = & iter -> it .data ;
215
215
216
216
zend_user_it_invalidate_current (_iter );
217
- zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs . zf_next , "next" , NULL );
217
+ zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_next , "next" , NULL );
218
218
}
219
219
/* }}} */
220
220
@@ -225,7 +225,7 @@ ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter)
225
225
zval * object = & iter -> it .data ;
226
226
227
227
zend_user_it_invalidate_current (_iter );
228
- zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs . zf_rewind , "rewind" , NULL );
228
+ zend_call_method_with_0_params (object , iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_rewind , "rewind" , NULL );
229
229
}
230
230
/* }}} */
231
231
@@ -254,7 +254,7 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva
254
254
zend_iterator_init ((zend_object_iterator * )iterator );
255
255
256
256
ZVAL_COPY (& iterator -> it .data , object );
257
- iterator -> it .funcs = ce -> iterator_funcs . funcs ;
257
+ iterator -> it .funcs = & zend_interface_iterator_funcs_iterator ;
258
258
iterator -> ce = Z_OBJCE_P (object );
259
259
ZVAL_UNDEF (& iterator -> value );
260
260
return (zend_object_iterator * )iterator ;
@@ -339,8 +339,18 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr
339
339
}
340
340
}
341
341
}
342
- class_type -> iterator_funcs .zf_new_iterator = NULL ;
343
342
class_type -> get_iterator = zend_user_it_get_new_iterator ;
343
+ if (class_type -> iterator_funcs_ptr != NULL ) {
344
+ class_type -> iterator_funcs_ptr -> zf_new_iterator = NULL ;
345
+ } else if (class_type -> type == ZEND_INTERNAL_CLASS ) {
346
+ class_type -> iterator_funcs_ptr = calloc (1 , sizeof (zend_class_iterator_funcs ));
347
+ } else {
348
+ class_type -> iterator_funcs_ptr = zend_arena_alloc (& CG (arena ), sizeof (zend_class_iterator_funcs ));
349
+ memset (class_type -> iterator_funcs_ptr , 0 , sizeof (zend_class_iterator_funcs ));
350
+ }
351
+ if (class_type -> type == ZEND_INTERNAL_CLASS ) {
352
+ class_type -> iterator_funcs_ptr -> zf_new_iterator = zend_hash_str_find_ptr (& class_type -> function_table , "getiterator" , sizeof ("getiterator" ) - 1 );
353
+ }
344
354
return SUCCESS ;
345
355
}
346
356
/* }}} */
@@ -364,13 +374,24 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry
364
374
}
365
375
}
366
376
class_type -> get_iterator = zend_user_it_get_iterator ;
367
- class_type -> iterator_funcs .zf_valid = NULL ;
368
- class_type -> iterator_funcs .zf_current = NULL ;
369
- class_type -> iterator_funcs .zf_key = NULL ;
370
- class_type -> iterator_funcs .zf_next = NULL ;
371
- class_type -> iterator_funcs .zf_rewind = NULL ;
372
- if (!class_type -> iterator_funcs .funcs ) {
373
- class_type -> iterator_funcs .funcs = & zend_interface_iterator_funcs_iterator ;
377
+ if (class_type -> iterator_funcs_ptr != NULL ) {
378
+ class_type -> iterator_funcs_ptr -> zf_valid = NULL ;
379
+ class_type -> iterator_funcs_ptr -> zf_current = NULL ;
380
+ class_type -> iterator_funcs_ptr -> zf_key = NULL ;
381
+ class_type -> iterator_funcs_ptr -> zf_next = NULL ;
382
+ class_type -> iterator_funcs_ptr -> zf_rewind = NULL ;
383
+ } else if (class_type -> type == ZEND_INTERNAL_CLASS ) {
384
+ class_type -> iterator_funcs_ptr = calloc (1 , sizeof (zend_class_iterator_funcs ));
385
+ } else {
386
+ class_type -> iterator_funcs_ptr = zend_arena_alloc (& CG (arena ), sizeof (zend_class_iterator_funcs ));
387
+ memset (class_type -> iterator_funcs_ptr , 0 , sizeof (zend_class_iterator_funcs ));
388
+ }
389
+ if (class_type -> type == ZEND_INTERNAL_CLASS ) {
390
+ class_type -> iterator_funcs_ptr -> zf_rewind = zend_hash_str_find_ptr (& class_type -> function_table , "rewind" , sizeof ("rewind" ) - 1 );
391
+ class_type -> iterator_funcs_ptr -> zf_valid = zend_hash_str_find_ptr (& class_type -> function_table , "valid" , sizeof ("valid" ) - 1 );
392
+ class_type -> iterator_funcs_ptr -> zf_key = zend_hash_str_find_ptr (& class_type -> function_table , "key" , sizeof ("key" ) - 1 );
393
+ class_type -> iterator_funcs_ptr -> zf_current = zend_hash_str_find_ptr (& class_type -> function_table , "current" , sizeof ("current" ) - 1 );
394
+ class_type -> iterator_funcs_ptr -> zf_next = zend_hash_str_find_ptr (& class_type -> function_table , "next" , sizeof ("next" ) - 1 );
374
395
}
375
396
return SUCCESS ;
376
397
}
0 commit comments