[v8-test262-automation] Changes from https://github.com/v8/v8.git at sha f88d169e on Thu Jan 17 2019 19:35:25 GMT+0000 (Coordinated Universal Time)

This commit is contained in:
test262-automation 2019-01-17 19:35:54 +00:00
parent 5331ca05a2
commit 6bb8f41e0a
16 changed files with 66 additions and 2156 deletions

View File

@ -27,8 +27,12 @@
[ [
[ALWAYS, { [ALWAYS, {
# TODO(jochen): The following test is flaky. # TODO(jochen): The following test is flaky.
'overrides/caching': [PASS, FAIL], 'overrides/caching': [PASS, FAIL],
# https://code.google.com/p/v8/issues/detail?id=7481
'collator/check-kf-option': [FAIL],
'collator/check-kn-option': [FAIL],
}], # ALWAYS }], # ALWAYS
['variant == no_wasm_traps', { ['variant == no_wasm_traps', {

View File

@ -86,9 +86,7 @@ assertThrows(
}), }),
Error); Error);
// These don't throw yet, we need to implement language/script/region assertThrows(
// override logic first.
assertDoesNotThrow(
() => new Intl.Locale('en-US', { () => new Intl.Locale('en-US', {
get language() { get language() {
throw new Error('foo'); throw new Error('foo');
@ -96,7 +94,7 @@ assertDoesNotThrow(
}), }),
Error); Error);
assertDoesNotThrow( assertThrows(
() => new Intl.Locale('en-US', { () => new Intl.Locale('en-US', {
get script() { get script() {
throw new Error('foo'); throw new Error('foo');
@ -104,7 +102,7 @@ assertDoesNotThrow(
}), }),
Error); Error);
assertDoesNotThrow( assertThrows(
() => new Intl.Locale('en-US', { () => new Intl.Locale('en-US', {
get region() { get region() {
throw new Error('foo'); throw new Error('foo');

View File

@ -13,10 +13,15 @@ assertEquals('long', rtf.resolvedOptions().style);
assertEquals('always', rtf.resolvedOptions().numeric); assertEquals('always', rtf.resolvedOptions().numeric);
// contains style, numeric and locale key // contains style, numeric and locale key
assertEquals(3, Object.getOwnPropertyNames(rtf.resolvedOptions()).length); assertEquals(4, Object.getOwnPropertyNames(rtf.resolvedOptions()).length);
// contains style, numeric and locale key // contains style, numeric and locale key
assertEquals(3, Object.getOwnPropertyNames(new Intl.RelativeTimeFormat('en').resolvedOptions()).length); assertEquals(
4,
Object.getOwnPropertyNames(
new Intl.RelativeTimeFormat("en").resolvedOptions()
).length
);
assertEquals( assertEquals(
'short', 'short',

View File

@ -3,7 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
// Flags: --allow-natives-syntax --opt --no-always-opt // Flags: --allow-natives-syntax --opt --no-always-opt
// Flags: --no-stress-background-compile // Flags: --no-stress-background-compile --trace-opt --trace-deopt
let id = 0; let id = 0;

View File

@ -141,15 +141,15 @@ try {
} }
assertTrue(caught); assertTrue(caught);
caught = false // See ES#sec-web-compat-evaldeclarationinstantiation. Sloppy block functions
try { // inside of blocks in eval behave similar to regular sloppy block function
(function() { // hoisting: the var declaration on the function level is only created if
{ // it would not cause a syntax error. A masking let would cause a conflicting
let x = 1; // var declaration syntax error, and hence the var isn't introduced.
eval('{ function x() {} }'); (function() {
} {
})(); let x = 1;
} catch (e) { eval('{ function x() {} }');
caught = true; assertEquals(1, x);
} }
assertFalse(caught); })();

View File

@ -1,671 +0,0 @@
// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Test Annex B 3.3 semantics for functions declared in blocks in sloppy mode.
// http://www.ecma-international.org/ecma-262/6.0/#sec-block-level-function-declarations-web-legacy-compatibility-semantics
(function overridingLocalFunction() {
var x = [];
assertEquals('function', typeof f);
function f() {
x.push(1);
}
f();
{
f();
function f() {
x.push(2);
}
f();
}
f();
{
f();
function f() {
x.push(3);
}
f();
}
f();
assertArrayEquals([1, 2, 2, 2, 3, 3, 3], x);
})();
(function newFunctionBinding() {
var x = [];
assertEquals('undefined', typeof f);
{
f();
function f() {
x.push(2);
}
f();
}
f();
{
f();
function f() {
x.push(3);
}
f();
}
f();
assertArrayEquals([2, 2, 2, 3, 3, 3], x);
})();
(function shadowingLetDoesntBind() {
let f = 1;
assertEquals(1, f);
{
let y = 3;
function f() {
y = 2;
}
f();
assertEquals(2, y);
}
assertEquals(1, f);
})();
(function shadowingLetDoesntBindGenerator() {
let f = function *f() {
while(true) {
yield 1;
}
};
assertEquals(1, f().next().value);
{
function *f() {
while(true) {
yield 2;
}
}
assertEquals(2, f().next().value);
}
assertEquals(1, f().next().value);
})();
(function shadowingClassDoesntBind() {
class f { }
assertEquals('class f { }', f.toString());
{
let y = 3;
function f() {
y = 2;
}
f();
assertEquals(2, y);
}
assertEquals('class f { }', f.toString());
})();
(function shadowingConstDoesntBind() {
const f = 1;
assertEquals(1, f);
{
let y = 3;
function f() {
y = 2;
}
f();
assertEquals(2, y);
}
assertEquals(1, f);
})();
(function shadowingVarBinds() {
var f = 1;
assertEquals(1, f);
{
let y = 3;
function f() {
y = 2;
}
f();
assertEquals(2, y);
}
assertEquals('function', typeof f);
})();
(function complexParams(a = 0) {
{
let y = 3;
function f(b = 0) {
y = 2;
}
f();
assertEquals(2, y);
}
assertEquals('function', typeof f);
})();
(function complexVarParams(a = 0) {
var f;
{
let y = 3;
function f(b = 0) {
y = 2;
}
f();
assertEquals(2, y);
}
assertEquals('function', typeof f);
})();
(function conditional() {
if (true) {
function f() { return 1; }
} else {
function f() { return 2; }
}
assertEquals(1, f());
if (false) {
function g() { return 1; }
} else {
function g() { return 2; }
}
assertEquals(2, g());
})();
(function skipExecution() {
{
function f() { return 1; }
}
assertEquals(1, f());
{
function f() { return 2; }
}
assertEquals(2, f());
L: {
assertEquals(3, f());
break L;
function f() { return 3; }
}
assertEquals(2, f());
})();
(function executionOrder() {
function getOuter() {
return f;
}
assertEquals('undefined', typeof getOuter());
{
assertEquals('function', typeof f);
assertEquals('undefined', typeof getOuter());
function f () {}
assertEquals('function', typeof f);
assertEquals('function', typeof getOuter());
}
assertEquals('function', typeof getOuter());
})();
(function reassignBindings() {
function getOuter() {
return f;
}
assertEquals('undefined', typeof getOuter());
{
assertEquals('function', typeof f);
assertEquals('undefined', typeof getOuter());
f = 1;
assertEquals('number', typeof f);
assertEquals('undefined', typeof getOuter());
function f () {}
assertEquals('number', typeof f);
assertEquals('number', typeof getOuter());
f = '';
assertEquals('string', typeof f);
assertEquals('number', typeof getOuter());
}
assertEquals('number', typeof getOuter());
})();
// Test that shadowing arguments is fine
(function shadowArguments(x) {
assertArrayEquals([1], arguments);
{
assertEquals('function', typeof arguments);
function arguments() {}
assertEquals('function', typeof arguments);
}
assertEquals('function', typeof arguments);
})(1);
// Don't shadow simple parameter
(function shadowingParameterDoesntBind(x) {
assertEquals(1, x);
{
function x() {}
}
assertEquals(1, x);
})(1);
// Don't shadow complex parameter
(function shadowingDefaultParameterDoesntBind(x = 0) {
assertEquals(1, x);
{
function x() {}
}
assertEquals(1, x);
})(1);
// Don't shadow nested complex parameter
(function shadowingNestedParameterDoesntBind([[x]]) {
assertEquals(1, x);
{
function x() {}
}
assertEquals(1, x);
})([[1]]);
// Don't shadow rest parameter
(function shadowingRestParameterDoesntBind(...x) {
assertArrayEquals([1], x);
{
function x() {}
}
assertArrayEquals([1], x);
})(1);
// Don't shadow complex rest parameter
(function shadowingComplexRestParameterDoesntBind(...[x]) {
assertArrayEquals(1, x);
{
function x() {}
}
assertArrayEquals(1, x);
})(1);
// Previous tests with a var declaration thrown in.
// Don't shadow simple parameter
(function shadowingVarParameterDoesntBind(x) {
var x;
assertEquals(1, x);
{
function x() {}
}
assertEquals(1, x);
})(1);
// Don't shadow complex parameter
(function shadowingVarDefaultParameterDoesntBind(x = 0) {
var x;
assertEquals(1, x);
{
function x() {}
}
assertEquals(1, x);
})(1);
// Don't shadow nested complex parameter
(function shadowingVarNestedParameterDoesntBind([[x]]) {
var x;
assertEquals(1, x);
{
function x() {}
}
assertEquals(1, x);
})([[1]]);
// Don't shadow rest parameter
(function shadowingVarRestParameterDoesntBind(...x) {
var x;
assertArrayEquals([1], x);
{
function x() {}
}
assertArrayEquals([1], x);
})(1);
// Don't shadow complex rest parameter
(function shadowingVarComplexRestParameterDoesntBind(...[x]) {
var x;
assertArrayEquals(1, x);
{
function x() {}
}
assertArrayEquals(1, x);
})(1);
// Hoisting is not affected by other simple parameters
(function irrelevantParameterBinds(y, z) {
assertEquals(undefined, x);
{
function x() {}
}
assertEquals('function', typeof x);
})(1);
// Hoisting is not affected by other complex parameters
(function irrelevantComplexParameterBinds([y] = [], z) {
assertEquals(undefined, x);
{
function x() {}
}
assertEquals('function', typeof x);
})();
// Hoisting is not affected by rest parameters
(function irrelevantRestParameterBinds(y, ...z) {
assertEquals(undefined, x);
{
function x() {}
}
assertEquals('function', typeof x);
})();
// Hoisting is not affected by complex rest parameters
(function irrelevantRestParameterBinds(y, ...[z]) {
assertEquals(undefined, x);
{
function x() {}
}
assertEquals('function', typeof x);
})();
// Test that shadowing function name is fine
{
let called = false;
(function shadowFunctionName() {
if (called) assertUnreachable();
called = true;
{
function shadowFunctionName() {
return 0;
}
assertEquals(0, shadowFunctionName());
}
assertEquals(0, shadowFunctionName());
})();
}
{
let called = false;
(function shadowFunctionNameWithComplexParameter(...r) {
if (called) assertUnreachable();
called = true;
{
function shadowFunctionNameWithComplexParameter() {
return 0;
}
assertEquals(0, shadowFunctionNameWithComplexParameter());
}
assertEquals(0, shadowFunctionNameWithComplexParameter());
})();
}
(function shadowOuterVariable() {
{
let f = 0;
(function () {
assertEquals(undefined, f);
{
assertEquals(1, f());
function f() { return 1; }
assertEquals(1, f());
}
assertEquals(1, f());
})();
assertEquals(0, f);
}
})();
(function notInDefaultScope() {
var y = 1;
(function innerNotInDefaultScope(x = y) {
assertEquals('undefined', typeof y);
{
function y() {}
}
assertEquals('function', typeof y);
assertEquals(1, x);
})();
})();
(function noHoistingThroughNestedLexical() {
{
let f = 2;
{
let y = 3;
function f() {
y = 2;
}
f();
assertEquals(2, y);
}
assertEquals(2, f);
}
assertThrows(()=>f, ReferenceError);
})();
// Only the first function is hoisted; the second is blocked by the first.
// Contrast overridingLocalFunction, in which the outer function declaration
// is not lexical and so the inner declaration is hoisted.
(function noHoistingThroughNestedFunctions() {
assertEquals(undefined, f); // Also checks that the var-binding exists
{
assertEquals(4, f());
function f() {
return 4;
}
{
assertEquals(5, f());
function f() {
return 5;
}
assertEquals(5, f());
}
assertEquals(4, f());
}
assertEquals(4, f());
})();
// B.3.5 interacts with B.3.3 to allow this.
(function hoistingThroughSimpleCatch() {
assertEquals(undefined, f);
try {
throw 0;
} catch (f) {
{
assertEquals(4, f());
function f() {
return 4;
}
assertEquals(4, f());
}
assertEquals(0, f);
}
assertEquals(4, f());
})();
(function noHoistingThroughComplexCatch() {
try {
throw 0;
} catch ({f}) {
{
assertEquals(4, f());
function f() {
return 4;
}
assertEquals(4, f());
}
}
assertThrows(()=>f, ReferenceError);
})();
(function hoistingThroughWith() {
with ({f: 0}) {
assertEquals(0, f);
{
assertEquals(4, f());
function f() {
return 4;
}
assertEquals(4, f());
}
assertEquals(0, f);
}
assertEquals(4, f());
})();
// Test that hoisting from blocks does happen in global scope
function globalHoisted() { return 0; }
{
function globalHoisted() { return 1; }
}
assertEquals(1, globalHoisted());
// Also happens when not previously defined
assertEquals(undefined, globalUndefinedHoisted);
{
function globalUndefinedHoisted() { return 1; }
}
assertEquals(1, globalUndefinedHoisted());
var globalUndefinedHoistedDescriptor =
Object.getOwnPropertyDescriptor(this, "globalUndefinedHoisted");
assertFalse(globalUndefinedHoistedDescriptor.configurable);
assertTrue(globalUndefinedHoistedDescriptor.writable);
assertTrue(globalUndefinedHoistedDescriptor.enumerable);
assertEquals(1, globalUndefinedHoistedDescriptor.value());
// When a function property is hoisted, it should be
// made enumerable.
// BUG(v8:4451)
Object.defineProperty(this, "globalNonEnumerable", {
value: false,
configurable: true,
writable: true,
enumerable: false
});
eval("{function globalNonEnumerable() { return 1; }}");
var globalNonEnumerableDescriptor
= Object.getOwnPropertyDescriptor(this, "globalNonEnumerable");
// BUG(v8:4451): Should be made non-configurable
assertTrue(globalNonEnumerableDescriptor.configurable);
assertTrue(globalNonEnumerableDescriptor.writable);
// BUG(v8:4451): Should be made enumerable
assertFalse(globalNonEnumerableDescriptor.enumerable);
assertEquals(1, globalNonEnumerableDescriptor.value());
// When a function property is hoisted, it should be overwritten and
// made writable and overwritten, even if the property was non-writable.
Object.defineProperty(this, "globalNonWritable", {
value: false,
configurable: true,
writable: false,
enumerable: true
});
eval("{function globalNonWritable() { return 1; }}");
var globalNonWritableDescriptor
= Object.getOwnPropertyDescriptor(this, "globalNonWritable");
// BUG(v8:4451): Should be made non-configurable
assertTrue(globalNonWritableDescriptor.configurable);
// BUG(v8:4451): Should be made writable
assertFalse(globalNonWritableDescriptor.writable);
assertFalse(globalNonEnumerableDescriptor.enumerable);
// BUG(v8:4451): Should be overwritten
assertEquals(false, globalNonWritableDescriptor.value);
// Test that hoisting from blocks does happen in an eval
eval(`
function evalHoisted() { return 0; }
{
function evalHoisted() { return 1; }
}
assertEquals(1, evalHoisted());
`);
// Test that hoisting from blocks happens from eval in a function
!function() {
eval(`
function evalInFunctionHoisted() { return 0; }
{
function evalInFunctionHoisted() { return 1; }
}
assertEquals(1, evalInFunctionHoisted());
`);
}();
(function evalHoistingThroughSimpleCatch() {
try {
throw 0;
} catch (f) {
eval(`{ function f() {
return 4;
} }`);
// assertEquals(0, f);
assertEquals(4, f());
}
// assertEquals(4, f());
assertEquals(undefined, f);
})();
// This test is incorrect BUG(v8:5168). The commented assertions are correct.
(function evalHoistingThroughWith() {
with ({f: 0}) {
eval(`{ function f() {
return 4;
} }`);
assertEquals(0, f);
}
assertEquals(4, f());
})();
let dontHoistGlobal;
{ function dontHoistGlobal() {} }
assertEquals(undefined, dontHoistGlobal);
let dontHoistEval;
var throws = false;
try {
eval("{ function dontHoistEval() {} }");
} catch (e) {
throws = true;
}
assertFalse(throws);
// When the global object is frozen, silently don't hoist
// Currently this actually throws BUG(v8:4452)
Object.freeze(this);
{
let throws = false;
try {
eval('{ function hoistWhenFrozen() {} }');
} catch (e) {
throws = true;
}
assertFalse(this.hasOwnProperty("hoistWhenFrozen"));
assertThrows(() => hoistWhenFrozen, ReferenceError);
// Should be assertFalse BUG(v8:4452)
assertTrue(throws);
}

View File

@ -1,733 +0,0 @@
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var global = this;
var globalProto = Object.getPrototypeOf(global);
// Number of objects being tested. There is an assert ensuring this is correct.
var objectCount = 21;
function runTest(f) {
function restore(object, oldProto) {
delete object[Symbol.unscopables];
delete object.x;
delete object.x_;
delete object.y;
delete object.z;
Object.setPrototypeOf(object, oldProto);
}
function getObject(i) {
var objects = [
{},
[],
function() {},
function() {
return arguments;
}(),
function() {
'use strict';
return arguments;
}(),
Object(1),
Object(true),
Object('bla'),
new Date,
new RegExp,
new Set,
new Map,
new WeakMap,
new WeakSet,
new ArrayBuffer(10),
new Int32Array(5),
Object,
Function,
Date,
RegExp,
global
];
assertEquals(objectCount, objects.length);
return objects[i];
}
// Tests depends on this not being there to start with.
delete Array.prototype[Symbol.unscopables];
if (f.length === 1) {
for (var i = 0; i < objectCount; i++) {
var object = getObject(i);
var oldObjectProto = Object.getPrototypeOf(object);
f(object);
restore(object, oldObjectProto);
}
} else {
for (var i = 0; i < objectCount; i++) {
for (var j = 0; j < objectCount; j++) {
var object = getObject(i);
var proto = getObject(j);
if (object === proto) {
continue;
}
var oldObjectProto = Object.getPrototypeOf(object);
var oldProtoProto = Object.getPrototypeOf(proto);
f(object, proto);
restore(object, oldObjectProto);
restore(proto, oldProtoProto);
}
}
}
}
// Test array first, since other tests are changing
// Array.prototype[Symbol.unscopables].
function TestArrayPrototypeUnscopables() {
var descr = Object.getOwnPropertyDescriptor(Array.prototype,
Symbol.unscopables);
assertFalse(descr.enumerable);
assertFalse(descr.writable);
assertTrue(descr.configurable);
assertEquals(null, Object.getPrototypeOf(descr.value));
var copyWithin = 'local copyWithin';
var entries = 'local entries';
var fill = 'local fill';
var find = 'local find';
var findIndex = 'local findIndex';
var keys = 'local keys';
var values = 'local values';
var array = [];
array.toString = 42;
with (array) {
assertEquals('local copyWithin', copyWithin);
assertEquals('local entries', entries);
assertEquals('local fill', fill);
assertEquals('local find', find);
assertEquals('local findIndex', findIndex);
assertEquals('local keys', keys);
assertEquals('local values', values);
assertEquals(42, toString);
}
}
TestArrayPrototypeUnscopables();
function TestBasics(object) {
var x = 1;
var y = 2;
var z = 3;
object.x = 4;
object.y = 5;
with (object) {
assertEquals(4, x);
assertEquals(5, y);
assertEquals(3, z);
}
var truthyValues = [true, 1, 'x', {}, Symbol()];
for (var truthyValue of truthyValues) {
object[Symbol.unscopables] = {x: truthyValue};
with (object) {
assertEquals(1, x);
assertEquals(5, y);
assertEquals(3, z);
}
}
var falsyValues = [false, 0, -0, NaN, '', null, undefined];
for (var falsyValue of falsyValues) {
object[Symbol.unscopables] = {x: falsyValue, y: true};
with (object) {
assertEquals(4, x);
assertEquals(2, y);
assertEquals(3, z);
}
}
for (var xFalsy of falsyValues) {
for (var yFalsy of falsyValues) {
object[Symbol.unscopables] = {x: xFalsy, y: yFalsy};
with (object) {
assertEquals(4, x);
assertEquals(5, y);
assertEquals(3, z);
}
}
}
}
runTest(TestBasics);
function TestUnscopableChain(object) {
var x = 1;
object.x = 2;
with (object) {
assertEquals(2, x);
}
object[Symbol.unscopables] = {
__proto__: {x: true}
};
with (object) {
assertEquals(1, x);
}
object[Symbol.unscopables] = {
__proto__: {x: undefined}
};
with (object) {
assertEquals(2, x);
}
}
runTest(TestUnscopableChain);
function TestBasicsSet(object) {
var x = 1;
object.x = 2;
with (object) {
assertEquals(2, x);
}
object[Symbol.unscopables] = {x: true};
with (object) {
assertEquals(1, x);
x = 3;
assertEquals(3, x);
}
assertEquals(3, x);
assertEquals(2, object.x);
}
runTest(TestBasicsSet);
function TestOnProto(object, proto) {
var x = 1;
var y = 2;
var z = 3;
proto.x = 4;
Object.setPrototypeOf(object, proto);
object.y = 5;
with (object) {
assertEquals(4, x);
assertEquals(5, y);
assertEquals(3, z);
}
proto[Symbol.unscopables] = {x: true};
with (object) {
assertEquals(1, x);
assertEquals(5, y);
assertEquals(3, z);
}
object[Symbol.unscopables] = {y: true};
with (object) {
assertEquals(4, x);
assertEquals(2, y);
assertEquals(3, z);
}
proto[Symbol.unscopables] = {y: true};
object[Symbol.unscopables] = {x: true};
with (object) {
assertEquals(1, x);
assertEquals(5, y);
assertEquals(3, z);
}
proto[Symbol.unscopables] = {y: true};
object[Symbol.unscopables] = {x: true, y: undefined};
with (object) {
assertEquals(1, x);
assertEquals(5, y);
assertEquals(3, z);
}
}
runTest(TestOnProto);
function TestSetBlockedOnProto(object, proto) {
var x = 1;
object.x = 2;
with (object) {
assertEquals(2, x);
}
Object.setPrototypeOf(object, proto);
proto[Symbol.unscopables] = {x: true};
with (object) {
assertEquals(1, x);
x = 3;
assertEquals(3, x);
}
assertEquals(3, x);
assertEquals(2, object.x);
}
runTest(TestSetBlockedOnProto);
function TestNonObject(object) {
var x = 1;
var y = 2;
object.x = 3;
object.y = 4;
object[Symbol.unscopables] = 'xy';
with (object) {
assertEquals(3, x);
assertEquals(4, y);
}
object[Symbol.unscopables] = null;
with (object) {
assertEquals(3, x);
assertEquals(4, y);
}
}
runTest(TestNonObject);
function TestChangeDuringWith(object) {
var x = 1;
var y = 2;
object.x = 3;
object.y = 4;
with (object) {
assertEquals(3, x);
assertEquals(4, y);
object[Symbol.unscopables] = {x: true};
assertEquals(1, x);
assertEquals(4, y);
}
}
runTest(TestChangeDuringWith);
function TestChangeDuringWithWithPossibleOptimization(object) {
var x = 1;
object.x = 2;
with (object) {
for (var i = 0; i < 1000; i++) {
if (i === 500) object[Symbol.unscopables] = {x: true};
assertEquals(i < 500 ? 2: 1, x);
}
}
}
TestChangeDuringWithWithPossibleOptimization({});
function TestChangeDuringWithWithPossibleOptimization2(object) {
var x = 1;
object.x = 2;
object[Symbol.unscopables] = {x: true};
with (object) {
for (var i = 0; i < 1000; i++) {
if (i === 500) delete object[Symbol.unscopables];
assertEquals(i < 500 ? 1 : 2, x);
}
}
}
TestChangeDuringWithWithPossibleOptimization2({});
function TestChangeDuringWithWithPossibleOptimization3(object) {
var x = 1;
object.x = 2;
object[Symbol.unscopables] = {};
with (object) {
for (var i = 0; i < 1000; i++) {
if (i === 500) object[Symbol.unscopables].x = true;
assertEquals(i < 500 ? 2 : 1, x);
}
}
}
TestChangeDuringWithWithPossibleOptimization3({});
function TestChangeDuringWithWithPossibleOptimization4(object) {
var x = 1;
object.x = 2;
object[Symbol.unscopables] = {x: true};
with (object) {
for (var i = 0; i < 1000; i++) {
if (i === 500) delete object[Symbol.unscopables].x;
assertEquals(i < 500 ? 1 : 2, x);
}
}
}
TestChangeDuringWithWithPossibleOptimization4({});
function TestChangeDuringWithWithPossibleOptimization4(object) {
var x = 1;
object.x = 2;
object[Symbol.unscopables] = {x: true};
with (object) {
for (var i = 0; i < 1000; i++) {
if (i === 500) object[Symbol.unscopables].x = undefined;
assertEquals(i < 500 ? 1 : 2, x);
}
}
}
TestChangeDuringWithWithPossibleOptimization4({});
function TestAccessorReceiver(object, proto) {
var x = 'local';
Object.defineProperty(proto, 'x', {
get: function() {
assertEquals(object, this);
return this.x_;
},
configurable: true
});
proto.x_ = 'proto';
Object.setPrototypeOf(object, proto);
proto.x_ = 'object';
with (object) {
assertEquals('object', x);
}
}
runTest(TestAccessorReceiver);
function TestUnscopablesGetter(object) {
// This test gets really messy when object is the global since the assert
// functions are properties on the global object and the call count gets
// completely different.
if (object === global) return;
var x = 'local';
object.x = 'object';
var callCount = 0;
Object.defineProperty(object, Symbol.unscopables, {
get: function() {
callCount++;
return {};
},
configurable: true
});
with (object) {
assertEquals('object', x);
}
// Once for HasBinding
assertEquals(1, callCount);
callCount = 0;
Object.defineProperty(object, Symbol.unscopables, {
get: function() {
callCount++;
return {x: true};
},
configurable: true
});
with (object) {
assertEquals('local', x);
}
// Once for HasBinding
assertEquals(1, callCount);
callCount = 0;
Object.defineProperty(object, Symbol.unscopables, {
get: function() {
callCount++;
return callCount == 1 ? {} : {x: true};
},
configurable: true
});
with (object) {
x = 1;
}
// Once for HasBinding
assertEquals(1, callCount);
assertEquals(1, object.x);
assertEquals('local', x);
with (object) {
x = 2;
}
// One more HasBinding.
assertEquals(2, callCount);
assertEquals(1, object.x);
assertEquals(2, x);
}
runTest(TestUnscopablesGetter);
var global = this;
function TestUnscopablesGetter2() {
var x = 'local';
var globalProto = Object.getPrototypeOf(global);
var protos = [{}, [], function() {}, global];
var objects = [{}, [], function() {}];
protos.forEach(function(proto) {
objects.forEach(function(object) {
Object.defineProperty(proto, 'x', {
get: function() {
assertEquals(object, this);
return 'proto';
},
configurable: true
});
object.__proto__ = proto;
Object.defineProperty(object, 'x', {
get: function() {
assertEquals(object, this);
return 'object';
},
configurable: true
});
with (object) {
assertEquals('object', x);
}
object[Symbol.unscopables] = {x: true};
with (object) {
assertEquals('local', x);
}
delete proto[Symbol.unscopables];
delete object[Symbol.unscopables];
});
});
delete global.x;
Object.setPrototypeOf(global, globalProto);
}
TestUnscopablesGetter2();
function TestSetterOnBlacklisted(object, proto) {
var x = 'local';
Object.defineProperty(proto, 'x', {
set: function(x) {
assertUnreachable();
},
get: function() {
return 'proto';
},
configurable: true
});
Object.setPrototypeOf(object, proto);
Object.defineProperty(object, 'x', {
get: function() {
return this.x_;
},
set: function(x) {
this.x_ = x;
},
configurable: true
});
object.x_ = 1;
with (object) {
x = 2;
assertEquals(2, x);
}
assertEquals(2, object.x);
object[Symbol.unscopables] = {x: true};
with (object) {
x = 3;
assertEquals(3, x);
}
assertEquals(2, object.x);
}
runTest(TestSetterOnBlacklisted);
function TestObjectsAsUnscopables(object, unscopables) {
var x = 1;
object.x = 2;
with (object) {
assertEquals(2, x);
object[Symbol.unscopables] = unscopables;
assertEquals(2, x);
}
}
runTest(TestObjectsAsUnscopables);
function TestAccessorOnUnscopables(object) {
var x = 1;
object.x = 2;
var calls = 0;
var unscopables = {
get x() {
calls++;
return calls === 1 ? true : undefined;
}
};
with (object) {
assertEquals(2, x);
object[Symbol.unscopables] = unscopables;
assertEquals(1, x);
assertEquals(2, x);
}
assertEquals(2, calls);
}
runTest(TestAccessorOnUnscopables);
function TestLengthUnscopables(object, proto) {
var length = 2;
with (object) {
assertEquals(1, length);
object[Symbol.unscopables] = {length: true};
assertEquals(2, length);
delete object[Symbol.unscopables];
assertEquals(1, length);
}
}
TestLengthUnscopables([1], Array.prototype);
TestLengthUnscopables(function(x) {}, Function.prototype);
TestLengthUnscopables(new String('x'), String.prototype);
function TestFunctionNameUnscopables(object) {
var name = 'local';
with (object) {
assertEquals('f', name);
object[Symbol.unscopables] = {name: true};
assertEquals('local', name);
delete object[Symbol.unscopables];
assertEquals('f', name);
}
}
TestFunctionNameUnscopables(function f() {});
function TestFunctionPrototypeUnscopables() {
var prototype = 'local';
var f = function() {};
var g = function() {};
Object.setPrototypeOf(f, g);
var fp = f.prototype;
var gp = g.prototype;
with (f) {
assertEquals(fp, prototype);
f[Symbol.unscopables] = {prototype: true};
assertEquals('local', prototype);
delete f[Symbol.unscopables];
assertEquals(fp, prototype);
}
}
TestFunctionPrototypeUnscopables(function() {});
function TestFunctionArgumentsUnscopables() {
var func = function() {
var arguments = 'local';
var args = func.arguments;
with (func) {
assertEquals(args, arguments);
func[Symbol.unscopables] = {arguments: true};
assertEquals('local', arguments);
delete func[Symbol.unscopables];
assertEquals(args, arguments);
}
}
func(1);
}
TestFunctionArgumentsUnscopables();
function TestArgumentsLengthUnscopables() {
var func = function() {
var length = 'local';
with (arguments) {
assertEquals(1, length);
arguments[Symbol.unscopables] = {length: true};
assertEquals('local', length);
}
}
func(1);
}
TestArgumentsLengthUnscopables();
function TestFunctionCallerUnscopables() {
var func = function() {
var caller = 'local';
with (func) {
assertEquals(TestFunctionCallerUnscopables, caller);
func[Symbol.unscopables] = {caller: true};
assertEquals('local', caller);
delete func[Symbol.unscopables];
assertEquals(TestFunctionCallerUnscopables, caller);
}
}
func(1);
}
TestFunctionCallerUnscopables();
function TestGetUnscopablesGetterThrows() {
var object = {
get x() {
assertUnreachable();
}
};
function CustomError() {}
Object.defineProperty(object, Symbol.unscopables, {
get: function() {
throw new CustomError();
}
});
assertThrows(function() {
with (object) {
x;
}
}, CustomError);
}
TestGetUnscopablesGetterThrows();
function TestGetUnscopablesGetterThrows2() {
var object = {
get x() {
assertUnreachable();
}
};
function CustomError() {}
object[Symbol.unscopables] = {
get x() {
throw new CustomError();
}
};
assertThrows(function() {
with (object) {
x;
}
}, CustomError);
}
TestGetUnscopablesGetterThrows();

View File

@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// Flags: --noasync-stack-traces
async function test(func, funcs) { async function test(func, funcs) {
try { try {
await func(); await func();
@ -81,21 +83,19 @@ async function runTests() {
try { await reject(); } catch (e) { throw new Error("FAIL"); } try { await reject(); } catch (e) { throw new Error("FAIL"); }
} }).c4, ["c4"]); } }).c4, ["c4"]);
// TODO(caitp): We should infer anonymous async functions as the empty
// string, not as the name of a function they're passed as a parameter to.
await test(async x => { throw new Error("FAIL") }, await test(async x => { throw new Error("FAIL") },
["test", "test", "runTests"]); ["test", "runTests"]);
await test(async() => { throw new Error("FAIL") }, await test(async() => { throw new Error("FAIL") },
["test", "test", "runTests"]); ["test", "runTests"]);
await test(async(a) => { throw new Error("FAIL") }, await test(async(a) => { throw new Error("FAIL") },
["test", "test", "runTests"]); ["test", "runTests"]);
await test(async(a, b) => { throw new Error("FAIL") }, await test(async(a, b) => { throw new Error("FAIL") },
["test", "test", "runTests"]); ["test", "runTests"]);
await test(async x => { await 1; throw new Error("FAIL") }, ["test"]); await test(async x => { await 1; throw new Error("FAIL") }, []);
await test(async() => { await 1; throw new Error("FAIL") }, ["test"]); await test(async() => { await 1; throw new Error("FAIL") }, []);
await test(async(a) => { await 1; throw new Error("FAIL") }, ["test"]); await test(async(a) => { await 1; throw new Error("FAIL") }, []);
await test(async(a, b) => { await 1; throw new Error("FAIL") }, ["test"]); await test(async(a, b) => { await 1; throw new Error("FAIL") }, []);
await test(async x => { await test(async x => {
await 1; await 1;
@ -104,7 +104,7 @@ async function runTests() {
} catch (e) { } catch (e) {
throw new Error("FAIL"); throw new Error("FAIL");
} }
}, ["test"]); }, []);
await test(async() => { await test(async() => {
await 1; await 1;
@ -113,7 +113,7 @@ async function runTests() {
} catch (e) { } catch (e) {
throw new Error("FAIL"); throw new Error("FAIL");
} }
}, ["test"]); }, []);
await test(async(a) => { await test(async(a) => {
await 1; await 1;
@ -122,7 +122,7 @@ async function runTests() {
} catch (e) { } catch (e) {
throw new Error("FAIL"); throw new Error("FAIL");
} }
}, ["test"]); }, []);
await test(async(a, b) => { await test(async(a, b) => {
await 1; await 1;
@ -131,7 +131,7 @@ async function runTests() {
} catch (e) { } catch (e) {
throw new Error("FAIL"); throw new Error("FAIL");
} }
}, ["test"]); }, []);
await test(async x => { await test(async x => {
await 1; await 1;
@ -140,7 +140,7 @@ async function runTests() {
} catch (e) { } catch (e) {
throw new Error("FAIL"); throw new Error("FAIL");
} }
}, ["test"]); }, []);
await test(async() => { await test(async() => {
await 1; await 1;
@ -149,7 +149,7 @@ async function runTests() {
} catch (e) { } catch (e) {
throw new Error("FAIL"); throw new Error("FAIL");
} }
}, ["test"]); }, []);
await test(async(a) => { await test(async(a) => {
await 1; await 1;
@ -158,7 +158,7 @@ async function runTests() {
} catch (e) { } catch (e) {
throw new Error("FAIL"); throw new Error("FAIL");
} }
}, ["test"]); }, []);
await test(async(a, b) => { await test(async(a, b) => {
await 1; await 1;
@ -167,7 +167,7 @@ async function runTests() {
} catch (e) { } catch (e) {
throw new Error("FAIL"); throw new Error("FAIL");
} }
}, ["test"]); }, []);
} }
runTests().catch(e => { runTests().catch(e => {

View File

@ -53,9 +53,9 @@ assertEquals(
{value: "Module", configurable: false, writable: false, enumerable: false}, {value: "Module", configurable: false, writable: false, enumerable: false},
Reflect.getOwnPropertyDescriptor(foo, Symbol.toStringTag)); Reflect.getOwnPropertyDescriptor(foo, Symbol.toStringTag));
// Nonexistant properties. // Nonexistent properties.
let nonexistant = ["gaga", 123, Symbol('')]; let nonexistent = ["gaga", 123, Symbol('')];
for (let key of nonexistant) { for (let key of nonexistent) {
assertSame(undefined, Reflect.getOwnPropertyDescriptor(foo, key)); assertSame(undefined, Reflect.getOwnPropertyDescriptor(foo, key));
assertTrue(Reflect.deleteProperty(foo, key)); assertTrue(Reflect.deleteProperty(foo, key));
assertFalse(Reflect.set(foo, key, true)); assertFalse(Reflect.set(foo, key, true));

View File

@ -1,391 +0,0 @@
// Copyright 2010 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Tests the Object.seal and Object.isSealed methods - ES 19.1.2.17 and
// ES 19.1.2.13
// Flags: --allow-natives-syntax --opt --noalways-opt
// Test that we return obj if non-object is passed as argument
var non_objects = new Array(undefined, null, 1, -1, 0, 42.43, Symbol("test"));
for (var key in non_objects) {
assertSame(non_objects[key], Object.seal(non_objects[key]));
}
// Test that isFrozen always returns true for non-objects
for (var key in non_objects) {
assertTrue(Object.isSealed(non_objects[key]));
}
// Test normal data properties.
var obj = { x: 42, z: 'foobar' };
var desc = Object.getOwnPropertyDescriptor(obj, 'x');
assertTrue(desc.writable);
assertTrue(desc.configurable);
assertEquals(42, desc.value);
desc = Object.getOwnPropertyDescriptor(obj, 'z');
assertTrue(desc.writable);
assertTrue(desc.configurable);
assertEquals('foobar', desc.value);
assertTrue(Object.isExtensible(obj));
assertFalse(Object.isSealed(obj));
Object.seal(obj);
// Make sure we are no longer extensible.
assertFalse(Object.isExtensible(obj));
assertTrue(Object.isSealed(obj));
// We should not be frozen, since we are still able to
// update values.
assertFalse(Object.isFrozen(obj));
// We should not allow new properties to be added.
obj.foo = 42;
assertEquals(obj.foo, undefined);
desc = Object.getOwnPropertyDescriptor(obj, 'x');
assertTrue(desc.writable);
assertFalse(desc.configurable);
assertEquals(42, desc.value);
desc = Object.getOwnPropertyDescriptor(obj, 'z');
assertTrue(desc.writable);
assertFalse(desc.configurable);
assertEquals("foobar", desc.value);
// Since writable is not affected by seal we should still be able to
// update the values.
obj.x = "43";
assertEquals("43", obj.x);
// Test on accessors.
var obj2 = {};
function get() { return 43; };
function set() {};
Object.defineProperty(obj2, 'x', { get: get, set: set, configurable: true });
desc = Object.getOwnPropertyDescriptor(obj2, 'x');
assertTrue(desc.configurable);
assertEquals(undefined, desc.value);
assertEquals(set, desc.set);
assertEquals(get, desc.get);
assertTrue(Object.isExtensible(obj2));
assertFalse(Object.isSealed(obj2));
Object.seal(obj2);
// Since this is an accessor property the object is now effectively both
// sealed and frozen (accessors has no writable attribute).
assertTrue(Object.isFrozen(obj2));
assertFalse(Object.isExtensible(obj2));
assertTrue(Object.isSealed(obj2));
desc = Object.getOwnPropertyDescriptor(obj2, 'x');
assertFalse(desc.configurable);
assertEquals(undefined, desc.value);
assertEquals(set, desc.set);
assertEquals(get, desc.get);
obj2.foo = 42;
assertEquals(obj2.foo, undefined);
// Test seal on arrays.
var arr = new Array(42,43);
desc = Object.getOwnPropertyDescriptor(arr, '0');
assertTrue(desc.configurable);
assertTrue(desc.writable);
assertEquals(42, desc.value);
desc = Object.getOwnPropertyDescriptor(arr, '1');
assertTrue(desc.configurable);
assertTrue(desc.writable);
assertEquals(43, desc.value);
assertTrue(Object.isExtensible(arr));
assertFalse(Object.isSealed(arr));
Object.seal(arr);
assertTrue(Object.isSealed(arr));
assertFalse(Object.isExtensible(arr));
// Since the values in the array is still writable this object
// is not frozen.
assertFalse(Object.isFrozen(arr));
desc = Object.getOwnPropertyDescriptor(arr, '0');
assertFalse(desc.configurable);
assertTrue(desc.writable);
assertEquals(42, desc.value);
desc = Object.getOwnPropertyDescriptor(arr, '1');
assertFalse(desc.configurable);
assertTrue(desc.writable);
assertEquals(43, desc.value);
arr[0] = 'foo';
// We should be able to overwrite the existing value.
assertEquals('foo', arr[0]);
// Test that isSealed returns the correct value even if configurable
// has been set to false on all properties manually and the extensible
// flag has also been set to false manually.
var obj3 = { x: 42, y: 'foo' };
assertFalse(Object.isFrozen(obj3));
Object.defineProperty(obj3, 'x', {configurable: false, writable: true});
Object.defineProperty(obj3, 'y', {configurable: false, writable: false});
Object.preventExtensions(obj3);
assertTrue(Object.isSealed(obj3));
// Make sure that an object that has a configurable property
// is not classified as sealed.
var obj4 = {};
Object.defineProperty(obj4, 'x', {configurable: true, writable: false});
Object.defineProperty(obj4, 'y', {configurable: false, writable: false});
Object.preventExtensions(obj4);
assertFalse(Object.isSealed(obj4));
// Make sure that Object.seal returns the sealed object.
var obj4 = {};
assertTrue(obj4 === Object.seal(obj4));
//
// Test that built-in array functions can't modify a sealed array.
//
obj = [1, 2, 3];
var objControl = [4, 5, 6];
// Allow these functions to set up monomorphic calls, using custom built-ins.
var push_call = function(a) { a.push(10); return a; }
var pop_call = function(a) { return a.pop(); }
for (var i = 0; i < 3; i++) {
push_call(obj);
pop_call(obj);
}
Object.seal(obj);
assertThrows(function() { push_call(obj); }, TypeError);
assertThrows(function() { pop_call(obj); }, TypeError);
// But the control object is fine at these sites.
assertDoesNotThrow(function() { push_call(objControl); });
assertDoesNotThrow(function() { pop_call(objControl); });
assertDoesNotThrow(function() { obj.push(); });
assertThrows(function() { obj.push(3); }, TypeError);
assertThrows(function() { obj.pop(); }, TypeError);
assertThrows(function() { obj.shift(3); }, TypeError);
assertDoesNotThrow(function() { obj.unshift(); });
assertThrows(function() { obj.unshift(1); }, TypeError);
assertThrows(function() { obj.splice(0, 0, 100, 101, 102); }, TypeError);
assertDoesNotThrow(function() { obj.splice(0,0); });
assertDoesNotThrow(function() { objControl.push(3); });
assertDoesNotThrow(function() { objControl.pop(); });
assertDoesNotThrow(function() { objControl.shift(3); });
assertDoesNotThrow(function() { objControl.unshift(); });
assertDoesNotThrow(function() { objControl.splice(0, 0, 100, 101, 102); });
// Verify that crankshaft still does the right thing.
obj = [1, 2, 3];
push_call = function(a) { a.push(1000); return a; }
// Include a call site that doesn't have a custom built-in.
var shift_call = function(a) { a.shift(1000); return a; }
for (var i = 0; i < 3; i++) {
push_call(obj);
shift_call(obj);
}
%OptimizeFunctionOnNextCall(push_call);
%OptimizeFunctionOnNextCall(shift_call);
push_call(obj);
shift_call(obj);
assertOptimized(push_call);
assertOptimized(shift_call);
Object.seal(obj);
assertThrows(function() { push_call(obj); }, TypeError);
assertThrows(function() { shift_call(obj); }, TypeError);
assertUnoptimized(push_call);
assertUnoptimized(shift_call);
assertDoesNotThrow(function() { push_call(objControl); });
assertDoesNotThrow(function() { shift_call(objControl); });
// Verify special behavior of splice on sealed objects.
obj = [1,2,3];
Object.seal(obj);
assertDoesNotThrow(function() { obj.splice(0,1,100); });
assertEquals(100, obj[0]);
assertDoesNotThrow(function() { obj.splice(0,2,1,2); });
assertDoesNotThrow(function() { obj.splice(1,2,1,2); });
// Count of items to delete is clamped by length.
assertDoesNotThrow(function() { obj.splice(1,2000,1,2); });
assertThrows(function() { obj.splice(0,0,1); }, TypeError);
assertThrows(function() { obj.splice(1,2000,1,2,3); }, TypeError);
// Test that the enumerable attribute is unperturbed by sealing.
obj = { x: 42, y: 'foo' };
Object.defineProperty(obj, 'y', {enumerable: false});
Object.seal(obj);
assertTrue(Object.isSealed(obj));
assertFalse(Object.isFrozen(obj));
desc = Object.getOwnPropertyDescriptor(obj, 'x');
assertTrue(desc.enumerable);
desc = Object.getOwnPropertyDescriptor(obj, 'y');
assertFalse(desc.enumerable);
// Fast properties should remain fast
obj = { x: 42, y: 'foo' };
assertTrue(%HasFastProperties(obj));
Object.seal(obj);
assertTrue(Object.isSealed(obj));
assertFalse(Object.isFrozen(obj));
assertTrue(%HasFastProperties(obj));
// Sealed objects should share maps where possible
obj = { prop1: 1, prop2: 2 };
obj2 = { prop1: 3, prop2: 4 };
assertTrue(%HaveSameMap(obj, obj2));
Object.seal(obj);
Object.seal(obj2);
assertTrue(Object.isSealed(obj));
assertTrue(Object.isSealed(obj2));
assertFalse(Object.isFrozen(obj));
assertFalse(Object.isFrozen(obj2));
assertTrue(%HaveSameMap(obj, obj2));
// Sealed objects should share maps even when they have elements
obj = { prop1: 1, prop2: 2, 75: 'foo' };
obj2 = { prop1: 3, prop2: 4, 150: 'bar' };
assertTrue(%HaveSameMap(obj, obj2));
Object.seal(obj);
Object.seal(obj2);
assertTrue(Object.isSealed(obj));
assertTrue(Object.isSealed(obj2));
assertFalse(Object.isFrozen(obj));
assertFalse(Object.isFrozen(obj));
assertTrue(%HaveSameMap(obj, obj2));
// Setting elements after sealing should not be allowed
obj = { prop: 'thing' };
Object.seal(obj);
assertTrue(Object.isSealed(obj));
assertFalse(Object.isFrozen(obj));
obj[0] = 'hello';
assertFalse(obj.hasOwnProperty(0));
// Sealing an object in dictionary mode should work
// Also testing that getter/setter properties work after sealing
obj = { };
for (var i = 0; i < 100; ++i) {
obj['x' + i] = i;
}
var accessorDidRun = false;
Object.defineProperty(obj, 'accessor', {
get: function() { return 42 },
set: function() { accessorDidRun = true },
configurable: true,
enumerable: true
});
assertFalse(%HasFastProperties(obj));
Object.seal(obj);
assertFalse(%HasFastProperties(obj));
assertTrue(Object.isSealed(obj));
assertFalse(Object.isFrozen(obj));
assertFalse(Object.isExtensible(obj));
for (var i = 0; i < 100; ++i) {
desc = Object.getOwnPropertyDescriptor(obj, 'x' + i);
assertFalse(desc.configurable);
}
assertEquals(42, obj.accessor);
assertFalse(accessorDidRun);
obj.accessor = 'ignored value';
assertTrue(accessorDidRun);
// Sealing arguments should work
var func = function(arg) {
Object.seal(arguments);
assertTrue(Object.isSealed(arguments));
};
func('hello', 'world');
func('goodbye', 'world');
// Sealing sparse arrays
var sparseArr = [0, 1];
sparseArr[10000] = 10000;
Object.seal(sparseArr);
assertTrue(Object.isSealed(sparseArr));
// Accessors on fast object should behavior properly after sealing
obj = {};
Object.defineProperty(obj, 'accessor', {
get: function() { return 42 },
set: function() { accessorDidRun = true },
configurable: true,
enumerable: true
});
assertTrue(%HasFastProperties(obj));
Object.seal(obj);
assertTrue(Object.isSealed(obj));
assertTrue(%HasFastProperties(obj));
assertEquals(42, obj.accessor);
accessorDidRun = false;
obj.accessor = 'ignored value';
assertTrue(accessorDidRun);
// Test for regression in mixed accessor/data property objects.
// The strict function is one such object.
assertTrue(Object.isSealed(Object.seal(function(){"use strict";})));
// Also test a simpler case
obj = {};
Object.defineProperty(obj, 'accessor2', {
get: function() { return 42 },
set: function() { accessorDidRun = true },
configurable: true,
enumerable: true
});
obj.data = 'foo';
assertTrue(%HasFastProperties(obj));
Object.seal(obj);
assertTrue(%HasFastProperties(obj));
assertTrue(Object.isSealed(obj));
function Sealed() {}
Object.seal(Sealed);
assertDoesNotThrow(function() { return new Sealed(); });
Sealed.prototype.prototypeExists = true;
assertTrue((new Sealed()).prototypeExists);

View File

@ -1,5 +0,0 @@
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --expose-natives-as 1

View File

@ -4,7 +4,10 @@
// Environment Variables: LC_ALL=pt-BR.UTF8 // Environment Variables: LC_ALL=pt-BR.UTF8
// The data files packaged with d8 currently have Brazillian Portuguese
// DateTimeFormat but not Collation
if (this.Intl) { if (this.Intl) {
assertEquals('pt-BR', Intl.Collator().resolvedOptions().locale); assertEquals('pt', Intl.Collator().resolvedOptions().locale);
assertEquals('pt-BR', Intl.DateTimeFormat().resolvedOptions().locale); assertEquals('pt-BR', Intl.DateTimeFormat().resolvedOptions().locale);
} }

View File

@ -20,5 +20,4 @@ assertEquals(o51.length, 39);
// Sort triggers the bug. // Sort triggers the bug.
o51.sort(); o51.sort();
// TODO(chromium:897512): The length should be 39. assertEquals(o51.length, 39);
assertEquals(o51.length, 101);

View File

@ -26,5 +26,5 @@ try {
} catch(e) { print("Caught: " + e); } } catch(e) { print("Caught: " + e); }
try { try {
var obj = {prop: 7}; var obj = {prop: 7};
assertThrows("nonexistant(obj)"); assertThrows("nonexistent(obj)");
} catch(e) { print("Caught: " + e); } } catch(e) { print("Caught: " + e); }

View File

@ -1,308 +0,0 @@
# Copyright 2008 the V8 project authors. All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from collections import OrderedDict
import itertools
import os
import re
from testrunner.local import statusfile
from testrunner.local import testsuite
from testrunner.objects import testcase
from testrunner.outproc import base as outproc
FILES_PATTERN = re.compile(r"//\s+Files:(.*)")
ENV_PATTERN = re.compile(r"//\s+Environment Variables:(.*)")
SELF_SCRIPT_PATTERN = re.compile(r"//\s+Env: TEST_FILE_NAME")
MODULE_PATTERN = re.compile(r"^// MODULE$", flags=re.MULTILINE)
NO_HARNESS_PATTERN = re.compile(r"^// NO HARNESS$", flags=re.MULTILINE)
# Flags known to misbehave when combining arbitrary mjsunit tests. Can also
# be compiled regular expressions.
COMBINE_TESTS_FLAGS_BLACKLIST = [
'--check-handle-count',
'--enable-tracing',
re.compile('--experimental.*'),
'--expose-trigger-failure',
re.compile('--harmony.*'),
'--mock-arraybuffer-allocator',
'--print-ast',
re.compile('--trace.*'),
'--wasm-lazy-compilation',
]
class TestSuite(testsuite.TestSuite):
def ListTests(self):
tests = []
for dirname, dirs, files in os.walk(self.root, followlinks=True):
for dotted in [x for x in dirs if x.startswith('.')]:
dirs.remove(dotted)
dirs.sort()
files.sort()
for filename in files:
if (filename.endswith(".js") and
filename != "mjsunit.js" and
filename != "mjsunit_suppressions.js"):
fullpath = os.path.join(dirname, filename)
relpath = fullpath[len(self.root) + 1 : -3]
testname = relpath.replace(os.path.sep, "/")
test = self._create_test(testname)
tests.append(test)
return tests
def _test_combiner_class(self):
return TestCombiner
def _test_class(self):
return TestCase
def _suppressed_test_class(self):
return SuppressedTestCase
class TestCase(testcase.D8TestCase):
def __init__(self, *args, **kwargs):
super(TestCase, self).__init__(*args, **kwargs)
source = self.get_source()
files_list = [] # List of file names to append to command arguments.
files_match = FILES_PATTERN.search(source);
# Accept several lines of 'Files:'.
while True:
if files_match:
files_list += files_match.group(1).strip().split()
files_match = FILES_PATTERN.search(source, files_match.end())
else:
break
files = [ os.path.normpath(os.path.join(self.suite.root, '..', '..', f))
for f in files_list ]
testfilename = os.path.join(self.suite.root,
self.path + self._get_suffix())
if SELF_SCRIPT_PATTERN.search(source):
files = (
["-e", "TEST_FILE_NAME=\"%s\"" % testfilename.replace("\\", "\\\\")] +
files)
if NO_HARNESS_PATTERN.search(source):
mjsunit_files = []
else:
mjsunit_files = [os.path.join(self.suite.root, "mjsunit.js")]
files_suffix = []
if MODULE_PATTERN.search(source):
files_suffix.append("--module")
files_suffix.append(testfilename)
self._source_files = files
self._source_flags = self._parse_source_flags(source)
self._mjsunit_files = mjsunit_files
self._files_suffix = files_suffix
self._env = self._parse_source_env(source)
def _parse_source_env(self, source):
env_match = ENV_PATTERN.search(source)
env = {}
if env_match:
for env_pair in env_match.group(1).strip().split():
var, value = env_pair.split('=')
env[var] = value
return env
def _get_source_flags(self):
return self._source_flags
def _get_files_params(self):
files = list(self._source_files)
if not self._test_config.no_harness:
files += self._mjsunit_files
files += self._files_suffix
if self._test_config.isolates:
files += ['--isolate'] + files
return files
def _get_cmd_env(self):
return self._env
def _get_source_path(self):
return os.path.join(self.suite.root, self.path + self._get_suffix())
class TestCombiner(testsuite.TestCombiner):
def get_group_key(self, test):
"""Combine tests with the same set of flags.
Ignore:
1. Some special cases where it's not obvious what to pass in the command.
2. Tests with flags that can cause failure even inside try-catch wrapper.
3. Tests that use async functions. Async functions can be scheduled after
exiting from try-catch wrapper and cause failure.
"""
if (len(test._files_suffix) > 1 or
test._env or
not test._mjsunit_files or
test._source_files):
return None
source_flags = test._get_source_flags()
if ('--expose-trigger-failure' in source_flags or
'--throws' in source_flags):
return None
source_code = test.get_source()
# Maybe we could just update the tests to await all async functions they
# call?
if 'async' in source_code:
return None
# TODO(machenbach): Remove grouping if combining tests in a flag-independent
# way works well.
return 1
def _combined_test_class(self):
return CombinedTest
class CombinedTest(testcase.D8TestCase):
"""Behaves like normal mjsunit tests except:
1. Expected outcome is always PASS
2. Instead of one file there is a try-catch wrapper with all combined tests
passed as arguments.
"""
def __init__(self, name, tests):
super(CombinedTest, self).__init__(tests[0].suite, '', name,
tests[0]._test_config)
self._tests = tests
def _prepare_outcomes(self, force_update=True):
self._statusfile_outcomes = outproc.OUTCOMES_PASS_OR_TIMEOUT
self.expected_outcomes = outproc.OUTCOMES_PASS_OR_TIMEOUT
def _get_shell_flags(self):
"""In addition to standard set of shell flags it appends:
--disable-abortjs: %AbortJS can abort the test even inside
trycatch-wrapper, so we disable it.
--es-staging: We blacklist all harmony flags due to false positives,
but always pass the staging flag to cover the mature features.
--omit-quit: Calling quit() in JS would otherwise early terminate.
--quiet-load: suppress any stdout from load() function used by
trycatch-wrapper.
"""
return [
'--test',
'--disable-abortjs',
'--es-staging',
'--omit-quit',
'--quiet-load',
]
def _get_cmd_params(self):
return (
super(CombinedTest, self)._get_cmd_params() +
['tools/testrunner/trycatch_loader.js', '--'] +
self._tests[0]._mjsunit_files +
['--'] +
[t._files_suffix[0] for t in self._tests]
)
def _merge_flags(self, flags):
"""Merges flags from a list of flags.
Flag values not starting with '-' are merged with the preceeding flag,
e.g. --foo 1 will become --foo=1. All other flags remain the same.
Returns: A generator of flags.
"""
if not flags:
return
# Iterate over flag pairs. ['-'] is a sentinel value for the last iteration.
for flag1, flag2 in itertools.izip(flags, flags[1:] + ['-']):
if not flag2.startswith('-'):
assert '=' not in flag1
yield flag1 + '=' + flag2
elif flag1.startswith('-'):
yield flag1
def _is_flag_blacklisted(self, flag):
for item in COMBINE_TESTS_FLAGS_BLACKLIST:
if isinstance(item, basestring):
if item == flag:
return True
elif item.match(flag):
return True
return False
def _get_combined_flags(self, flags_gen):
"""Combines all flags - dedupes, keeps order and filters some flags.
Args:
flags_gen: Generator for flag lists.
Returns: A list of flags.
"""
merged_flags = self._merge_flags(list(itertools.chain(*flags_gen)))
unique_flags = OrderedDict((flag, True) for flag in merged_flags).keys()
return [
flag for flag in unique_flags
if not self._is_flag_blacklisted(flag)
]
def _get_source_flags(self):
# Combine flags from all source files.
return self._get_combined_flags(
test._get_source_flags() for test in self._tests)
def _get_statusfile_flags(self):
# Combine flags from all status file entries.
return self._get_combined_flags(
test._get_statusfile_flags() for test in self._tests)
class SuppressedTestCase(TestCase):
"""The same as a standard mjsunit test case with all asserts as no-ops."""
def __init__(self, *args, **kwargs):
super(SuppressedTestCase, self).__init__(*args, **kwargs)
self._mjsunit_files.append(
os.path.join(self.suite.root, "mjsunit_suppressions.js"))
def _prepare_outcomes(self, *args, **kwargs):
super(SuppressedTestCase, self)._prepare_outcomes(*args, **kwargs)
# Skip tests expected to fail. We suppress all asserts anyways, but some
# tests are expected to fail with type errors or even dchecks, and we
# can't differentiate that.
if statusfile.FAIL in self._statusfile_outcomes:
self._statusfile_outcomes = [statusfile.SKIP]
def _get_extra_flags(self, *args, **kwargs):
return (
super(SuppressedTestCase, self)._get_extra_flags(*args, **kwargs) +
['--disable-abortjs']
)
def GetSuite(*args, **kwargs):
return TestSuite(*args, **kwargs)

View File

@ -9,8 +9,11 @@
'table/grow': [FAIL], 'table/grow': [FAIL],
'table/get-set': [FAIL], 'table/get-set': [FAIL],
'module/customSections': [FAIL], 'module/customSections': [FAIL],
'global/constructor': [FAIL], }], # ALWAYS
'global/value-get-set': [FAIL],
[ALWAYS, {
# https://bugs.chromium.org/p/v8/issues/detail?id=8633
'limits': [SKIP],
}], # ALWAYS }], # ALWAYS
['arch == s390 or arch == s390x or system == aix', { ['arch == s390 or arch == s390x or system == aix', {
@ -18,4 +21,10 @@
'instance/constructor': [SKIP], 'instance/constructor': [SKIP],
}], # 'arch == s390 or arch == s390x or system == aix' }], # 'arch == s390 or arch == s390x or system == aix'
##############################################################################
['lite_mode', {
# TODO(v8:7777): Re-enable once wasm is supported in jitless mode.
'*': [SKIP],
}], # lite_mode
] ]