| Index: test/mjsunit/strict-mode.js
|
| diff --git a/test/mjsunit/strict-mode.js b/test/mjsunit/strict-mode.js
|
| index 20641625ab2a62d420c67b9c3fda6945d33271fb..0a511809d5e5ad64946d2678c481b3a42cbcaec2 100644
|
| --- a/test/mjsunit/strict-mode.js
|
| +++ b/test/mjsunit/strict-mode.js
|
| @@ -976,3 +976,68 @@ repeat(10, function() { testAssignToUndefined(false); });
|
| assertEquals(["c", "d", "a", "b"], strict("a", "b"));
|
| assertEquals(["c", "d", "c", "d"], nonstrict("a", "b"));
|
| })();
|
| +
|
| +
|
| +(function TestStrictFunctionPills() {
|
| + function strict() {
|
| + "use strict";
|
| + }
|
| + assertThrows(function() { strict.caller; }, TypeError);
|
| + assertThrows(function() { strict.arguments; }, TypeError);
|
| +
|
| + var another = new Function("'use strict'");
|
| + assertThrows(function() { another.caller; }, TypeError);
|
| + assertThrows(function() { another.arguments; }, TypeError);
|
| +
|
| + var third = (function() { "use strict"; return function() {}; })();
|
| + assertThrows(function() { third.caller; }, TypeError);
|
| + assertThrows(function() { third.arguments; }, TypeError);
|
| +
|
| + function CheckPill(pill) {
|
| + assertEquals("function", typeof pill);
|
| + assertInstanceof(pill, Function);
|
| + assertThrows(function() { pill.property = "value"; }, TypeError);
|
| + assertThrows(pill, TypeError);
|
| + assertEquals(pill.prototype, (function(){}).prototype);
|
| + var d = Object.getOwnPropertyDescriptor(pill, "prototype");
|
| + assertFalse(d.writable);
|
| + assertFalse(d.configurable);
|
| + assertFalse(d.enumerable);
|
| + }
|
| +
|
| + function CheckPillDescriptor(func, name) {
|
| + var descriptor = Object.getOwnPropertyDescriptor(func, name);
|
| + CheckPill(descriptor.get)
|
| + CheckPill(descriptor.set);
|
| + assertFalse(descriptor.enumerable);
|
| + assertFalse(descriptor.configurable);
|
| + }
|
| +
|
| + CheckPillDescriptor(strict, "caller");
|
| + CheckPillDescriptor(strict, "arguments");
|
| + CheckPillDescriptor(another, "caller");
|
| + CheckPillDescriptor(another, "arguments");
|
| + CheckPillDescriptor(third, "caller");
|
| + CheckPillDescriptor(third, "arguments");
|
| +})();
|
| +
|
| +
|
| +(function TestStrictFunctionWritablePrototype() {
|
| + "use strict";
|
| + function TheClass() {
|
| + }
|
| + assertThrows(function() { TheClass.caller; }, TypeError);
|
| + assertThrows(function() { TheClass.arguments; }, TypeError);
|
| +
|
| + // Strict functions must have writable prototype.
|
| + TheClass.prototype = {
|
| + func: function() { return "func_value"; },
|
| + get accessor() { return "accessor_value"; },
|
| + property: "property_value",
|
| + };
|
| +
|
| + var o = new TheClass();
|
| + assertEquals(o.func(), "func_value");
|
| + assertEquals(o.accessor, "accessor_value");
|
| + assertEquals(o.property, "property_value");
|
| +})();
|
|
|