]> granicus.if.org Git - php/commitdiff
- Fix problem when inner constructor isn't called from derived constructor
authorMarcus Boerger <helly@php.net>
Wed, 28 Jul 2004 22:53:10 +0000 (22:53 +0000)
committerMarcus Boerger <helly@php.net>
Wed, 28 Jul 2004 22:53:10 +0000 (22:53 +0000)
  (foound by david)

ext/spl/spl_iterators.c

index f0a768c2c00df6084f101b430435c36356047786..3d09a7c463c12d872e4669e3834ba6bacb7177de 100755 (executable)
@@ -634,8 +634,16 @@ SPL_METHOD(dual_it, getInnerIterator)
        }
 } /* }}} */
 
+static INLINE void spl_dual_it_require(spl_dual_it_object *intern TSRMLS_DC)
+{
+       if (!intern->inner.iterator) {
+               php_error_docref(NULL TSRMLS_CC, E_ERROR, "The inner constructor wasn't initialized with an iterator instance");
+       }
+}
+
 static INLINE void spl_dual_it_free(spl_dual_it_object *intern TSRMLS_DC)
 {
+       spl_dual_it_require(intern TSRMLS_CC);
        if (intern->inner.iterator && intern->inner.iterator->funcs->invalidate_current) {
                intern->inner.iterator->funcs->invalidate_current(intern->inner.iterator TSRMLS_CC);
        }
@@ -698,6 +706,8 @@ static INLINE void spl_dual_it_next(spl_dual_it_object *intern, int do_free TSRM
 {
        if (do_free) {
                spl_dual_it_free(intern TSRMLS_CC);
+       } else {
+               spl_dual_it_require(intern TSRMLS_CC);
        }
        intern->inner.iterator->funcs->move_forward(intern->inner.iterator TSRMLS_CC);
        intern->current.pos++;