diff options
Diffstat (limited to 'js/src/jit-test/tests/arguments/args-attributes.js')
-rw-r--r-- | js/src/jit-test/tests/arguments/args-attributes.js | 75 |
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 000000000..518220237 --- /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); +} |