Home | History | Annotate | Download | only in strong
      1 // Copyright 2015 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Flags: --strong-mode --allow-natives-syntax
      6 
      7 // TODO(conradw): Track implementation of strong bit for other objects, add
      8 // tests.
      9 
     10 function getSloppyObjects() {
     11   return [(function(){}), ({})];
     12 }
     13 
     14 function getStrictObjects() {
     15   "use strict";
     16   return [(function(){}), ({})];
     17 }
     18 
     19 function getStrongObjects() {
     20   "use strong";
     21   // Strong functions can't have properties added to them.
     22   return [{}];
     23 }
     24 
     25 (function testStrongObjectFreezePropValid() {
     26   "use strict";
     27   let strongObjects = getStrongObjects();
     28 
     29   for (let o of strongObjects) {
     30     Object.defineProperty(o, "foo", { configurable: true, writable: true });
     31     assertDoesNotThrow(
     32       function() {
     33         "use strong";
     34         Object.defineProperty(o, "foo", {configurable: true, writable: false });
     35       });
     36   }
     37 })();
     38 
     39 (function testStrongObjectFreezePropInvalid() {
     40   "use strict";
     41   let sloppyObjects = getSloppyObjects();
     42   let strictObjects = getStrictObjects();
     43   let strongObjects = getStrongObjects();
     44   let weakObjects = sloppyObjects.concat(strictObjects);
     45 
     46   for (let o of weakObjects) {
     47     Object.defineProperty(o, "foo", { writable: true });
     48     assertDoesNotThrow(
     49       function() {
     50         "use strong";
     51         Object.defineProperty(o, "foo", { writable: false });
     52       });
     53   }
     54   for (let o of strongObjects) {
     55     function defProp(o) {
     56       Object.defineProperty(o, "foo", { writable: false });
     57     }
     58     function defProps(o) {
     59       Object.defineProperties(o, { "foo": { writable: false } });
     60     }
     61     function freezeProp(o) {
     62       Object.freeze(o);
     63     }
     64     Object.defineProperty(o, "foo", { writable: true });
     65     for (let func of [defProp, defProps, freezeProp]) {
     66       assertThrows(function(){func(o)}, TypeError);
     67       assertThrows(function(){func(o)}, TypeError);
     68       assertThrows(function(){func(o)}, TypeError);
     69       %OptimizeFunctionOnNextCall(func);
     70       assertThrows(function(){func(o)}, TypeError);
     71       %DeoptimizeFunction(func);
     72       assertThrows(function(){func(o)}, TypeError);
     73     }
     74   }
     75 })();
     76