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;
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;
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(
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()
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();
}
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) {
}
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) {
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);};
}
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) {
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;
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;
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;
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;
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;
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;
"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;