]> granicus.if.org Git - php/commitdiff
Fixed iterators API. zend_iterator_init() has to be used in each get_iterator() callback.
authorDmitry Stogov <dmitry@zend.com>
Wed, 26 Feb 2014 11:01:08 +0000 (15:01 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 26 Feb 2014 11:01:08 +0000 (15:01 +0400)
12 files changed:
Zend/zend_generators.c
Zend/zend_interfaces.c
Zend/zend_iterators.c
Zend/zend_iterators.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/date/php_date.c
ext/spl/spl_array.c
ext/spl/spl_dllist.c
ext/spl/spl_fixedarray.c
ext/spl/spl_heap.c
ext/spl/spl_iterators.c

index f1affbc01eb4b70a717f3571de063e5dc80b0f32..78cb346eb741761e818b6d3d714d31a06c6d1646 100644 (file)
@@ -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;
index 87b3f723c0b1daaaca67c82f2c2c7825d0c2d022..2beeb1d439150744df7d841de8fa87a9c950e1d8 100644 (file)
@@ -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;
index 7610aadfc8f4cf75e73a3cb8ff2db363104ac080..5514c8bba8e1a47c637e060852c2225c9724bd2c 100644 (file)
@@ -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(
index 0ab5bef82a8d230cb050668af86219bc74fbf337..d6cba7c892102a65abebe60090fae94b4671366e 100644 (file)
@@ -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()
index a469bc539b250eca85d5ced7d76afeee37d3dc49..3e377470a4089f87e9cbd7817a731d40b558ee95 100644 (file)
@@ -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();
index 3b322b86c50965292ae2b61a28867ab1612bff0d..51ec30e733f45b87a15041f4af5faabbc56b275a 100644 (file)
@@ -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) {
 
index 05dccf4f8e86eef10f71e7343fe4f170410d03ef..1489ac8184194d3c8906b6d669933151e969b5a7 100644 (file)
@@ -1976,6 +1976,8 @@ zend_object_iterator *date_object_period_get_iterator(zend_class_entry *ce, zval
                zend_error(E_ERROR, "An iterator cannot be used with foreach by reference");
        }
 
+       zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+
        Z_ADDREF_P(object);
        iterator->intern.data = (void*) dpobj;
        iterator->intern.funcs = &date_period_it_funcs;
index e272a145e52a93cc762e5a1c1837a6a8549d1578..e552ca8fb4bf7a11e0d5e53eafec862f30b88d50 100644 (file)
@@ -1148,6 +1148,8 @@ zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object,
 
        iterator     = emalloc(sizeof(spl_array_it));
 
+       zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+
        Z_ADDREF_P(object);
        iterator->intern.it.data = (void*)object;
        iterator->intern.it.funcs = &spl_array_it_funcs;
index fbe249456e01b6bc1516107a81f784fdc1462c52..99863626bcedea2145e57963d8231e3effa0db56 100644 (file)
@@ -1291,6 +1291,9 @@ zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object
        Z_ADDREF_P(object);
 
        iterator                     = emalloc(sizeof(spl_dllist_it));
+
+       zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+       
        iterator->intern.it.data     = (void*)object;
        iterator->intern.it.funcs    = &spl_dllist_it_funcs;
        iterator->intern.ce          = ce;
index 075df9b2b7c493a37576ee045da89dae3ab38999..9e5e8b590c07c618b59a9b7c1674e2a349f5e470 100644 (file)
@@ -1052,6 +1052,9 @@ zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *ob
        Z_ADDREF_P(object);
 
        iterator = emalloc(sizeof(spl_fixedarray_it));
+
+       zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+       
        iterator->intern.it.data = object;
        iterator->intern.it.funcs = &spl_fixedarray_it_funcs;
        iterator->intern.ce = ce;
index 91590007994bb323898ad815e80601ea33098327..2afee6cd49127e86f7157d33ebd59632fab11d7c 100644 (file)
@@ -1091,6 +1091,9 @@ zend_object_iterator *spl_heap_get_iterator(zend_class_entry *ce, zval *object,
        Z_ADDREF_P(object);
 
        iterator                  = emalloc(sizeof(spl_heap_it));
+       
+       zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+
        iterator->intern.it.data  = (void*)object;
        iterator->intern.it.funcs = &spl_heap_it_funcs;
        iterator->intern.ce       = ce;
@@ -1115,6 +1118,9 @@ zend_object_iterator *spl_pqueue_get_iterator(zend_class_entry *ce, zval *object
        Z_ADDREF_P(object);
 
        iterator                  = emalloc(sizeof(spl_heap_it));
+
+       zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+
        iterator->intern.it.data  = (void*)object;
        iterator->intern.it.funcs = &spl_pqueue_it_funcs;
        iterator->intern.ce       = ce;
index 81d1ecc4bc984452d92e5bd41ed437991c831c22..2891f3ce9b2d72401461435b08c2bca4e766c53c 100644 (file)
@@ -423,6 +423,8 @@ static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry *ce,
                                "the parent constructor has not been called");
        }
 
+       zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+       
        Z_ADDREF_P(zobject);
        iterator->intern.data = (void*)object;
        iterator->intern.funcs = ce->iterator_funcs.funcs;