summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/arguments/args-attributes.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/arguments/args-attributes.js')
-rw-r--r--js/src/jit-test/tests/arguments/args-attributes.js75
1 files changed, 75 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/arguments/args-attributes.js b/js/src/jit-test/tests/arguments/args-attributes.js
new file mode 100644
index 0000000000..5182202371
--- /dev/null
+++ b/js/src/jit-test/tests/arguments/args-attributes.js
@@ -0,0 +1,75 @@
+function strictArgs() {
+ return (function (a, b, c) {'use strict'; return arguments; })(1, 2);
+}
+
+function normalArgs() {
+ return (function (a, b, c) { return arguments; })(1, 2);
+}
+
+function checkProperty(options, prop, shouldThrow) {
+ var desc, orig;
+ var obj = options.strict ? strictArgs() : normalArgs();
+ var objType = options.strict ? "strict arguments." : "normal arguments.";
+
+ function check() {
+ orig = Object.getOwnPropertyDescriptor(obj, prop);
+
+ var threw = false;
+ try {
+ obj[prop] = obj[prop];
+ }
+ catch (e) {
+ threw = true;
+ }
+ assertEq(threw, shouldThrow, objType + prop + " threw");
+
+ if (orig === undefined) {
+ // The property wasn't defined, so we can skip it.
+ return;
+ }
+
+ desc = Object.getOwnPropertyDescriptor(obj, prop);
+ if ("value" in orig) {
+ assertEq(desc.value, orig.value, objType + prop + " value");
+ } else {
+ assertEq(desc.get, orig.get, objType + prop + " get");
+ assertEq(desc.set, orig.set, objType + prop + " set");
+ }
+ assertEq(desc.writable, orig.writable, objType + prop + " writable");
+ assertEq(desc.enumerable, orig.enumerable, objType + prop + " enumerable");
+ assertEq(desc.configurable, orig.configurable, objType + prop + " configurable");
+ }
+
+ check();
+
+ if (orig && orig.configurable) {
+ if(options.refresh) { obj = options.strict ? strictArgs() : normalArgs(); }
+ Object.defineProperty(obj, prop, {writable: false, enumerable: true});
+ check();
+
+ if(options.refresh) { obj = options.strict ? strictArgs() : normalArgs(); }
+ Object.defineProperty(obj, prop, {writable: true, enumerable: false});
+ check();
+
+ if(options.refresh) { obj = options.strict ? strictArgs() : normalArgs(); }
+ Object.defineProperty(obj, prop, {writable: false, configurable: false});
+ check();
+ }
+}
+
+checkProperty({strict: true, refresh: true}, 'callee', true);
+checkProperty({strict: true, refresh: false}, 'callee', true);
+checkProperty({strict: false, refresh: true}, 'callee', false);
+checkProperty({strict: false, refresh: false}, 'callee', false);
+
+checkProperty({strict: true, refresh: true}, 'length', false);
+checkProperty({strict: true, refresh: false}, 'length', false);
+checkProperty({strict: false, refresh: true}, 'length', false);
+checkProperty({strict: false, refresh: false}, 'length', false);
+
+for (var i = 0; i <= 5; i++) {
+ checkProperty({strict: true, refresh: true}, "" + i, false);
+ checkProperty({strict: true, refresh: false}, "" + i, false);
+ checkProperty({strict: false, refresh: true}, "" + i, false);
+ checkProperty({strict: false, refresh: false}, "" + i, false);
+}