diff --git a/Foundation/include/Poco/Dynamic/Var.h b/Foundation/include/Poco/Dynamic/Var.h index 71ffb4eee2..20450b59c5 100644 --- a/Foundation/include/Poco/Dynamic/Var.h +++ b/Foundation/include/Poco/Dynamic/Var.h @@ -737,7 +737,7 @@ inline const std::type_info& Var::type() const inline Var::ConstIterator Var::begin() const { - if (isEmpty()) return ConstIterator(const_cast(this), true); + if (size() == 0) return ConstIterator(const_cast(this), true); return ConstIterator(const_cast(this), false); } @@ -749,7 +749,7 @@ inline Var::ConstIterator Var::end() const inline Var::Iterator Var::begin() { - if (isEmpty()) return Iterator(const_cast(this), true); + if (size() == 0) return Iterator(const_cast(this), true); return Iterator(const_cast(this), false); } diff --git a/Foundation/src/VarIterator.cpp b/Foundation/src/VarIterator.cpp index d26a99854f..97ab61b2ea 100644 --- a/Foundation/src/VarIterator.cpp +++ b/Foundation/src/VarIterator.cpp @@ -31,6 +31,7 @@ VarIterator::VarIterator(Var* pVar, bool positionEnd): _pVar(pVar), _position(positionEnd ? POSITION_END : 0) { + if (!_pVar || _pVar->isEmpty()) throw InvalidAccessException("Cannot create iterator on empty Var"); } diff --git a/Foundation/testsuite/src/VarTest.cpp b/Foundation/testsuite/src/VarTest.cpp index 3fe0db8cf8..c0776becff 100644 --- a/Foundation/testsuite/src/VarTest.cpp +++ b/Foundation/testsuite/src/VarTest.cpp @@ -2973,8 +2973,15 @@ void VarTest::testEmpty() void VarTest::testIterator() { Var da; - assertTrue (da.isEmpty()); - assertTrue (da.begin() == da.end()); + try + { + auto it = da.begin(); + fail("calling begin() on empty Var must throw"); + } + catch (const InvalidAccessException&) { } + + da = Poco::Dynamic::Array(); + assertTrue(da.begin() == da.end()); da = 1; assertTrue (!da.isEmpty()); diff --git a/Foundation/testsuite/src/VarTest.h b/Foundation/testsuite/src/VarTest.h index 5be921bd54..4189da6aa3 100644 --- a/Foundation/testsuite/src/VarTest.h +++ b/Foundation/testsuite/src/VarTest.h @@ -184,14 +184,29 @@ class VarTest: public CppUnit::TestCase void testContainerIterator() { C cont; + Poco::Dynamic::Var arr(cont); + int counter = 0; + + // test empty + assertTrue (arr.size() == 0); + Poco::Dynamic::Var::Iterator it = arr.begin(); + Poco::Dynamic::Var::Iterator end = arr.end(); + + for (; it != end; ++it) + { + *it = ++counter; + } + assertTrue(counter == 0); + + // test non-empty cont.push_back(1); cont.push_back("2"); cont.push_back(3.5); - Poco::Dynamic::Var arr(cont); + arr = cont; assertTrue (arr.size() == 3); - Poco::Dynamic::Var::Iterator it = arr.begin(); - Poco::Dynamic::Var::Iterator end = arr.end(); - int counter = 0; + it = arr.begin(); + end = arr.end(); + counter = 0; for (; it != end; ++it) { switch (++counter)