mirror of https://github.com/lukechilds/node.git
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
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);
|
|
}
|
|
}
|
|
})();
|
|
|