michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: michael@0: /* michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/licenses/publicdomain/ michael@0: */ michael@0: michael@0: function callFunctionBody(expr) { michael@0: return ( michael@0: '(function f() {\n' michael@0: + 'Object.defineProperties(arguments, {1: { writable: false },\n' michael@0: + ' 2: { configurable: false },\n' michael@0: + ' 3: { writable: false,\n' michael@0: + ' configurable: false }});\n' michael@0: + 'return (' + expr + ');\n' michael@0: + '})(0, 1, 2, 3);'); michael@0: } michael@0: michael@0: assertEq(testLenientAndStrict(callFunctionBody('arguments[0] = 42'), michael@0: returns(42), returns(42)), michael@0: true); michael@0: michael@0: assertEq(testLenientAndStrict(callFunctionBody('delete arguments[0]'), michael@0: returns(true), returns(true)), michael@0: true); michael@0: michael@0: michael@0: assertEq(testLenientAndStrict(callFunctionBody('arguments[1] = 42'), michael@0: returns(42), raisesException(TypeError)), michael@0: true); michael@0: michael@0: assertEq(testLenientAndStrict(callFunctionBody('delete arguments[1]'), michael@0: returns(true), returns(true)), michael@0: true); michael@0: michael@0: michael@0: assertEq(testLenientAndStrict(callFunctionBody('arguments[2] = 42'), michael@0: returns(42), returns(42)), michael@0: true); michael@0: michael@0: assertEq(testLenientAndStrict(callFunctionBody('delete arguments[2]'), michael@0: returns(false), raisesException(TypeError)), michael@0: true); michael@0: michael@0: michael@0: assertEq(testLenientAndStrict(callFunctionBody('arguments[3] = 42'), michael@0: returns(42), raisesException(TypeError)), michael@0: true); michael@0: michael@0: assertEq(testLenientAndStrict(callFunctionBody('delete arguments[3]'), michael@0: returns(false), raisesException(TypeError)), michael@0: true); michael@0: michael@0: michael@0: reportCompare(true, true);