summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/ch13/13.2/S13.2.3_A1.js
diff options
context:
space:
mode:
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.js61
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');
+