mirror of
				https://github.com/tc39/test262.git
				synced 2025-11-04 05:33:50 +01:00 
			
		
		
		
	[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:
		
							parent
							
								
									5331ca05a2
								
							
						
					
					
						commit
						6bb8f41e0a
					
				@ -27,8 +27,12 @@
 | 
			
		||||
 | 
			
		||||
[
 | 
			
		||||
[ALWAYS, {
 | 
			
		||||
  # TODO(jochen): The following test is flaky.
 | 
			
		||||
# TODO(jochen): The following test is flaky.
 | 
			
		||||
  '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
 | 
			
		||||
 | 
			
		||||
['variant == no_wasm_traps', {
 | 
			
		||||
 | 
			
		||||
@ -86,9 +86,7 @@ assertThrows(
 | 
			
		||||
    }),
 | 
			
		||||
    Error);
 | 
			
		||||
 | 
			
		||||
// These don't throw yet, we need to implement language/script/region
 | 
			
		||||
// override logic first.
 | 
			
		||||
assertDoesNotThrow(
 | 
			
		||||
assertThrows(
 | 
			
		||||
    () => new Intl.Locale('en-US', {
 | 
			
		||||
      get language() {
 | 
			
		||||
        throw new Error('foo');
 | 
			
		||||
@ -96,7 +94,7 @@ assertDoesNotThrow(
 | 
			
		||||
    }),
 | 
			
		||||
    Error);
 | 
			
		||||
 | 
			
		||||
assertDoesNotThrow(
 | 
			
		||||
assertThrows(
 | 
			
		||||
    () => new Intl.Locale('en-US', {
 | 
			
		||||
      get script() {
 | 
			
		||||
        throw new Error('foo');
 | 
			
		||||
@ -104,7 +102,7 @@ assertDoesNotThrow(
 | 
			
		||||
    }),
 | 
			
		||||
    Error);
 | 
			
		||||
 | 
			
		||||
assertDoesNotThrow(
 | 
			
		||||
assertThrows(
 | 
			
		||||
    () => new Intl.Locale('en-US', {
 | 
			
		||||
      get region() {
 | 
			
		||||
        throw new Error('foo');
 | 
			
		||||
 | 
			
		||||
@ -13,10 +13,15 @@ assertEquals('long', rtf.resolvedOptions().style);
 | 
			
		||||
assertEquals('always', rtf.resolvedOptions().numeric);
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
assertEquals(3, Object.getOwnPropertyNames(new Intl.RelativeTimeFormat('en').resolvedOptions()).length);
 | 
			
		||||
assertEquals(
 | 
			
		||||
    4,
 | 
			
		||||
    Object.getOwnPropertyNames(
 | 
			
		||||
        new Intl.RelativeTimeFormat("en").resolvedOptions()
 | 
			
		||||
    ).length
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
assertEquals(
 | 
			
		||||
    'short',
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
// found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// 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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -141,15 +141,15 @@ try {
 | 
			
		||||
}
 | 
			
		||||
assertTrue(caught);
 | 
			
		||||
 | 
			
		||||
caught = false
 | 
			
		||||
try {
 | 
			
		||||
  (function() {
 | 
			
		||||
    {
 | 
			
		||||
      let x = 1;
 | 
			
		||||
      eval('{ function x() {} }');
 | 
			
		||||
    }
 | 
			
		||||
  })();
 | 
			
		||||
} catch (e) {
 | 
			
		||||
  caught = true;
 | 
			
		||||
}
 | 
			
		||||
assertFalse(caught);
 | 
			
		||||
// See ES#sec-web-compat-evaldeclarationinstantiation. Sloppy block functions
 | 
			
		||||
// inside of blocks in eval behave similar to regular sloppy block 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
 | 
			
		||||
// var declaration syntax error, and hence the var isn't introduced.
 | 
			
		||||
(function() {
 | 
			
		||||
  {
 | 
			
		||||
    let x = 1;
 | 
			
		||||
    eval('{ function x() {} }');
 | 
			
		||||
    assertEquals(1, x);
 | 
			
		||||
  }
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
@ -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();
 | 
			
		||||
@ -2,6 +2,8 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style license that can be
 | 
			
		||||
// found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Flags: --noasync-stack-traces
 | 
			
		||||
 | 
			
		||||
async function test(func, funcs) {
 | 
			
		||||
  try {
 | 
			
		||||
    await func();
 | 
			
		||||
@ -81,21 +83,19 @@ async function runTests() {
 | 
			
		||||
    try { await reject(); } catch (e) { throw new Error("FAIL"); }
 | 
			
		||||
  } }).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") },
 | 
			
		||||
             ["test", "test", "runTests"]);
 | 
			
		||||
             ["test", "runTests"]);
 | 
			
		||||
  await test(async() => { throw new Error("FAIL") },
 | 
			
		||||
             ["test", "test", "runTests"]);
 | 
			
		||||
             ["test", "runTests"]);
 | 
			
		||||
  await test(async(a) => { throw new Error("FAIL") },
 | 
			
		||||
             ["test", "test", "runTests"]);
 | 
			
		||||
             ["test", "runTests"]);
 | 
			
		||||
  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() => { await 1; throw new Error("FAIL") }, ["test"]);
 | 
			
		||||
  await test(async(a) => { await 1; throw new Error("FAIL") }, ["test"]);
 | 
			
		||||
  await test(async(a, b) => { 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") }, []);
 | 
			
		||||
  await test(async(a) => { await 1; throw new Error("FAIL") }, []);
 | 
			
		||||
  await test(async(a, b) => { await 1; throw new Error("FAIL") }, []);
 | 
			
		||||
 | 
			
		||||
  await test(async x => {
 | 
			
		||||
    await 1;
 | 
			
		||||
@ -104,7 +104,7 @@ async function runTests() {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new Error("FAIL");
 | 
			
		||||
    }
 | 
			
		||||
  }, ["test"]);
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  await test(async() => {
 | 
			
		||||
    await 1;
 | 
			
		||||
@ -113,7 +113,7 @@ async function runTests() {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new Error("FAIL");
 | 
			
		||||
    }
 | 
			
		||||
  }, ["test"]);
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  await test(async(a) => {
 | 
			
		||||
    await 1;
 | 
			
		||||
@ -122,7 +122,7 @@ async function runTests() {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new Error("FAIL");
 | 
			
		||||
    }
 | 
			
		||||
  }, ["test"]);
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  await test(async(a, b) => {
 | 
			
		||||
    await 1;
 | 
			
		||||
@ -131,7 +131,7 @@ async function runTests() {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new Error("FAIL");
 | 
			
		||||
    }
 | 
			
		||||
  }, ["test"]);
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  await test(async x => {
 | 
			
		||||
    await 1;
 | 
			
		||||
@ -140,7 +140,7 @@ async function runTests() {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new Error("FAIL");
 | 
			
		||||
    }
 | 
			
		||||
  }, ["test"]);
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  await test(async() => {
 | 
			
		||||
    await 1;
 | 
			
		||||
@ -149,7 +149,7 @@ async function runTests() {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new Error("FAIL");
 | 
			
		||||
    }
 | 
			
		||||
  }, ["test"]);
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  await test(async(a) => {
 | 
			
		||||
    await 1;
 | 
			
		||||
@ -158,7 +158,7 @@ async function runTests() {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new Error("FAIL");
 | 
			
		||||
    }
 | 
			
		||||
  }, ["test"]);
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  await test(async(a, b) => {
 | 
			
		||||
    await 1;
 | 
			
		||||
@ -167,7 +167,7 @@ async function runTests() {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new Error("FAIL");
 | 
			
		||||
    }
 | 
			
		||||
  }, ["test"]);
 | 
			
		||||
  }, []);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
runTests().catch(e => {
 | 
			
		||||
 | 
			
		||||
@ -53,9 +53,9 @@ assertEquals(
 | 
			
		||||
    {value: "Module", configurable: false, writable: false, enumerable: false},
 | 
			
		||||
    Reflect.getOwnPropertyDescriptor(foo, Symbol.toStringTag));
 | 
			
		||||
 | 
			
		||||
// Nonexistant properties.
 | 
			
		||||
let nonexistant = ["gaga", 123, Symbol('')];
 | 
			
		||||
for (let key of nonexistant) {
 | 
			
		||||
// Nonexistent properties.
 | 
			
		||||
let nonexistent = ["gaga", 123, Symbol('')];
 | 
			
		||||
for (let key of nonexistent) {
 | 
			
		||||
  assertSame(undefined, Reflect.getOwnPropertyDescriptor(foo, key));
 | 
			
		||||
  assertTrue(Reflect.deleteProperty(foo, key));
 | 
			
		||||
  assertFalse(Reflect.set(foo, key, true));
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
@ -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
 | 
			
		||||
@ -4,7 +4,10 @@
 | 
			
		||||
 | 
			
		||||
// Environment Variables: LC_ALL=pt-BR.UTF8
 | 
			
		||||
 | 
			
		||||
// The data files packaged with d8 currently have Brazillian Portuguese
 | 
			
		||||
// DateTimeFormat but not Collation
 | 
			
		||||
 | 
			
		||||
if (this.Intl) {
 | 
			
		||||
  assertEquals('pt-BR', Intl.Collator().resolvedOptions().locale);
 | 
			
		||||
  assertEquals('pt', Intl.Collator().resolvedOptions().locale);
 | 
			
		||||
  assertEquals('pt-BR', Intl.DateTimeFormat().resolvedOptions().locale);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -20,5 +20,4 @@ assertEquals(o51.length, 39);
 | 
			
		||||
// Sort triggers the bug.
 | 
			
		||||
o51.sort();
 | 
			
		||||
 | 
			
		||||
// TODO(chromium:897512): The length should be 39.
 | 
			
		||||
assertEquals(o51.length, 101);
 | 
			
		||||
assertEquals(o51.length, 39);
 | 
			
		||||
 | 
			
		||||
@ -26,5 +26,5 @@ try {
 | 
			
		||||
} catch(e) { print("Caught: " + e); }
 | 
			
		||||
try {
 | 
			
		||||
  var obj = {prop: 7};
 | 
			
		||||
  assertThrows("nonexistant(obj)");
 | 
			
		||||
  assertThrows("nonexistent(obj)");
 | 
			
		||||
} catch(e) { print("Caught: " + e); }
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
@ -9,8 +9,11 @@
 | 
			
		||||
  'table/grow': [FAIL],
 | 
			
		||||
  'table/get-set': [FAIL],
 | 
			
		||||
  'module/customSections': [FAIL],
 | 
			
		||||
  'global/constructor': [FAIL],
 | 
			
		||||
  'global/value-get-set': [FAIL],
 | 
			
		||||
}], # ALWAYS
 | 
			
		||||
 | 
			
		||||
[ALWAYS, {
 | 
			
		||||
  # https://bugs.chromium.org/p/v8/issues/detail?id=8633
 | 
			
		||||
  'limits': [SKIP],
 | 
			
		||||
}], # ALWAYS
 | 
			
		||||
 | 
			
		||||
['arch == s390 or arch == s390x or system == aix', {
 | 
			
		||||
@ -18,4 +21,10 @@
 | 
			
		||||
  'instance/constructor': [SKIP],
 | 
			
		||||
}],  # '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
 | 
			
		||||
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user