| // 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); |
| } |
| } |
| })(); |