diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2014-02-26 15:01:08 +0400 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2014-02-26 15:01:08 +0400 |
| commit | 495551aa8c3d66ee16ab91c1fb97329f10c0632c (patch) | |
| tree | 19f39597305afd611b7a6788964f7f14ff120208 /Zend | |
| parent | a4a86df3c0c47362a6932585a447f87dc9823451 (diff) | |
| download | php-git-495551aa8c3d66ee16ab91c1fb97329f10c0632c.tar.gz | |
Fixed iterators API. zend_iterator_init() has to be used in each get_iterator() callback.
Diffstat (limited to 'Zend')
| -rw-r--r-- | Zend/zend_generators.c | 14 | ||||
| -rw-r--r-- | Zend/zend_interfaces.c | 2 | ||||
| -rw-r--r-- | Zend/zend_iterators.c | 7 | ||||
| -rw-r--r-- | Zend/zend_iterators.h | 2 | ||||
| -rw-r--r-- | Zend/zend_vm_def.h | 5 | ||||
| -rw-r--r-- | Zend/zend_vm_execute.h | 20 |
6 files changed, 27 insertions, 23 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index f1affbc01e..78cb346eb7 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -675,19 +675,7 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob iterator = &generator->iterator; -//??? -#if 1 - iterator->intern.std.gc.refcount = 1; - iterator->intern.std.gc.u.v.type = IS_OBJECT; - iterator->intern.std.gc.u.v.flags = 0; - iterator->intern.std.gc.u.v.buffer = 0; - iterator->intern.std.ce = NULL; - iterator->intern.std.properties = NULL; - iterator->intern.std.guards = NULL; - zend_objects_store_put(&iterator->intern.std); -#else - zend_object_std_init(&iterator->intern.std, ???); -#endif + zend_iterator_init(&iterator->intern TSRMLS_CC); iterator->intern.funcs = &zend_generator_iterator_functions; iterator->intern.data = (void *) generator; diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 87b3f723c0..2beeb1d439 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -259,6 +259,8 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva iterator = emalloc(sizeof(zend_user_iterator)); + zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); + Z_ADDREF_P(object); iterator->it.data = (void*)object; iterator->it.funcs = ce->iterator_funcs.funcs; diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c index 7610aadfc8..5514c8bba8 100644 --- a/Zend/zend_iterators.c +++ b/Zend/zend_iterators.c @@ -65,11 +65,10 @@ static void iter_wrapper_dtor(zend_object *object TSRMLS_DC) iter->funcs->dtor(iter TSRMLS_CC); } -ZEND_API void zend_iterator_wrap(zend_object_iterator *iter, zval *wrapped TSRMLS_DC) +ZEND_API void zend_iterator_init(zend_object_iterator *iter TSRMLS_DC) { - ZVAL_OBJ(wrapped, &iter->std); - //??? hack (it would be better implement it in anothe way) - Z_OBJ_HT_P(wrapped) = &iterator_object_handlers; + zend_object_std_init(&iter->std, &zend_iterator_class_entry); + iter->std.handlers = &iterator_object_handlers; } ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap( diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h index 0ab5bef82a..d6cba7c892 100644 --- a/Zend/zend_iterators.h +++ b/Zend/zend_iterators.h @@ -83,7 +83,7 @@ BEGIN_EXTERN_C() ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap(zval *array_ptr, zend_object_iterator **iter TSRMLS_DC); /* given an iterator, wrap it up as a zval for use by the engine opcodes */ -ZEND_API void zend_iterator_wrap(zend_object_iterator *iter, zval *zv TSRMLS_DC); +ZEND_API void zend_iterator_init(zend_object_iterator *iter TSRMLS_DC); ZEND_API void zend_register_iterator_wrapper(TSRMLS_D); END_EXTERN_C() diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a469bc539b..3e377470a4 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4253,7 +4253,10 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY) FREE_OP1_IF_VAR(); } if (iter && EXPECTED(EG(exception) == NULL)) { - zend_iterator_wrap(iter, array_ptr TSRMLS_CC); + zval iterator; + + array_ptr = &iterator; + ZVAL_OBJ(array_ptr, &iter->std); } else { if (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3b322b86c5..51ec30e733 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3044,7 +3044,10 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A } if (iter && EXPECTED(EG(exception) == NULL)) { - zend_iterator_wrap(iter, array_ptr TSRMLS_CC); + zval iterator; + + array_ptr = &iterator; + ZVAL_OBJ(array_ptr, &iter->std); } else { if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { @@ -8095,7 +8098,10 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG } if (iter && EXPECTED(EG(exception) == NULL)) { - zend_iterator_wrap(iter, array_ptr TSRMLS_CC); + zval iterator; + + array_ptr = &iterator; + ZVAL_OBJ(array_ptr, &iter->std); } else { if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { @@ -13198,7 +13204,10 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG zval_ptr_dtor_nogc(free_op1.var); } if (iter && EXPECTED(EG(exception) == NULL)) { - zend_iterator_wrap(iter, array_ptr TSRMLS_CC); + zval iterator; + + array_ptr = &iterator; + ZVAL_OBJ(array_ptr, &iter->std); } else { if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}; @@ -30089,7 +30098,10 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS } if (iter && EXPECTED(EG(exception) == NULL)) { - zend_iterator_wrap(iter, array_ptr TSRMLS_CC); + zval iterator; + + array_ptr = &iterator; + ZVAL_OBJ(array_ptr, &iter->std); } else { if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { |
