diff --git a/jerry-core/ecma/operations/ecma-container-object.c b/jerry-core/ecma/operations/ecma-container-object.c index 0607860ac..d9b5b3969 100644 --- a/jerry-core/ecma/operations/ecma-container-object.c +++ b/jerry-core/ecma/operations/ecma-container-object.c @@ -162,9 +162,10 @@ ecma_op_container_create (const ecma_value_t *arguments_list_p, /**< arguments l { if (!ecma_is_value_object (result)) { - // TODO close the iterator when generator function will be supported ecma_free_value (result); - result = ecma_raise_type_error (ECMA_ERR_MSG ("Iterator value is not an object.")); + ecma_raise_type_error (ECMA_ERR_MSG ("Iterator value is not an object.")); + result = ecma_op_iterator_close (iter); + JERRY_ASSERT (ECMA_IS_VALUE_ERROR (result)); goto cleanup_iter; } @@ -174,8 +175,8 @@ ecma_op_container_create (const ecma_value_t *arguments_list_p, /**< arguments l if (ECMA_IS_VALUE_ERROR (result)) { - // TODO close the iterator when generator function will be supported ecma_deref_object (next_object_p); + ecma_op_iterator_close (iter); goto cleanup_iter; } @@ -185,9 +186,9 @@ ecma_op_container_create (const ecma_value_t *arguments_list_p, /**< arguments l if (ECMA_IS_VALUE_ERROR (result)) { - // TODO close the iterator when generator function will be supported ecma_deref_object (next_object_p); ecma_free_value (key); + ecma_op_iterator_close (iter); goto cleanup_iter; } @@ -203,7 +204,7 @@ ecma_op_container_create (const ecma_value_t *arguments_list_p, /**< arguments l if (ECMA_IS_VALUE_ERROR (result)) { - // TODO close the iterator when generator function will be supported + ecma_op_iterator_close (iter); goto cleanup_iter; } diff --git a/tests/jerry/es2015/map.js b/tests/jerry/es2015/map.js index 55b711e45..5dcbdc74d 100644 --- a/tests/jerry/es2015/map.js +++ b/tests/jerry/es2015/map.js @@ -123,3 +123,27 @@ m = new Map([{0: "foo", 1: 3}, {0 : "bar", 1 : 2}]); assert (m.size === 2); assert (m.get("foo") === 3); assert (m.get("bar") === 2); + +function createIterable(arr, methods = {}) { + let iterable = function *() { + let idx = 0; + while (idx < arr.length) { + yield arr[idx]; + idx++; + } + }(); + iterable['return'] = methods['return']; + iterable['throw'] = methods['throw']; + + return iterable; +}; + +var closed = false; +var iter = createIterable([1, 2, 3], { + 'return': function(){ closed = true; return {}; } +}); +try { + new Map(iter); +} catch(e){} + +assert(closed === true); diff --git a/tests/jerry/es2015/set.js b/tests/jerry/es2015/set.js index 42477f997..fe443bbb9 100644 --- a/tests/jerry/es2015/set.js +++ b/tests/jerry/es2015/set.js @@ -91,3 +91,30 @@ assert(set.size === 0); set.add(3); assert(set.delete(3)); assert(!set.delete(3)); + +function createIterable(arr, methods = {}) { + let iterable = function *() { + let idx = 0; + while (idx < arr.length) { + yield arr[idx]; + idx++; + } + }(); + iterable['return'] = methods['return']; + iterable['throw'] = methods['throw']; + + return iterable; +}; + +var closed = false; +var iter = createIterable([1, 2, 3], { + 'return': function(){ closed = true; return {}; } +}); +var add = Set.prototype.add; +Set.prototype.add = function(){ throw 0 }; +try { + new Set(iter); +} catch(e){} +Set.prototype.add = add; + +assert(closed === true); diff --git a/tests/jerry/es2015/weakmap.js b/tests/jerry/es2015/weakmap.js index 3539722b1..2eb702c95 100644 --- a/tests/jerry/es2015/weakmap.js +++ b/tests/jerry/es2015/weakmap.js @@ -135,6 +135,30 @@ try { assert (e instanceof TypeError); } +function createIterable(arr, methods = {}) { + let iterable = function *() { + let idx = 0; + while (idx < arr.length) { + yield arr[idx]; + idx++; + } + }(); + iterable['return'] = methods['return']; + iterable['throw'] = methods['throw']; + + return iterable; +}; + +var closed = false; +var iter = createIterable([1, 2, 3], { + 'return': function(){ closed = true; return {}; } +}); +try { + new WeakMap(iter); +} catch(e){} + +assert(closed === true); + m1.set([], []); assert (WeakMap.prototype.toString() === "[object WeakMap]"); diff --git a/tests/jerry/es2015/weakset.js b/tests/jerry/es2015/weakset.js index 040b53307..d026d1ad0 100644 --- a/tests/jerry/es2015/weakset.js +++ b/tests/jerry/es2015/weakset.js @@ -119,6 +119,30 @@ try { assert (e instanceof TypeError); } +function createIterable(arr, methods = {}) { + let iterable = function *() { + let idx = 0; + while (idx < arr.length) { + yield arr[idx]; + idx++; + } + }(); + iterable['return'] = methods['return']; + iterable['throw'] = methods['throw']; + + return iterable; +}; + +var closed = false; +var iter = createIterable([1, 2, 3], { + 'return': function(){ closed = true; return {}; } +}); +try { + new WeakMap(iter); +} catch(e){} + +assert(closed === true); + m1.add([]); assert (WeakSet.prototype.toString() === "[object WeakSet]");