You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

75 lines
2.1 KiB

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