Add iterator closing for ecma_op_container_create (#3457)
JerryScript-DCO-1.0-Signed-off-by: Adam Szilagyi aszilagy@inf.u-szeged.hu
This commit is contained in:
committed by
Robert Fancsik
parent
d0b4e7dd04
commit
e2893f26a1
@@ -162,9 +162,10 @@ ecma_op_container_create (const ecma_value_t *arguments_list_p, /**< arguments l
|
|||||||
{
|
{
|
||||||
if (!ecma_is_value_object (result))
|
if (!ecma_is_value_object (result))
|
||||||
{
|
{
|
||||||
// TODO close the iterator when generator function will be supported
|
|
||||||
ecma_free_value (result);
|
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;
|
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))
|
if (ECMA_IS_VALUE_ERROR (result))
|
||||||
{
|
{
|
||||||
// TODO close the iterator when generator function will be supported
|
|
||||||
ecma_deref_object (next_object_p);
|
ecma_deref_object (next_object_p);
|
||||||
|
ecma_op_iterator_close (iter);
|
||||||
goto cleanup_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))
|
if (ECMA_IS_VALUE_ERROR (result))
|
||||||
{
|
{
|
||||||
// TODO close the iterator when generator function will be supported
|
|
||||||
ecma_deref_object (next_object_p);
|
ecma_deref_object (next_object_p);
|
||||||
ecma_free_value (key);
|
ecma_free_value (key);
|
||||||
|
ecma_op_iterator_close (iter);
|
||||||
goto cleanup_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))
|
if (ECMA_IS_VALUE_ERROR (result))
|
||||||
{
|
{
|
||||||
// TODO close the iterator when generator function will be supported
|
ecma_op_iterator_close (iter);
|
||||||
goto cleanup_iter;
|
goto cleanup_iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,3 +123,27 @@ m = new Map([{0: "foo", 1: 3}, {0 : "bar", 1 : 2}]);
|
|||||||
assert (m.size === 2);
|
assert (m.size === 2);
|
||||||
assert (m.get("foo") === 3);
|
assert (m.get("foo") === 3);
|
||||||
assert (m.get("bar") === 2);
|
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);
|
||||||
|
|||||||
@@ -91,3 +91,30 @@ assert(set.size === 0);
|
|||||||
set.add(3);
|
set.add(3);
|
||||||
assert(set.delete(3));
|
assert(set.delete(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);
|
||||||
|
|||||||
@@ -135,6 +135,30 @@ try {
|
|||||||
assert (e instanceof TypeError);
|
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([], []);
|
m1.set([], []);
|
||||||
|
|
||||||
assert (WeakMap.prototype.toString() === "[object WeakMap]");
|
assert (WeakMap.prototype.toString() === "[object WeakMap]");
|
||||||
|
|||||||
@@ -119,6 +119,30 @@ try {
|
|||||||
assert (e instanceof TypeError);
|
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([]);
|
m1.add([]);
|
||||||
|
|
||||||
assert (WeakSet.prototype.toString() === "[object WeakSet]");
|
assert (WeakSet.prototype.toString() === "[object WeakSet]");
|
||||||
|
|||||||
Reference in New Issue
Block a user