mirror of https://github.com/tc39/test262.git
Add tests for usage of IsArray (#667)
This commit is contained in:
parent
01fe0d331b
commit
ee7496f713
|
@ -0,0 +1,28 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-array.isarray
|
||||
es6id: 22.1.2.2
|
||||
description: Revoked proxy value produces a TypeError
|
||||
info: |
|
||||
1. Return IsArray(arg).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var handle = Proxy.revocable([], {});
|
||||
|
||||
handle.revoke();
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
Array.isArray(handle.proxy);
|
||||
});
|
|
@ -0,0 +1,30 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-array.isarray
|
||||
es6id: 22.1.2.2
|
||||
description: Proxy of an array is treated as an array
|
||||
info: |
|
||||
1. Return IsArray(arg).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var objectProxy = new Proxy({}, {});
|
||||
var arrayProxy = new Proxy([], {});
|
||||
var arrayProxyProxy = new Proxy(arrayProxy, {});
|
||||
|
||||
assert.sameValue(Array.isArray(objectProxy), false);
|
||||
assert.sameValue(Array.isArray(arrayProxy), true, 'proxy for array');
|
||||
assert.sameValue(
|
||||
Array.isArray(arrayProxyProxy), true, 'proxy for proxy for array'
|
||||
);
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.3.1
|
||||
esid: sec-array.prototype.concat
|
||||
description: Species constructor of a Proxy object whose target is an array
|
||||
info: |
|
||||
[...]
|
||||
2. Let A be ? ArraySpeciesCreate(O, 0).
|
||||
[...]
|
||||
7. Return A.
|
||||
|
||||
9.4.2.3 ArraySpeciesCreate
|
||||
|
||||
[...]
|
||||
3. Let isArray be ? IsArray(originalArray).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is
|
||||
null, throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy, Symbol.species]
|
||||
---*/
|
||||
|
||||
var array = [];
|
||||
var proxy = new Proxy(new Proxy(array, {}), {});
|
||||
var Ctor = function() {};
|
||||
var result;
|
||||
|
||||
array.constructor = function() {};
|
||||
array.constructor[Symbol.species] = Ctor;
|
||||
|
||||
result = Array.prototype.concat.call(proxy);
|
||||
|
||||
assert.sameValue(Object.getPrototypeOf(result), Ctor.prototype);
|
51
test/built-ins/Array/prototype/concat/is-concat-spreadable-is-array-proxy-revoked.js
vendored
Normal file
51
test/built-ins/Array/prototype/concat/is-concat-spreadable-is-array-proxy-revoked.js
vendored
Normal file
|
@ -0,0 +1,51 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-isconcatspreadable
|
||||
es6id: 22.1.3.1.1
|
||||
description: Revoked proxy value produces a TypeError when supplied to IsArray
|
||||
info: |
|
||||
[...]
|
||||
5. Repeat, while items is not empty
|
||||
a. Remove the first element from items and let E be the value of the
|
||||
element.
|
||||
b. Let spreadable be ? IsConcatSpreadable(E).
|
||||
c. If spreadable is true, then
|
||||
[...]
|
||||
e. Else E is added as a single item rather than spread,
|
||||
[...]
|
||||
|
||||
ES6 22.1.3.1.1: Runtime Semantics: IsConcatSpreadable ( O )
|
||||
|
||||
1. If Type(O) is not Object, return false.
|
||||
2. Let spreadable be ? Get(O, @@isConcatSpreadable).
|
||||
3. If spreadable is not undefined, return ToBoolean(spreadable).
|
||||
4. Return ? IsArray(O).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy, Symbol.isConcatSpreadable]
|
||||
---*/
|
||||
|
||||
var target = [];
|
||||
var handle = Proxy.revocable(target, {
|
||||
get: function(_, key) {
|
||||
// Defer proxy revocation until after property access to ensure that the
|
||||
// expected TypeError originates from the IsArray operation.
|
||||
if (key === Symbol.isConcatSpreadable) {
|
||||
handle.revoke();
|
||||
}
|
||||
return target[key];
|
||||
}
|
||||
});
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
[].concat(handle.proxy);
|
||||
});
|
|
@ -0,0 +1,44 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-isconcatspreadable
|
||||
es6id: 22.1.3.1.1
|
||||
description: >
|
||||
Revoked proxy value produces a TypeError during access of
|
||||
`Symbol.isConcatSpreadable` property
|
||||
info: |
|
||||
[...]
|
||||
5. Repeat, while items is not empty
|
||||
a. Remove the first element from items and let E be the value of the
|
||||
element.
|
||||
b. Let spreadable be ? IsConcatSpreadable(E).
|
||||
c. If spreadable is true, then
|
||||
[...]
|
||||
e. Else E is added as a single item rather than spread,
|
||||
[...]
|
||||
|
||||
ES6 22.1.3.1.1: Runtime Semantics: IsConcatSpreadable ( O )
|
||||
|
||||
1. If Type(O) is not Object, return false.
|
||||
2. Let spreadable be ? Get(O, @@isConcatSpreadable).
|
||||
|
||||
7.3.1 Get
|
||||
|
||||
[...]
|
||||
3. Return ? O.[[Get]](P, O).
|
||||
|
||||
9.5.8 [[Get]]
|
||||
|
||||
[...]
|
||||
2. Let handler be O.[[ProxyHandler]].
|
||||
3. If handler is null, throw a TypeError exception.
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var handle = Proxy.revocable([], {});
|
||||
|
||||
handle.revoke();
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
[].concat(handle.proxy);
|
||||
});
|
|
@ -0,0 +1,52 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-isconcatspreadable
|
||||
es6id: 22.1.3.1.1
|
||||
description: >
|
||||
Proxies who final targets are arrays are considered spreadable
|
||||
info: |
|
||||
[...]
|
||||
5. Repeat, while items is not empty
|
||||
a. Remove the first element from items and let E be the value of the
|
||||
element.
|
||||
b. Let spreadable be ? IsConcatSpreadable(E).
|
||||
c. If spreadable is true, then
|
||||
[...]
|
||||
e. Else E is added as a single item rather than spread,
|
||||
[...]
|
||||
|
||||
ES6 22.1.3.1.1: Runtime Semantics: IsConcatSpreadable ( O )
|
||||
|
||||
1. If Type(O) is not Object, return false.
|
||||
2. Let spreadable be ? Get(O, @@isConcatSpreadable).
|
||||
3. If spreadable is not undefined, return ToBoolean(spreadable).
|
||||
4. Return ? IsArray(O).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy, Symbol.isConcatSpreadable]
|
||||
---*/
|
||||
|
||||
var arrayProxy = new Proxy([], {});
|
||||
var arrayProxyProxy = new Proxy(arrayProxy, {});
|
||||
var spreadable = {};
|
||||
spreadable[Symbol.isConcatSpreadable] = true;
|
||||
var spreadableProxy = new Proxy(spreadable, {});
|
||||
|
||||
assert.sameValue([].concat(arrayProxy).length, 0, 'Proxy for an array');
|
||||
assert.sameValue(
|
||||
[].concat(arrayProxyProxy).length, 0, 'Proxy for a proxy for an array'
|
||||
);
|
||||
assert.sameValue(
|
||||
[].concat(spreadableProxy).length,
|
||||
0,
|
||||
'Proxy for an ordinary object with a truthy @@isConcatSpreadable property'
|
||||
);
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.3.7
|
||||
esid: sec-array.prototype.filter
|
||||
description: Species constructor of a Proxy object whose target is an array
|
||||
info: |
|
||||
[...]
|
||||
5. Let A be ? ArraySpeciesCreate(O, 0).
|
||||
[...]
|
||||
9. Return A.
|
||||
|
||||
9.4.2.3 ArraySpeciesCreate
|
||||
|
||||
[...]
|
||||
3. Let isArray be ? IsArray(originalArray).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is
|
||||
null, throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy, Symbol.species]
|
||||
---*/
|
||||
|
||||
var array = [];
|
||||
var proxy = new Proxy(new Proxy(array, {}), {});
|
||||
var Ctor = function() {};
|
||||
var result;
|
||||
|
||||
array.constructor = function() {};
|
||||
array.constructor[Symbol.species] = Ctor;
|
||||
|
||||
result = Array.prototype.filter.call(proxy, function() {});
|
||||
|
||||
assert.sameValue(Object.getPrototypeOf(result), Ctor.prototype);
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.3.15
|
||||
esid: sec-array.prototype.map
|
||||
description: Species constructor of a Proxy object whose target is an array
|
||||
info: |
|
||||
[...]
|
||||
5. Let A be ? ArraySpeciesCreate(O, len).
|
||||
[...]
|
||||
8. Return A.
|
||||
|
||||
9.4.2.3 ArraySpeciesCreate
|
||||
|
||||
[...]
|
||||
3. Let isArray be ? IsArray(originalArray).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is
|
||||
null, throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy, Symbol.species]
|
||||
---*/
|
||||
|
||||
var array = [];
|
||||
var proxy = new Proxy(new Proxy(array, {}), {});
|
||||
var Ctor = function() {};
|
||||
var result;
|
||||
|
||||
array.constructor = function() {};
|
||||
array.constructor[Symbol.species] = Ctor;
|
||||
|
||||
result = Array.prototype.map.call(proxy, function() {});
|
||||
|
||||
assert.sameValue(Object.getPrototypeOf(result), Ctor.prototype);
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.3.23
|
||||
esid: sec-array.prototype.slice
|
||||
description: Species constructor of a Proxy object whose target is an array
|
||||
info: |
|
||||
[...]
|
||||
8. Let A be ? ArraySpeciesCreate(O, count).
|
||||
[...]
|
||||
12. Return A.
|
||||
|
||||
9.4.2.3 ArraySpeciesCreate
|
||||
|
||||
[...]
|
||||
3. Let isArray be ? IsArray(originalArray).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is
|
||||
null, throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy, Symbol.species]
|
||||
---*/
|
||||
|
||||
var array = [];
|
||||
var proxy = new Proxy(new Proxy(array, {}), {});
|
||||
var Ctor = function() {};
|
||||
var result;
|
||||
|
||||
array.constructor = function() {};
|
||||
array.constructor[Symbol.species] = Ctor;
|
||||
|
||||
result = Array.prototype.slice.call(proxy);
|
||||
|
||||
assert.sameValue(Object.getPrototypeOf(result), Ctor.prototype);
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
es6id: 22.1.3.25
|
||||
esid: sec-array.prototype.splice
|
||||
description: Species constructor of a Proxy object whose target is an array
|
||||
info: |
|
||||
[...]
|
||||
9. Let A be ? ArraySpeciesCreate(O, actualDeleteCount).
|
||||
[...]
|
||||
20. Return A.
|
||||
|
||||
9.4.2.3 ArraySpeciesCreate
|
||||
|
||||
[...]
|
||||
3. Let isArray be ? IsArray(originalArray).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is
|
||||
null, throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy, Symbol.species]
|
||||
---*/
|
||||
|
||||
var array = [];
|
||||
var proxy = new Proxy(new Proxy(array, {}), {});
|
||||
var Ctor = function() {};
|
||||
var result;
|
||||
|
||||
array.constructor = function() {};
|
||||
array.constructor[Symbol.species] = Ctor;
|
||||
|
||||
result = Array.prototype.splice.call(proxy);
|
||||
|
||||
assert.sameValue(Object.getPrototypeOf(result), Ctor.prototype);
|
|
@ -0,0 +1,46 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-json.parse
|
||||
es6id: 24.3.1
|
||||
description: Behavior when revived value is a revoked Proxy exotic object
|
||||
info: |
|
||||
[...]
|
||||
7. If IsCallable(reviver) is true, then
|
||||
a. Let root be ObjectCreate(%ObjectPrototype%).
|
||||
b. Let rootName be the empty String.
|
||||
c. Let status be CreateDataProperty(root, rootName, unfiltered).
|
||||
d. Assert: status is true.
|
||||
e. Return ? InternalizeJSONProperty(root, rootName).
|
||||
|
||||
24.3.1.1 Runtime Semantics: InternalizeJSONProperty
|
||||
|
||||
[...]
|
||||
2. If Type(val) is Object, then
|
||||
a. Let isArray be ? IsArray(val).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var handle = Proxy.revocable([], {});
|
||||
var returnCount = 0;
|
||||
|
||||
handle.revoke();
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
JSON.parse('[null, null]', function() {
|
||||
this[1] = handle.proxy;
|
||||
returnCount += 1;
|
||||
});
|
||||
});
|
||||
|
||||
assert.sameValue(returnCount, 1, 'invocation returns normally');
|
|
@ -0,0 +1,82 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-json.parse
|
||||
es6id: 24.3.1
|
||||
description: Behavior when revived value is a Proxy exotic object
|
||||
info: |
|
||||
[...]
|
||||
7. If IsCallable(reviver) is true, then
|
||||
a. Let root be ObjectCreate(%ObjectPrototype%).
|
||||
b. Let rootName be the empty String.
|
||||
c. Let status be CreateDataProperty(root, rootName, unfiltered).
|
||||
d. Assert: status is true.
|
||||
e. Return ? InternalizeJSONProperty(root, rootName).
|
||||
|
||||
24.3.1.1 Runtime Semantics: InternalizeJSONProperty
|
||||
|
||||
[...]
|
||||
2. If Type(val) is Object, then
|
||||
a. Let isArray be ? IsArray(val).
|
||||
b. If isArray is true, then
|
||||
[...]
|
||||
c. Else,
|
||||
[...]
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var objectProxy = new Proxy({ length: 0, other: 0 }, {});
|
||||
var arrayProxy = new Proxy([], {});
|
||||
var arrayProxyProxy = new Proxy(arrayProxy, {});
|
||||
var visitedOther, injectProxy;
|
||||
|
||||
arrayProxy.other = 0;
|
||||
|
||||
injectProxy = function(name, val) {
|
||||
if (name === 'other') {
|
||||
visitedOther = true;
|
||||
}
|
||||
this[1] = objectProxy;
|
||||
return val;
|
||||
};
|
||||
visitedOther = false;
|
||||
|
||||
JSON.parse('[null, null]', injectProxy);
|
||||
|
||||
assert.sameValue(visitedOther, true, 'proxy for ordinary object');
|
||||
|
||||
injectProxy = function(name, val) {
|
||||
if (name === 'other') {
|
||||
visitedOther = true;
|
||||
}
|
||||
this[1] = arrayProxy;
|
||||
return val;
|
||||
};
|
||||
visitedOther = false;
|
||||
|
||||
JSON.parse('[null, null]', injectProxy);
|
||||
|
||||
assert.sameValue(visitedOther, false, 'proxy for array');
|
||||
|
||||
injectProxy = function(name, val) {
|
||||
if (name === 'other') {
|
||||
visitedOther = true;
|
||||
}
|
||||
this[1] = arrayProxyProxy;
|
||||
return val;
|
||||
};
|
||||
visitedOther = false;
|
||||
|
||||
JSON.parse('[null, null]', injectProxy);
|
||||
|
||||
assert.sameValue(visitedOther, false, 'proxy for array proxy');
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-json.stringify
|
||||
es6id: 24.3.2
|
||||
description: Revoked proxy value produces a TypeError
|
||||
info: |
|
||||
[...]
|
||||
4. If Type(replacer) is Object, then
|
||||
a. If IsCallable(replacer) is true, then
|
||||
i. Let ReplacerFunction be replacer.
|
||||
b. Else,
|
||||
i. Let isArray be ? IsArray(replacer).
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var handle = Proxy.revocable([], {});
|
||||
|
||||
handle.revoke();
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
JSON.stringify({}, handle.proxy);
|
||||
});
|
|
@ -0,0 +1,45 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-json.stringify
|
||||
es6id: 24.3.2
|
||||
description: Proxy of an array is treated as an array
|
||||
info: |
|
||||
[...]
|
||||
12. Return ? SerializeJSONProperty(the empty String, wrapper).
|
||||
|
||||
24.3.2.1 Runtime Semantics: SerializeJSONProperty
|
||||
|
||||
[...]
|
||||
10. If Type(value) is Object and IsCallable(value) is false, then
|
||||
a. Let isArray be ? IsArray(value).
|
||||
b. If isArray is true, return ? SerializeJSONArray(value).
|
||||
c. Else, return ? SerializeJSONObject(value).
|
||||
[...]
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var objectProxy = new Proxy({}, {});
|
||||
var arrayProxy = new Proxy([], {});
|
||||
var arrayProxyProxy = new Proxy(arrayProxy, {});
|
||||
|
||||
assert.sameValue(JSON.stringify(objectProxy), '{}');
|
||||
assert.sameValue(JSON.stringify(arrayProxy), '[]', 'proxy for an array');
|
||||
assert.sameValue(
|
||||
JSON.stringify([[arrayProxy]]), '[[[]]]', 'proxy for an array (nested)'
|
||||
);
|
||||
assert.sameValue(
|
||||
JSON.stringify([[arrayProxyProxy]]),
|
||||
'[[[]]]',
|
||||
'proxy for a proxy for an array (nested)'
|
||||
);
|
|
@ -0,0 +1,42 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-json.stringify
|
||||
es6id: 24.3.2
|
||||
description: Revoked proxy value produces a TypeError
|
||||
info: |
|
||||
[...]
|
||||
12. Return ? SerializeJSONProperty(the empty String, wrapper).
|
||||
|
||||
24.3.2.1 Runtime Semantics: SerializeJSONProperty
|
||||
|
||||
[...]
|
||||
10. If Type(value) is Object and IsCallable(value) is false, then
|
||||
a. Let isArray be ? IsArray(value).
|
||||
b. If isArray is true, return ? SerializeJSONArray(value).
|
||||
c. Else, return ? SerializeJSONObject(value).
|
||||
[...]
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var handle = Proxy.revocable([], {});
|
||||
|
||||
handle.revoke();
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
JSON.stringify(handle.proxy);
|
||||
}, 'top-level value');
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
JSON.stringify([[[handle.proxy]]]);
|
||||
}, 'nested value');
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-object.prototype.tostring
|
||||
es6id: 19.1.3.6
|
||||
description: Proxy of an array is treated as an array
|
||||
info: |
|
||||
[...]
|
||||
3. Let O be ToObject(this value).
|
||||
4. Let isArray be ? IsArray(O).
|
||||
5. If isArray is true, let builtinTag be "Array".
|
||||
[...]
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var objectProxy = new Proxy({}, {});
|
||||
var arrayProxy = new Proxy([], {});
|
||||
var arrayProxyProxy = new Proxy(arrayProxy, {});
|
||||
|
||||
assert.sameValue(
|
||||
Object.prototype.toString.call(objectProxy), '[object Object]'
|
||||
);
|
||||
assert.sameValue(
|
||||
Object.prototype.toString.call(arrayProxy), '[object Array]', 'array proxy'
|
||||
);
|
||||
assert.sameValue(
|
||||
Object.prototype.toString.call(arrayProxyProxy),
|
||||
'[object Array]',
|
||||
'proxy for array proxy'
|
||||
);
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-object.prototype.tostring
|
||||
es6id: 19.1.3.6
|
||||
description: Revoked proxy value produces a TypeError
|
||||
info: |
|
||||
[...]
|
||||
3. Let O be ToObject(this value).
|
||||
4. Let isArray be ? IsArray(O).
|
||||
5. If isArray is true, let builtinTag be "Array".
|
||||
[...]
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var handle = Proxy.revocable([], {});
|
||||
|
||||
handle.revoke();
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
Object.prototype.toString.call(handle.proxy);
|
||||
});
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-object.prototype.tostring
|
||||
es6id: 19.1.3.6
|
||||
description: Proxy of an array is treated as an array
|
||||
info: |
|
||||
[...]
|
||||
3. Let O be ToObject(this value).
|
||||
4. Let isArray be ? IsArray(O).
|
||||
5. If isArray is true, let builtinTag be "Array".
|
||||
[...]
|
||||
|
||||
7.2.2 IsArray
|
||||
|
||||
[...]
|
||||
3. If argument is a Proxy exotic object, then
|
||||
a. If the value of the [[ProxyHandler]] internal slot of argument is null,
|
||||
throw a TypeError exception.
|
||||
b. Let target be the value of the [[ProxyTarget]] internal slot of
|
||||
argument.
|
||||
c. Return ? IsArray(target).
|
||||
features: [Proxy]
|
||||
---*/
|
||||
|
||||
var objectProxy = new Proxy({}, {});
|
||||
var arrayProxy = new Proxy([], {});
|
||||
var arrayProxyProxy = new Proxy(arrayProxy, {});
|
||||
|
||||
assert.sameValue(
|
||||
Object.prototype.toString.call(objectProxy), '[object Object]'
|
||||
);
|
||||
assert.sameValue(
|
||||
Object.prototype.toString.call(arrayProxy), '[object Array]', 'array proxy'
|
||||
);
|
||||
assert.sameValue(
|
||||
Object.prototype.toString.call(arrayProxyProxy),
|
||||
'[object Array]',
|
||||
'proxy for array proxy'
|
||||
);
|
Loading…
Reference in New Issue