diff options
Diffstat (limited to 'js/src/tests/test262/ch13/13.2/S13.2.3_A1.js')
-rw-r--r-- | js/src/tests/test262/ch13/13.2/S13.2.3_A1.js | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/js/src/tests/test262/ch13/13.2/S13.2.3_A1.js b/js/src/tests/test262/ch13/13.2/S13.2.3_A1.js new file mode 100644 index 000000000..3cee5115b --- /dev/null +++ b/js/src/tests/test262/ch13/13.2/S13.2.3_A1.js @@ -0,0 +1,61 @@ +// Copyright 2011 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/** + * @path ch13/13.2/S13.2.3_A1.js + * @description check that strict mode functions/arguments have + * [[ThrowTypeError]]-like behavior + * function object. + * @onlyStrict + */ + +"use strict"; +var poison = Object.getOwnPropertyDescriptor(Function.prototype, 'caller').get; + +if (typeof poison !== 'function') { + $ERROR("#1: A strict function's .caller should be poisoned with a function"); +} +var threw = null; +try { + poison.call(function() {}); +} catch (err) { + threw = err; +} +if (!threw || !(threw instanceof TypeError)) { + $ERROR("#2: Poisoned property should throw TypeError"); +} + +function checkNotPresent(obj, name) { + var desc = Object.getOwnPropertyDescriptor(obj, name); + if (desc !== undefined) { + $ERROR("#3: " + name + " should not appear as a descriptor"); + } +} + +var argumentsPoison = + Object.getOwnPropertyDescriptor(function() { return arguments; }(), + "callee").get; + +function checkPoison(obj, name) { + var desc = Object.getOwnPropertyDescriptor(obj, name); + if (desc.enumerable) { + $ERROR("#3: Poisoned " + name + " should not be enumerable"); + } + if (desc.configurable) { + $ERROR("#4: Poisoned " + name + " should not be configurable"); + } + if (argumentsPoison !== desc.get) { + $ERROR("#5: " + name + "'s getter not poisoned with same poison"); + } + if (argumentsPoison !== desc.set) { + $ERROR("#6: " + name + "'s setter not poisoned with same poison"); + } +} + +checkNotPresent(function() {}, 'caller'); +checkNotPresent(function() {}, 'arguments'); +checkPoison((function() { return arguments; })(), 'caller'); +checkPoison((function() { return arguments; })(), 'callee'); +checkNotPresent((function() {}).bind(null), 'caller'); +checkNotPresent((function() {}).bind(null), 'arguments'); + |