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