blob: e76af1bfc60f12665c1009c3226bed71f078b85c [file] [log] [blame]
// 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);
}
}
})();