Javascript  |  76行  |  2.13 KB

// 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.

// Flags: --strong-mode --allow-natives-syntax

// TODO(conradw): Track implementation of strong bit for other objects, add
// tests.

function getSloppyObjects() {
  return [(function(){}), ({})];
}

function getStrictObjects() {
  "use strict";
  return [(function(){}), ({})];
}

function getStrongObjects() {
  "use strong";
  // Strong functions can't have properties added to them.
  return [{}];
}

(function testStrongObjectFreezePropValid() {
  "use strict";
  let strongObjects = getStrongObjects();

  for (let o of strongObjects) {
    Object.defineProperty(o, "foo", { configurable: true, writable: true });
    assertDoesNotThrow(
      function() {
        "use strong";
        Object.defineProperty(o, "foo", {configurable: true, writable: false });
      });
  }
})();

(function testStrongObjectFreezePropInvalid() {
  "use strict";
  let sloppyObjects = getSloppyObjects();
  let strictObjects = getStrictObjects();
  let strongObjects = getStrongObjects();
  let weakObjects = sloppyObjects.concat(strictObjects);

  for (let o of weakObjects) {
    Object.defineProperty(o, "foo", { writable: true });
    assertDoesNotThrow(
      function() {
        "use strong";
        Object.defineProperty(o, "foo", { writable: false });
      });
  }
  for (let o of strongObjects) {
    function defProp(o) {
      Object.defineProperty(o, "foo", { writable: false });
    }
    function defProps(o) {
      Object.defineProperties(o, { "foo": { writable: false } });
    }
    function freezeProp(o) {
      Object.freeze(o);
    }
    Object.defineProperty(o, "foo", { writable: true });
    for (let func of [defProp, defProps, freezeProp]) {
      assertThrows(function(){func(o)}, TypeError);
      assertThrows(function(){func(o)}, TypeError);
      assertThrows(function(){func(o)}, TypeError);
      %OptimizeFunctionOnNextCall(func);
      assertThrows(function(){func(o)}, TypeError);
      %DeoptimizeFunction(func);
      assertThrows(function(){func(o)}, TypeError);
    }
  }
})();