@@ -124,10 +124,9 @@ ZEND_API int zend_user_it_valid(zend_object_iterator *_iter)
124
124
zend_user_iterator * iter = (zend_user_iterator * )_iter ;
125
125
zval * object = & iter -> it .data ;
126
126
zval more ;
127
- bool result ;
128
127
129
- zend_call_method_with_0_params ( Z_OBJ_P ( object ), iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_valid , "valid" , & more );
130
- result = i_zend_is_true (& more );
128
+ zend_call_known_instance_method_with_0_params ( iter -> ce -> iterator_funcs_ptr -> zf_valid , Z_OBJ_P ( object ) , & more );
129
+ bool result = i_zend_is_true (& more );
131
130
zval_ptr_dtor (& more );
132
131
return result ? SUCCESS : FAILURE ;
133
132
}
@@ -142,7 +141,7 @@ ZEND_API zval *zend_user_it_get_current_data(zend_object_iterator *_iter)
142
141
zval * object = & iter -> it .data ;
143
142
144
143
if (Z_ISUNDEF (iter -> value )) {
145
- zend_call_method_with_0_params ( Z_OBJ_P ( object ), iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_current , "current" , & iter -> value );
144
+ zend_call_known_instance_method_with_0_params ( iter -> ce -> iterator_funcs_ptr -> zf_current , Z_OBJ_P ( object ) , & iter -> value );
146
145
}
147
146
return & iter -> value ;
148
147
}
@@ -153,7 +152,7 @@ ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *ke
153
152
{
154
153
zend_user_iterator * iter = (zend_user_iterator * )_iter ;
155
154
zval * object = & iter -> it .data ;
156
- zend_call_method_with_0_params ( Z_OBJ_P ( object ), iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_key , "key" , key );
155
+ zend_call_known_instance_method_with_0_params ( iter -> ce -> iterator_funcs_ptr -> zf_key , Z_OBJ_P ( object ) , key );
157
156
if (UNEXPECTED (Z_ISREF_P (key ))) {
158
157
zend_unwrap_reference (key );
159
158
}
@@ -167,7 +166,7 @@ ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter)
167
166
zval * object = & iter -> it .data ;
168
167
169
168
zend_user_it_invalidate_current (_iter );
170
- zend_call_method_with_0_params ( Z_OBJ_P ( object ), iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_next , "next" , NULL );
169
+ zend_call_known_instance_method_with_0_params ( iter -> ce -> iterator_funcs_ptr -> zf_next , Z_OBJ_P ( object ) , NULL );
171
170
}
172
171
/* }}} */
173
172
@@ -178,7 +177,7 @@ ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter)
178
177
zval * object = & iter -> it .data ;
179
178
180
179
zend_user_it_invalidate_current (_iter );
181
- zend_call_method_with_0_params ( Z_OBJ_P ( object ), iter -> ce , & iter -> ce -> iterator_funcs_ptr -> zf_rewind , "rewind" , NULL );
180
+ zend_call_known_instance_method_with_0_params ( iter -> ce -> iterator_funcs_ptr -> zf_rewind , Z_OBJ_P ( object ) , NULL );
182
181
}
183
182
/* }}} */
184
183
@@ -317,6 +316,16 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry
317
316
ZSTR_VAL (class_type -> name ));
318
317
}
319
318
319
+ zend_function * zf_rewind = zend_hash_str_find_ptr (
320
+ & class_type -> function_table , "rewind" , sizeof ("rewind" ) - 1 );
321
+ zend_function * zf_valid = zend_hash_str_find_ptr (
322
+ & class_type -> function_table , "valid" , sizeof ("valid" ) - 1 );
323
+ zend_function * zf_key = zend_hash_str_find_ptr (
324
+ & class_type -> function_table , "key" , sizeof ("key" ) - 1 );
325
+ zend_function * zf_current = zend_hash_str_find_ptr (
326
+ & class_type -> function_table , "current" , sizeof ("current" ) - 1 );
327
+ zend_function * zf_next = zend_hash_str_find_ptr (
328
+ & class_type -> function_table , "next" , sizeof ("next" ) - 1 );
320
329
if (class_type -> get_iterator && class_type -> get_iterator != zend_user_it_get_iterator ) {
321
330
if (!class_type -> parent || class_type -> parent -> get_iterator != class_type -> get_iterator ) {
322
331
/* get_iterator was explicitly assigned for an internal class. */
@@ -337,9 +346,15 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry
337
346
zend_class_iterator_funcs * funcs_ptr = class_type -> type == ZEND_INTERNAL_CLASS
338
347
? pemalloc (sizeof (zend_class_iterator_funcs ), 1 )
339
348
: zend_arena_alloc (& CG (arena ), sizeof (zend_class_iterator_funcs ));
340
- memset (funcs_ptr , 0 , sizeof (zend_class_iterator_funcs ));
341
349
class_type -> iterator_funcs_ptr = funcs_ptr ;
342
350
351
+ memset (funcs_ptr , 0 , sizeof (zend_class_iterator_funcs ));
352
+ funcs_ptr -> zf_rewind = zf_rewind ;
353
+ funcs_ptr -> zf_valid = zf_valid ;
354
+ funcs_ptr -> zf_key = zf_key ;
355
+ funcs_ptr -> zf_current = zf_current ;
356
+ funcs_ptr -> zf_next = zf_next ;
357
+
343
358
return SUCCESS ;
344
359
}
345
360
/* }}} */
0 commit comments