[JSC] ES6 Method functions should not have prototype
authorcaitp@igalia.com <caitp@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Oct 2016 12:51:33 +0000 (12:51 +0000)
committercaitp@igalia.com <caitp@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Oct 2016 12:51:33 +0000 (12:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=162530

Reviewed by Saam Barati.

JSTests:

Fix test262 expectations about MethodDefinitions

* ChakraCore/test/strict/05.arguments_sm.baseline-jsc:
* stress/reflect-set.js:
* test262.yaml:

Source/JavaScriptCore:

ECMA-262 only adds "prototype" properties to specific syntactic function forms.
Specific items which do not contain "prototype" include (most) built-in functions (such as Math.pow),
MethodDefinitions which are not either class "constructor" methods or GeneratorMethods, AsyncFunctions,
and ArrowFunctions.

For details, see the following spec text, and the difference between GeneratorMethod evaluation and
the evaluation of other MethodDefinition forms.

- https://tc39.github.io/ecma262/#sec-method-definitions-runtime-semantics-propertydefinitionevaluation
- https://tc39.github.io/ecma262/#sec-arrow-function-definitions-runtime-semantics-evaluation
- https://tc39.github.io/ecmascript-asyncawait/#async-function-instances
- https://tc39.github.io/ecma262/#sec-generator-function-definitions-runtime-semantics-propertydefinitionevaluation

* runtime/Executable.h:
* runtime/JSFunction.cpp:
(JSC::JSFunction::callerGetter):
(JSC::JSFunction::getOwnPropertySlot):
(JSC::JSFunction::deleteProperty):

* bytecompiler/BytecodeGenerator.h:
(JSC::BytecodeGenerator::makeFunction):
* runtime/Executable.h:
* runtime/JSFunction.cpp:
(JSC::JSFunction::getOwnPropertySlot):
(JSC::JSFunction::getOwnNonIndexPropertyNames):
(JSC::JSFunction::put):
(JSC::JSFunction::deleteProperty):
(JSC::JSFunction::defineOwnProperty):
* runtime/JSGlobalObjectFunctions.cpp:
(JSC::globalFuncThrowTypeErrorArgumentsCalleeAndCaller):

LayoutTests:

Update expected error message to no longer indicate "strict mode"
(which is not always true), and add additional tests for the presence
of "caller" and "arguments" on accessor MethodDefinitions.

* js/basic-strict-mode-expected.txt:
* js/caller-property-expected.txt:
* js/class-syntax-method-names-expected.txt:
* js/es6-function-properties-expected.txt:
* js/non-strict-function-properties-expected.txt:
* js/script-tests/caller-property.js:
* js/script-tests/class-syntax-method-names.js:
* js/script-tests/es6-function-properties.js:
(k.get getter):
(k.set setter):
(get checkProperties):
* js/script-tests/non-strict-function-properties.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207461 268f45cc-cd09-0410-ab3c-d52691b4dbfc

19 files changed:
JSTests/ChakraCore/test/strict/05.arguments_sm.baseline-jsc
JSTests/ChangeLog
JSTests/stress/reflect-set.js
JSTests/test262.yaml
LayoutTests/ChangeLog
LayoutTests/js/basic-strict-mode-expected.txt
LayoutTests/js/caller-property-expected.txt
LayoutTests/js/class-syntax-method-names-expected.txt
LayoutTests/js/es6-function-properties-expected.txt
LayoutTests/js/non-strict-function-properties-expected.txt
LayoutTests/js/script-tests/caller-property.js
LayoutTests/js/script-tests/class-syntax-method-names.js
LayoutTests/js/script-tests/es6-function-properties.js
LayoutTests/js/script-tests/non-strict-function-properties.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
Source/JavaScriptCore/runtime/Executable.h
Source/JavaScriptCore/runtime/JSFunction.cpp
Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp

index 498cafe..f123fed 100644 (file)
@@ -18,7 +18,7 @@ arguments.caller:setter       : function () {
     [native code]
 }
 arguments.caller:value        : undefined
-Exception: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-Exception: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-Exception: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-Exception: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+Exception: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+Exception: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+Exception: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+Exception: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
index a57e606..ca831b3 100644 (file)
@@ -1,3 +1,16 @@
+2016-10-18  Caitlin Potter  <caitp@igalia.com>
+
+        [JSC] ES6 Method functions should not have prototype
+        https://bugs.webkit.org/show_bug.cgi?id=162530
+
+        Reviewed by Saam Barati.
+
+        Fix test262 expectations about MethodDefinitions
+
+        * ChakraCore/test/strict/05.arguments_sm.baseline-jsc:
+        * stress/reflect-set.js:
+        * test262.yaml:
+
 2016-10-17  Keith Miller  <keith_miller@apple.com>
 
         Add support for WASM Memory.
index a64c69e..d8d8b94 100644 (file)
@@ -879,10 +879,10 @@ var symbol = Symbol();
 
         shouldThrow(() => {
             Reflect.set(object, 'callee', 'Cappuccino');
-        }, `TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.`);
+        }, `TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.`);
         shouldThrow(() => {
             Reflect.get(object, 'callee');
-        }, `TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.`);
+        }, `TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.`);
     }
 
     function test4() {
index 3b51b60..5aa246f 100644 (file)
 - path: test262/test/built-ins/Function/prototype/Symbol.hasInstance/this-val-not-callable.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/built-ins/Function/prototype/Symbol.hasInstance/this-val-poisoned-prototype.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/built-ins/Function/prototype/Symbol.hasInstance/this-val-poisoned-prototype.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/built-ins/Function/prototype/Symbol.hasInstance/this-val-prototype-non-obj.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/built-ins/Function/prototype/Symbol.hasInstance/this-val-prototype-non-obj.js
 - path: test262/test/language/expressions/object/method-definition/name-property-desc.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/object/method-definition/name-prototype-prop.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/object/method-definition/name-prototype-prop.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/object/method-definition/name-prototype.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/object/method-definition/name-prototype.js
 - path: test262/test/language/statements/class/constructor-inferred-observable-iteration.js
   cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/definition/accessors.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/definition/accessors.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/definition/basics.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/definition/basics.js
 - path: test262/test/language/statements/class/definition/getters-non-configurable-err.js
   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/definition/getters-prop-desc.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/class/definition/getters-prop-desc.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/statements/class/definition/getters-restricted-ids.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/definition/getters-restricted-ids.js
 - path: test262/test/language/statements/class/definition/methods-restricted-properties.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/definition/methods.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/definition/methods.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/definition/numeric-property-names.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/definition/numeric-property-names.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/definition/params-trailing-comma-arguments.js
   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/definition/params-trailing-comma-arguments.js
 - path: test262/test/language/statements/class/definition/setters-non-configurable-err.js
   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/definition/setters-prop-desc.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/class/definition/setters-prop-desc.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/statements/class/definition/setters-restricted-ids.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/definition/setters-restricted-ids.js
index d02a13a..bdd308f 100644 (file)
@@ -1,3 +1,27 @@
+2016-10-18  Caitlin Potter  <caitp@igalia.com>
+
+        [JSC] ES6 Method functions should not have prototype
+        https://bugs.webkit.org/show_bug.cgi?id=162530
+
+        Reviewed by Saam Barati.
+
+        Update expected error message to no longer indicate "strict mode"
+        (which is not always true), and add additional tests for the presence
+        of "caller" and "arguments" on accessor MethodDefinitions.
+
+        * js/basic-strict-mode-expected.txt:
+        * js/caller-property-expected.txt:
+        * js/class-syntax-method-names-expected.txt:
+        * js/es6-function-properties-expected.txt:
+        * js/non-strict-function-properties-expected.txt:
+        * js/script-tests/caller-property.js:
+        * js/script-tests/class-syntax-method-names.js:
+        * js/script-tests/es6-function-properties.js:
+        (k.get getter):
+        (k.set setter):
+        (get checkProperties):
+        * js/script-tests/non-strict-function-properties.js:
+
 2016-10-18  Javier Fernandez  <jfernandez@igalia.com>
 
         [css-grid] Different width of grid container between initial load and refresh
index a305ecc..7dc054c 100644 (file)
@@ -56,18 +56,18 @@ PASS (function (){var a; function f() {'use strict'; delete a;} })() threw excep
 PASS (function(){(function (){var a; function f() {'use strict'; delete a;} })()}) threw exception SyntaxError: Cannot delete unqualified property 'a' in strict mode..
 PASS (function (){'use strict'; with(1){};}) threw exception SyntaxError: 'with' statements are not valid in strict mode..
 PASS (function(){(function (){'use strict'; with(1){};})}) threw exception SyntaxError: 'with' statements are not valid in strict mode..
-PASS (function (){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function (){'use strict'; arguments.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function f(){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function f(){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function f(){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function f(){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function (arg){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function (arg){'use strict'; arguments.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function f(arg){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function f(arg){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function f(arg){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS (function f(arg){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS (function (){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function (){'use strict'; arguments.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function f(){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function f(){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function f(){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function f(){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function (arg){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function (arg){'use strict'; arguments.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function f(arg){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function f(arg){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function f(arg){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS (function f(arg){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS (function a(a){'use strict'; return a+2; })(40) is 42
 PASS var foo = function a(a){'use strict'; return a+2; }; foo(40) is 42
 PASS var o = {foo: function a(a){'use strict'; return a+2; } }; o.foo(40) is 42
index 84815bd..66e3f7b 100644 (file)
@@ -7,25 +7,23 @@ PASS childHasCallerWhenExecutingGlobalCode is false
 PASS childHasCallerWhenCalledWithoutParent is false
 PASS childHasCallerWhenCalledFromWithinParent is true
 PASS nonStrictCaller(nonStrictCallee) is nonStrictCaller
-PASS nonStrictCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS nonStrictCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS strictCaller(nonStrictCallee) threw exception TypeError: Function.caller used to retrieve strict caller.
-PASS strictCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS strictCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS strictTailCaller(nonStrictCallee) is null
-PASS strictTailCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS strictTailCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS nonStrictCaller(boundNonStrictCallee) is nonStrictCaller
-PASS nonStrictCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS nonStrictCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS strictCaller(boundNonStrictCallee) threw exception TypeError: Function.caller used to retrieve strict caller.
-PASS strictCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS strictCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS strictTailCaller(boundNonStrictCallee) is null
-PASS strictTailCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS nonStrictGetter(nonStrictAccessor) is nonStrictGetter
-PASS nonStrictSetter(nonStrictAccessor) is true
-PASS nonStrictGetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS nonStrictSetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS strictGetter(nonStrictAccessor) threw exception TypeError: Function.caller used to retrieve strict caller.
-PASS strictSetter(nonStrictAccessor) threw exception TypeError: Function.caller used to retrieve strict caller.
-PASS strictGetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS strictSetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS strictTailCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS nonStrictGetter(nonStrictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS nonStrictGetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS strictGetter(nonStrictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS strictSetter(nonStrictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS strictGetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS strictSetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS successfullyParsed is true
 
 TEST COMPLETE
index aecfb07..7f14924 100644 (file)
@@ -32,8 +32,8 @@ PASS (class X {static get arguments() {return staticMethodValue;}}).arguments is
 PASS (class X {static get caller() {return staticMethodValue;}}).caller is staticMethodValue
 PASS (class X {static get arguments() {return staticMethodValue;}}).hasOwnProperty('arguments') is true
 PASS (class X {static get caller() {return staticMethodValue;}}).hasOwnProperty('caller') is true
-PASS class X {static caller() {return staticMethodValue;}};X.arguments = function(){} threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
-PASS class X {static arguments() {return staticMethodValue;}}; X.caller = function(){} threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS class X {static caller() {return staticMethodValue;}};X.arguments = function(){} threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
+PASS class X {static arguments() {return staticMethodValue;}}; X.caller = function(){} threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS class X {static caller() {return "";}} X.caller = function(){ return staticMethodValue; };X.caller() is staticMethodValue
 PASS class X {static arguments() {return "";}}; X.arguments = function(){ return staticMethodValue; };X.arguments() is staticMethodValue
 PASS class X {static caller() {return "";}} X["caller"] = function(){ return staticMethodValue; };X.caller() is staticMethodValue
index 7c27413..00a024b 100644 (file)
@@ -7,14 +7,14 @@ a.constructor
 PASS 'length,name,prototype':::'length,name,prototype'
 (new A()).constructor
 PASS 'length,name,prototype':::'length,name,prototype'
-PASS a.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS a.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS a.constructor.hasOwnProperty("caller"):::false
 PASS a.constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(a.constructor, "caller"):::undefined
@@ -23,14 +23,14 @@ PASS delete a.constructor.caller:::true
 PASS delete a.constructor["caller"]:::true
 PASS delete a.constructor.arguments:::true
 PASS delete a.constructor["arguments"]:::true
-PASS a.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS a.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS a.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS a.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS a.constructor.hasOwnProperty("caller"):::false
 PASS a.constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(a.constructor, "caller"):::undefined
@@ -39,14 +39,14 @@ PASS delete a.constructor.caller:::true
 PASS delete a.constructor["caller"]:::true
 PASS delete a.constructor.arguments:::true
 PASS delete a.constructor["arguments"]:::true
-PASS (new A()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new A()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new A()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new A()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new A()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new A()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new A()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new A()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (new A()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new A()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new A()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new A()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new A()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new A()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new A()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new A()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new A()).constructor.hasOwnProperty("caller"):::false
 PASS (new A()).constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new A()).constructor, "caller"):::undefined
@@ -59,14 +59,14 @@ b.constructor
 PASS 'length,name,prototype':::'length,name,prototype'
 (new B()).constructor
 PASS 'length,name,prototype':::'length,name,prototype'
-PASS b.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS b.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS b.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS b.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS b.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS b.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS b.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS b.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS b.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS b.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS b.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS b.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS b.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS b.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS b.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS b.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS b.constructor.hasOwnProperty("caller"):::false
 PASS b.constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(b.constructor, "caller"):::undefined
@@ -75,14 +75,14 @@ PASS delete b.constructor.caller:::true
 PASS delete b.constructor["caller"]:::true
 PASS delete b.constructor.arguments:::true
 PASS delete b.constructor["arguments"]:::true
-PASS (new B()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new B()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new B()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new B()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new B()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new B()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new B()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new B()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (new B()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new B()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new B()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new B()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new B()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new B()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new B()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new B()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new B()).constructor.hasOwnProperty("caller"):::false
 PASS (new B()).constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new B()).constructor, "caller"):::undefined
@@ -95,14 +95,14 @@ c.constructor
 PASS 'length,name,prototype':::'length,name,prototype'
 (new C()).constructor
 PASS 'length,name,prototype':::'length,name,prototype'
-PASS c.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS c.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS c.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS c.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS c.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS c.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS c.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS c.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS c.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS c.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS c.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS c.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS c.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS c.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS c.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS c.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS c.constructor.hasOwnProperty("caller"):::false
 PASS c.constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(c.constructor, "caller"):::undefined
@@ -111,14 +111,14 @@ PASS delete c.constructor.caller:::true
 PASS delete c.constructor["caller"]:::true
 PASS delete c.constructor.arguments:::true
 PASS delete c.constructor["arguments"]:::true
-PASS (new C()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new C()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new C()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new C()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new C()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new C()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new C()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new C()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (new C()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new C()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new C()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new C()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new C()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new C()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new C()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new C()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new C()).constructor.hasOwnProperty("caller"):::false
 PASS (new C()).constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new C()).constructor, "caller"):::undefined
@@ -131,14 +131,14 @@ c.constructor
 PASS 'length,name,prototype':::'length,name,prototype'
 (new D()).constructor
 PASS 'length,name,prototype':::'length,name,prototype'
-PASS d.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS d.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS d.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS d.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS d.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS d.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS d.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS d.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS d.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS d.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS d.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS d.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS d.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS d.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS d.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS d.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS d.constructor.hasOwnProperty("caller"):::false
 PASS d.constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(d.constructor, "caller"):::undefined
@@ -147,14 +147,14 @@ PASS delete d.constructor.caller:::true
 PASS delete d.constructor["caller"]:::true
 PASS delete d.constructor.arguments:::true
 PASS delete d.constructor["arguments"]:::true
-PASS (new D()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new D()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new D()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new D()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new D()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new D()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new D()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new D()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (new D()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new D()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new D()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new D()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new D()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new D()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new D()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new D()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new D()).constructor.hasOwnProperty("caller"):::false
 PASS (new D()).constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new D()).constructor, "caller"):::undefined
@@ -166,15 +166,15 @@ PASS delete (new D()).constructor["arguments"]:::true
 e.constructor
 PASS 'length,name,prototype':::'length,name,prototype'
 (new E()).getItem
-PASS 'length,name,prototype':::'length,name,prototype'
-PASS e.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS e.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS e.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS e.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS e.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS e.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS e.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS e.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS 'length,name':::'length,name'
+PASS e.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS e.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS e.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS e.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS e.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS e.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS e.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS e.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS e.constructor.hasOwnProperty("caller"):::false
 PASS e.constructor.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(e.constructor, "caller"):::undefined
@@ -183,14 +183,14 @@ PASS delete e.constructor.caller:::true
 PASS delete e.constructor["caller"]:::true
 PASS delete e.constructor.arguments:::true
 PASS delete e.constructor["arguments"]:::true
-PASS (new E()).getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new E()).getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new E()).getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new E()).getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new E()).getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new E()).getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new E()).getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new E()).getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (new E()).getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new E()).getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new E()).getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new E()).getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new E()).getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new E()).getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new E()).getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new E()).getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new E()).getItem.hasOwnProperty("caller"):::false
 PASS (new E()).getItem.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new E()).getItem, "caller"):::undefined
@@ -200,17 +200,17 @@ PASS delete (new E()).getItem["caller"]:::true
 PASS delete (new E()).getItem.arguments:::true
 PASS delete (new E()).getItem["arguments"]:::true
 f.getItem
-PASS 'length,name,prototype':::'length,name,prototype'
+PASS 'length,name':::'length,name'
 f.getElement
-PASS 'length,name,prototype':::'length,name,prototype'
-PASS f.getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS 'length,name':::'length,name'
+PASS f.getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS f.getItem.hasOwnProperty("caller"):::false
 PASS f.getItem.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(f.getItem, "caller"):::undefined
@@ -219,14 +219,14 @@ PASS delete f.getItem.caller:::true
 PASS delete f.getItem["caller"]:::true
 PASS delete f.getItem.arguments:::true
 PASS delete f.getItem["arguments"]:::true
-PASS f.getElement.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getElement.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getElement["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getElement["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getElement.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getElement.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getElement["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS f.getElement["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS f.getElement.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getElement.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getElement["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getElement["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getElement.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getElement.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getElement["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS f.getElement["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS f.getElement.hasOwnProperty("caller"):::false
 PASS f.getElement.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(f.getElement, "caller"):::undefined
@@ -236,17 +236,17 @@ PASS delete f.getElement["caller"]:::true
 PASS delete f.getElement.arguments:::true
 PASS delete f.getElement["arguments"]:::true
 (new F()).getItem
-PASS 'length,name,prototype':::'length,name,prototype'
+PASS 'length,name':::'length,name'
 (new F()).getElement
-PASS 'length,name,prototype':::'length,name,prototype'
-PASS (new F()).getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS 'length,name':::'length,name'
+PASS (new F()).getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new F()).getItem.hasOwnProperty("caller"):::false
 PASS (new F()).getItem.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new F()).getItem, "caller"):::undefined
@@ -255,14 +255,14 @@ PASS delete (new F()).getItem.caller:::true
 PASS delete (new F()).getItem["caller"]:::true
 PASS delete (new F()).getItem.arguments:::true
 PASS delete (new F()).getItem["arguments"]:::true
-PASS (new F()).getElement.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getElement.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getElement["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getElement["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getElement.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getElement.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getElement["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new F()).getElement["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (new F()).getElement.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getElement.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getElement["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getElement["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getElement.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getElement.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getElement["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new F()).getElement["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new F()).getElement.hasOwnProperty("caller"):::false
 PASS (new F()).getElement.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new F()).getElement, "caller"):::undefined
@@ -275,14 +275,14 @@ arr
 PASS 'length,name':::'length,name'
 ()=>{}
 PASS 'length,name':::'length,name'
-PASS arr.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS arr.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS arr["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS arr["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS arr.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS arr.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS arr["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS arr["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS arr.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS arr.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS arr["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS arr["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS arr.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS arr.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS arr["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS arr["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS arr.hasOwnProperty("caller"):::false
 PASS arr.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(arr, "caller"):::undefined
@@ -291,14 +291,14 @@ PASS delete arr.caller:::true
 PASS delete arr["caller"]:::true
 PASS delete arr.arguments:::true
 PASS delete arr["arguments"]:::true
-PASS (()=>{}).caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (()=>{}).arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (()=>{})["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (()=>{})["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (()=>{}).caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (()=>{}).arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (()=>{})["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (()=>{})["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (()=>{}).caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (()=>{}).arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (()=>{})["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (()=>{})["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (()=>{}).caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (()=>{}).arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (()=>{})["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (()=>{})["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (()=>{}).hasOwnProperty("caller"):::false
 PASS (()=>{}).hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((()=>{}), "caller"):::undefined
@@ -311,14 +311,14 @@ PASS g.item.caller:::undefined
 PASS g.item.arguments:::undefined
 PASS (new G()).item.caller:::undefined
 PASS (new G()).item.arguments:::undefined
-PASS H.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS H.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS H["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS H["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS H.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS H.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS H["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS H["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS H.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS H.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS H["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS H["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS H.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS H.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS H["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS H["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS H.hasOwnProperty("caller"):::false
 PASS H.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(H, "caller"):::undefined
@@ -330,17 +330,17 @@ PASS delete H["arguments"]:::true
 PASS h.caller():::"value"
 PASS h.arguments():::"value"
 h.caller
-PASS 'length,name,prototype':::'length,name,prototype'
+PASS 'length,name':::'length,name'
 h.arguments
-PASS 'length,name,prototype':::'length,name,prototype'
-PASS h.caller.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS h.caller.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS h.caller["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS h.caller["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS h.caller.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS h.caller.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS h.caller["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS h.caller["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS 'length,name':::'length,name'
+PASS h.caller.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS h.caller.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS h.caller["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS h.caller["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS h.caller.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS h.caller.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS h.caller["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS h.caller["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS h.caller.hasOwnProperty("caller"):::false
 PASS h.caller.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(h.caller, "caller"):::undefined
@@ -351,14 +351,14 @@ PASS delete h.caller.arguments:::true
 PASS delete h.caller["arguments"]:::true
 PASS (new H()).caller():::"value"
 PASS (new H()).arguments():::"value"
-PASS (new H()).caller.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new H()).caller.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new H()).caller["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new H()).caller["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new H()).caller.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new H()).caller.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new H()).caller["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new H()).caller["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (new H()).caller.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new H()).caller.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new H()).caller["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new H()).caller["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new H()).caller.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new H()).caller.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new H()).caller["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new H()).caller["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new H()).caller.hasOwnProperty("caller"):::false
 PASS (new H()).caller.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new H()).caller, "caller"):::undefined
@@ -371,14 +371,14 @@ J.gen
 PASS 'length,name,prototype':::'length,name,prototype'
 J.get
 PASS 'length,name,prototype':::'length,name,prototype'
-PASS J.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS J.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS J.gen.hasOwnProperty("caller"):::false
 PASS J.gen.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(J.gen, "caller"):::undefined
@@ -387,14 +387,14 @@ PASS delete J.gen.caller:::true
 PASS delete J.gen["caller"]:::true
 PASS delete J.gen.arguments:::true
 PASS delete J.gen["arguments"]:::true
-PASS J.get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS J.get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS J.get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS J.get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS J.get.hasOwnProperty("caller"):::false
 PASS J.get.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(J.get, "caller"):::undefined
@@ -407,14 +407,14 @@ j.gen
 PASS 'length,name,prototype':::'length,name,prototype'
 j.get
 PASS 'length,name,prototype':::'length,name,prototype'
-PASS j.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS j.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS j.gen.hasOwnProperty("caller"):::false
 PASS j.gen.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(j.gen, "caller"):::undefined
@@ -423,14 +423,14 @@ PASS delete j.gen.caller:::true
 PASS delete j.gen["caller"]:::true
 PASS delete j.gen.arguments:::true
 PASS delete j.gen["arguments"]:::true
-PASS j.get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS j.get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS j.get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS j.get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS j.get.hasOwnProperty("caller"):::false
 PASS j.get.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor(j.get, "caller"):::undefined
@@ -443,14 +443,14 @@ PASS delete j.get["arguments"]:::true
 PASS 'length,name,prototype':::'length,name,prototype'
 (new J).get
 PASS 'length,name,prototype':::'length,name,prototype'
-PASS (new J).gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (new J).gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new J).gen.hasOwnProperty("caller"):::false
 PASS (new J).gen.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new J).gen, "caller"):::undefined
@@ -459,14 +459,14 @@ PASS delete (new J).gen.caller:::true
 PASS delete (new J).gen["caller"]:::true
 PASS delete (new J).gen.arguments:::true
 PASS delete (new J).gen["arguments"]:::true
-PASS (new J).get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
-PASS (new J).get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
+PASS (new J).get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS (new J).get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
 PASS (new J).get.hasOwnProperty("caller"):::false
 PASS (new J).get.hasOwnProperty("arguments"):::false
 PASS Object.getOwnPropertyDescriptor((new J).get, "caller"):::undefined
@@ -475,6 +475,78 @@ PASS delete (new J).get.caller:::true
 PASS delete (new J).get["caller"]:::true
 PASS delete (new J).get.arguments:::true
 PASS delete (new J).get["arguments"]:::true
+k.method
+PASS 'length,name':::'length,name'
+PASS k.method.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.method.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.method["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.method["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.method.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.method.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.method["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.method["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.method.hasOwnProperty("caller"):::false
+PASS k.method.hasOwnProperty("arguments"):::false
+PASS Object.getOwnPropertyDescriptor(k.method, "caller"):::undefined
+PASS Object.getOwnPropertyDescriptor(k.method, "arguments"):::undefined
+PASS delete k.method.caller:::true
+PASS delete k.method["caller"]:::true
+PASS delete k.method.arguments:::true
+PASS delete k.method["arguments"]:::true
+k.gen
+PASS 'length,name,prototype':::'length,name,prototype'
+PASS k.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS k.gen.hasOwnProperty("caller"):::false
+PASS k.gen.hasOwnProperty("arguments"):::false
+PASS Object.getOwnPropertyDescriptor(k.gen, "caller"):::undefined
+PASS Object.getOwnPropertyDescriptor(k.gen, "arguments"):::undefined
+PASS delete k.gen.caller:::true
+PASS delete k.gen["caller"]:::true
+PASS delete k.gen.arguments:::true
+PASS delete k.gen["arguments"]:::true
+k.getter
+PASS 'length,name':::'length,name'
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get.hasOwnProperty("caller"):::false
+PASS Object.getOwnPropertyDescriptor(k, 'getter').get.hasOwnProperty("arguments"):::false
+PASS Object.getOwnPropertyDescriptor(Object.getOwnPropertyDescriptor(k, 'getter').get, "caller"):::undefined
+PASS Object.getOwnPropertyDescriptor(Object.getOwnPropertyDescriptor(k, 'getter').get, "arguments"):::undefined
+PASS delete Object.getOwnPropertyDescriptor(k, 'getter').get.caller:::true
+PASS delete Object.getOwnPropertyDescriptor(k, 'getter').get["caller"]:::true
+PASS delete Object.getOwnPropertyDescriptor(k, 'getter').get.arguments:::true
+PASS delete Object.getOwnPropertyDescriptor(k, 'getter').get["arguments"]:::true
+k.setter
+PASS 'length,name':::'length,name'
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set.hasOwnProperty("caller"):::false
+PASS Object.getOwnPropertyDescriptor(k, 'setter').set.hasOwnProperty("arguments"):::false
+PASS Object.getOwnPropertyDescriptor(Object.getOwnPropertyDescriptor(k, 'setter').set, "caller"):::undefined
+PASS Object.getOwnPropertyDescriptor(Object.getOwnPropertyDescriptor(k, 'setter').set, "arguments"):::undefined
+PASS delete Object.getOwnPropertyDescriptor(k, 'setter').set.caller:::true
+PASS delete Object.getOwnPropertyDescriptor(k, 'setter').set["caller"]:::true
+PASS delete Object.getOwnPropertyDescriptor(k, 'setter').set.arguments:::true
+PASS delete Object.getOwnPropertyDescriptor(k, 'setter').set["arguments"]:::true
 PASS successfullyParsed:::true
 
 TEST COMPLETE
index 792896b..0a1fca4 100644 (file)
@@ -19,9 +19,9 @@ PASS foo.arguments is null
 PASS boo("abc")[0] is "abc"
 PASS boo("expected-value")[0] is "expected-value"
 PASS g(f) is g
-PASS doSetCaller(value, false) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS doSetCaller(value, false) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS doSetCaller(value, true).__proto__.caller is value
-PASS doSetArguments(value, false) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
+PASS doSetArguments(value, false) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
 PASS doSetArguments(value, true).__proto__.arguments is value
 PASS successfullyParsed is true
 
index e164e6a..dc5a6d6 100644 (file)
@@ -27,9 +27,9 @@ function nonStrictCaller(x) { return x(); }
 function strictCaller(x) { "use strict"; var result = x(); return result; }
 function strictTailCaller(x) { "use strict"; return x(); }
 shouldBe("nonStrictCaller(nonStrictCallee)", "nonStrictCaller");
-shouldThrow("nonStrictCaller(strictCallee)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."');
+shouldThrow("nonStrictCaller(strictCallee)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
 shouldThrow("strictCaller(nonStrictCallee)");
-shouldThrow("strictCaller(strictCallee)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."');
+shouldThrow("strictCaller(strictCallee)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
 shouldBe("strictTailCaller(nonStrictCallee)", "null");
 shouldThrow("strictTailCaller(strictCallee)");
 
@@ -43,7 +43,7 @@ shouldThrow("strictCaller(boundStrictCallee)");
 shouldBe("strictTailCaller(boundNonStrictCallee)", "null");
 shouldThrow("strictTailCaller(boundStrictCallee)");
 
-// Check that .caller works (or throws) as expected, over an accessor call.
+// Check that .caller throws as expected, over an accessor call. (per https://tc39.github.io/ecma262/#sec-forbidden-extensions)
 function getFooGetter(x) { return Object.getOwnPropertyDescriptor(x, 'foo').get; }
 function getFooSetter(x) { return Object.getOwnPropertyDescriptor(x, 'foo').set; }
 var nonStrictAccessor = {
@@ -58,11 +58,9 @@ function nonStrictGetter(x) { return x.foo; }
 function nonStrictSetter(x) { x.foo = nonStrictSetter; return true; }
 function strictGetter(x) { "use strict"; return x.foo; }
 function strictSetter(x) { "use strict"; x.foo = nonStrictSetter; return true; }
-shouldBe("nonStrictGetter(nonStrictAccessor)", "nonStrictGetter");
-shouldBeTrue("nonStrictSetter(nonStrictAccessor)");
-shouldThrow("nonStrictGetter(strictAccessor)");
-shouldThrow("nonStrictSetter(strictAccessor)");
-shouldThrow("strictGetter(nonStrictAccessor)", '"TypeError: Function.caller used to retrieve strict caller"');
-shouldThrow("strictSetter(nonStrictAccessor)", '"TypeError: Function.caller used to retrieve strict caller"');
+shouldThrow("nonStrictGetter(nonStrictAccessor)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
+shouldThrow("nonStrictGetter(strictAccessor)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
+shouldThrow("strictGetter(nonStrictAccessor)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
+shouldThrow("strictSetter(nonStrictAccessor)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
 shouldThrow("strictGetter(strictAccessor)");
 shouldThrow("strictSetter(strictAccessor)");
index af7ddcb..142bb05 100644 (file)
@@ -31,8 +31,8 @@ shouldBe("(class X {static get arguments() {return staticMethodValue;}}).argumen
 shouldBe("(class X {static get caller() {return staticMethodValue;}}).caller", "staticMethodValue");
 shouldBe("(class X {static get arguments() {return staticMethodValue;}}).hasOwnProperty('arguments')", "true");
 shouldBe("(class X {static get caller() {return staticMethodValue;}}).hasOwnProperty('caller')", "true");
-shouldThrow('class X {static caller() {return staticMethodValue;}};X.arguments = function(){}', '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."');
-shouldThrow('class X {static arguments() {return staticMethodValue;}}; X.caller = function(){}', '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."');
+shouldThrow('class X {static caller() {return staticMethodValue;}};X.arguments = function(){}', '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
+shouldThrow('class X {static arguments() {return staticMethodValue;}}; X.caller = function(){}', '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
 shouldBe('class X {static caller() {return "";}} X.caller = function(){ return staticMethodValue; };X.caller()', 'staticMethodValue');
 shouldBe('class X {static arguments() {return "";}}; X.arguments = function(){ return staticMethodValue; };X.arguments()', 'staticMethodValue');
 shouldBe('class X {static caller() {return "";}} X["caller"] = function(){ return staticMethodValue; };X.caller()', 'staticMethodValue');
index 5c4d885..9963af8 100644 (file)
@@ -24,7 +24,7 @@ function shouldBe(a, b) {
         testFailed(r1 + ":::" + r2);
 }
 
- var typeErrorText = '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."';
+ var typeErrorText = '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."';
 
 class A { };
 class B extends A { };
@@ -106,21 +106,21 @@ check('(new D()).constructor');
 var e = new E;
 
 checkProperties(e.constructor, "length,name,prototype", "e.constructor");
-checkProperties((new E()).getItem, "length,name,prototype", "(new E()).getItem");
+checkProperties((new E()).getItem, "length,name", "(new E()).getItem");
 
 check('e.constructor');
 check('(new E()).getItem');
 
 var f = new F;
 
-checkProperties(f.getItem, "length,name,prototype", "f.getItem");
-checkProperties(f.getElement, "length,name,prototype", "f.getElement");
+checkProperties(f.getItem, "length,name", "f.getItem");
+checkProperties(f.getElement, "length,name", "f.getElement");
 
 check('f.getItem');
 check('f.getElement');
 
-checkProperties((new F()).getItem, "length,name,prototype", "(new F()).getItem");
-checkProperties((new F()).getElement, "length,name,prototype", "(new F()).getElement");
+checkProperties((new F()).getItem, "length,name", "(new F()).getItem");
+checkProperties((new F()).getElement, "length,name", "(new F()).getElement");
 
 check('(new F()).getItem');
 check('(new F()).getElement');
@@ -151,8 +151,8 @@ var h = new H;
 shouldBe('h.caller()', '"value"');
 shouldBe('h.arguments()', '"value"');
 
-checkProperties(h.caller, "length,name,prototype", "h.caller");
-checkProperties(h.arguments, "length,name,prototype", "h.arguments");
+checkProperties(h.caller, "length,name", "h.caller");
+checkProperties(h.arguments, "length,name", "h.arguments");
 
 check('h.caller');
 
@@ -188,4 +188,23 @@ checkProperties((new J).get, "length,name,prototype", "(new J).get");
 check('(new J).gen');
 check('(new J).get');
 
+var k = {
+    method() {},
+    *gen() {},
+    get getter() { },
+    set setter(v) { }
+};
+
+checkProperties(k.method, "length,name", "k.method");
+check("k.method");
+
+checkProperties(k.gen, "length,name,prototype", "k.gen");
+check("k.gen");
+
+checkProperties(Object.getOwnPropertyDescriptor(k, "getter").get, "length,name", "k.getter");
+check("Object.getOwnPropertyDescriptor(k, 'getter').get");
+
+checkProperties(Object.getOwnPropertyDescriptor(k, "setter").set, "length,name", "k.setter");
+check("Object.getOwnPropertyDescriptor(k, 'setter').set");
+
 var successfullyParsed = true;
index d3e0e77..6148616 100644 (file)
@@ -49,7 +49,7 @@ var doSetCaller = function (value, doDelete) {
 
 var value = "property-value";
 
-shouldThrow("doSetCaller(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in strict mode.'");
+shouldThrow("doSetCaller(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in this context.'");
 shouldBe("doSetCaller(value, true).__proto__.caller", "value");
 
 
@@ -61,5 +61,5 @@ var doSetArguments = function (value, doDelete) {
        return f;
 };
 
-shouldThrow("doSetArguments(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in strict mode.'");
+shouldThrow("doSetArguments(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in this context.'");
 shouldBe("doSetArguments(value, true).__proto__.arguments", "value");
index 37ba4f3..74f5339 100644 (file)
@@ -1,3 +1,42 @@
+2016-10-18  Caitlin Potter  <caitp@igalia.com>
+
+        [JSC] ES6 Method functions should not have prototype
+        https://bugs.webkit.org/show_bug.cgi?id=162530
+
+        Reviewed by Saam Barati.
+
+        ECMA-262 only adds "prototype" properties to specific syntactic function forms.
+        Specific items which do not contain "prototype" include (most) built-in functions (such as Math.pow),
+        MethodDefinitions which are not either class "constructor" methods or GeneratorMethods, AsyncFunctions,
+        and ArrowFunctions.
+        
+        For details, see the following spec text, and the difference between GeneratorMethod evaluation and
+        the evaluation of other MethodDefinition forms.
+        
+        - https://tc39.github.io/ecma262/#sec-method-definitions-runtime-semantics-propertydefinitionevaluation
+        - https://tc39.github.io/ecma262/#sec-arrow-function-definitions-runtime-semantics-evaluation
+        - https://tc39.github.io/ecmascript-asyncawait/#async-function-instances
+        - https://tc39.github.io/ecma262/#sec-generator-function-definitions-runtime-semantics-propertydefinitionevaluation
+        
+
+        * runtime/Executable.h:
+        * runtime/JSFunction.cpp:
+        (JSC::JSFunction::callerGetter):
+        (JSC::JSFunction::getOwnPropertySlot):
+        (JSC::JSFunction::deleteProperty):
+
+        * bytecompiler/BytecodeGenerator.h:
+        (JSC::BytecodeGenerator::makeFunction):
+        * runtime/Executable.h:
+        * runtime/JSFunction.cpp:
+        (JSC::JSFunction::getOwnPropertySlot):
+        (JSC::JSFunction::getOwnNonIndexPropertyNames):
+        (JSC::JSFunction::put):
+        (JSC::JSFunction::deleteProperty):
+        (JSC::JSFunction::defineOwnProperty):
+        * runtime/JSGlobalObjectFunctions.cpp:
+        (JSC::globalFuncThrowTypeErrorArgumentsCalleeAndCaller):
+
 2016-10-17  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [DOMJIT] Use NativeCallFrameTracer for operations used for DOMJIT slow calls
index a09bbe4..d4c1c8e 100644 (file)
@@ -855,11 +855,9 @@ namespace JSC {
             // FIXME: These flags, ParserModes and propagation to XXXCodeBlocks should be reorganized.
             // https://bugs.webkit.org/show_bug.cgi?id=151547
             SourceParseMode parseMode = metadata->parseMode();
-            ConstructAbility constructAbility = ConstructAbility::CanConstruct;
-            if (parseMode == SourceParseMode::GetterMode || parseMode == SourceParseMode::SetterMode || parseMode == SourceParseMode::ArrowFunctionMode || parseMode == SourceParseMode::GeneratorWrapperFunctionMode)
-                constructAbility = ConstructAbility::CannotConstruct;
-            else if (parseMode == SourceParseMode::MethodMode && metadata->constructorKind() == ConstructorKind::None)
-                constructAbility = ConstructAbility::CannotConstruct;
+            ConstructAbility constructAbility = constructAbilityForParseMode(parseMode);
+            if (parseMode == SourceParseMode::MethodMode && metadata->constructorKind() != ConstructorKind::None)
+                constructAbility = ConstructAbility::CanConstruct;
 
             return UnlinkedFunctionExecutable::create(m_vm, m_scopeNode->source(), metadata, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, scriptMode(), variablesUnderTDZ, newDerivedContextType);
         }
index 604d36a..8191ac1 100644 (file)
@@ -649,8 +649,22 @@ public:
     bool isArrowFunction() const { return parseMode() == SourceParseMode::ArrowFunctionMode; }
     bool isGetter() const { return parseMode() == SourceParseMode::GetterMode; }
     bool isSetter() const { return parseMode() == SourceParseMode::SetterMode; }
-    bool isGenerator() const { return parseMode() == SourceParseMode::GeneratorBodyMode || parseMode() == SourceParseMode::GeneratorWrapperFunctionMode; }
-    bool isES6Function() const { return isClassConstructorFunction() || isArrowFunction() || isGenerator() || parseMode() == SourceParseMode::MethodMode;}
+    bool isGenerator() const { return SourceParseModeSet(SourceParseMode::GeneratorBodyMode, SourceParseMode::GeneratorWrapperFunctionMode).contains(parseMode()); }
+    bool isMethod() const { return parseMode() == SourceParseMode::MethodMode; }
+    bool hasCallerAndArgumentsProperties() const
+    {
+        // Per https://tc39.github.io/ecma262/#sec-forbidden-extensions, only sloppy-mode non-builtin functions in old-style (pre-ES6) syntactic forms can contain
+        // "caller" and "arguments".
+        return !isStrictMode() && parseMode() == SourceParseMode::NormalFunctionMode && !isClassConstructorFunction();
+    }
+    bool hasPrototypeProperty() const
+    {
+        return SourceParseModeSet(
+            SourceParseMode::NormalFunctionMode,
+            SourceParseMode::GeneratorBodyMode,
+            SourceParseMode::GeneratorWrapperFunctionMode
+        ).contains(parseMode()) || isClass();
+    }
     DerivedContextType derivedContextType() const { return m_unlinkedExecutable->derivedContextType(); }
     bool isClassConstructorFunction() const { return m_unlinkedExecutable->isClassConstructorFunction(); }
     const Identifier& name() { return m_unlinkedExecutable->name(); }
index 9a33027..3d1c6d5 100644 (file)
@@ -352,7 +352,7 @@ bool JSFunction::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyN
         return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
     }
 
-    if (propertyName == vm.propertyNames->prototype && !thisObject->jsExecutable()->isArrowFunction()) {
+    if (propertyName == vm.propertyNames->prototype && thisObject->jsExecutable()->hasPrototypeProperty() && !thisObject->jsExecutable()->isClassConstructorFunction()) {
         unsigned attributes;
         PropertyOffset offset = thisObject->getDirectOffset(vm, propertyName, attributes);
         if (!isValidOffset(offset)) {
@@ -376,15 +376,15 @@ bool JSFunction::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyN
     }
 
     if (propertyName == exec->propertyNames().arguments) {
-        if (thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function())
+        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties())
             return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
-
+        
         slot.setCacheableCustom(thisObject, ReadOnly | DontEnum | DontDelete, argumentsGetter);
         return true;
     }
 
     if (propertyName == exec->propertyNames().caller) {
-        if (thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function())
+        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties())
             return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
 
         slot.setCacheableCustom(thisObject, ReadOnly | DontEnum | DontDelete, callerGetter);
@@ -405,7 +405,7 @@ void JSFunction::getOwnNonIndexPropertyNames(JSObject* object, ExecState* exec,
         PropertySlot slot(thisObject, PropertySlot::InternalMethodType::VMInquiry);
         thisObject->methodTable(vm)->getOwnPropertySlot(thisObject, exec, vm.propertyNames->prototype, slot);
 
-        if (!thisObject->jsExecutable()->isStrictMode() && !thisObject->jsExecutable()->isES6Function()) {
+        if (thisObject->jsExecutable()->hasCallerAndArgumentsProperties()) {
             propertyNames.add(vm.propertyNames->arguments);
             propertyNames.add(vm.propertyNames->caller);
         }
@@ -446,15 +446,18 @@ bool JSFunction::put(JSCell* cell, ExecState* exec, PropertyName propertyName, J
         return Base::put(thisObject, exec, propertyName, value, dontCache);
     }
 
-    if ((thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function()) && (propertyName == vm.propertyNames->arguments || propertyName == vm.propertyNames->caller)) {
-        // This will trigger the property to be reified, if this is not already the case!
-        bool okay = thisObject->hasProperty(exec, propertyName);
-        ASSERT_UNUSED(okay, okay);
-        scope.release();
-        return Base::put(thisObject, exec, propertyName, value, slot);
-    }
-    if (propertyName == vm.propertyNames->arguments || propertyName == vm.propertyNames->caller)
+    if (propertyName == exec->propertyNames().arguments || propertyName == exec->propertyNames().caller) {
+        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties()) {
+            // This will trigger the property to be reified, if this is not already the case!
+            // FIXME: Investigate if the `hasProperty()` call is even needed, as in the `!hasCallerAndArgumentsProperties()` case,
+            // these properties are not lazy and should not need to be reified. (https://bugs.webkit.org/show_bug.cgi?id=163579)
+            bool okay = thisObject->hasProperty(exec, propertyName);
+            ASSERT_UNUSED(okay, okay);
+            scope.release();
+            return Base::put(thisObject, exec, propertyName, value, slot);
+        }
         return reject(exec, scope, slot.isStrictMode(), ASCIILiteral(ReadonlyPropertyWriteError));
+    }
     thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
     scope.release();
     return Base::put(thisObject, exec, propertyName, value, slot);
@@ -469,15 +472,12 @@ bool JSFunction::deleteProperty(JSCell* cell, ExecState* exec, PropertyName prop
         // For non-host functions, don't let these properties by deleted - except by DefineOwnProperty.
         VM& vm = exec->vm();
         FunctionExecutable* executable = thisObject->jsExecutable();
-        bool isES6OrStrictMode = executable->isStrictMode() || executable->isES6Function();
-        if ((propertyName == exec->propertyNames().arguments && !isES6OrStrictMode)
-            || (propertyName == exec->propertyNames().prototype && !executable->isArrowFunction())
-            || (propertyName == exec->propertyNames().caller && !isES6OrStrictMode))
-            return false;
         
-        if ((propertyName == exec->propertyNames().arguments && isES6OrStrictMode)
-            || (propertyName == exec->propertyNames().caller && isES6OrStrictMode))
-            return true;
+        if (propertyName == exec->propertyNames().caller || propertyName == exec->propertyNames().arguments)
+            return !executable->hasCallerAndArgumentsProperties();
+
+        if (propertyName == exec->propertyNames().prototype && !executable->isArrowFunction())
+            return false;
 
         thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
     }
@@ -508,11 +508,11 @@ bool JSFunction::defineOwnProperty(JSObject* object, ExecState* exec, PropertyNa
 
     bool valueCheck;
     if (propertyName == vm.propertyNames->arguments) {
-        if (thisObject->jsExecutable()->isClass()) {
-            thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
-            return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
-        }
-        if (thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function()) {
+        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties()) {
+            if (thisObject->jsExecutable()->isClass()) {
+                thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
+                return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
+            }
             PropertySlot slot(thisObject, PropertySlot::InternalMethodType::VMInquiry);
             if (!Base::getOwnPropertySlot(thisObject, exec, propertyName, slot))
                 thisObject->putDirectAccessor(exec, propertyName, thisObject->globalObject(vm)->throwTypeErrorArgumentsCalleeAndCallerGetterSetter(), DontDelete | DontEnum | Accessor);
@@ -520,11 +520,11 @@ bool JSFunction::defineOwnProperty(JSObject* object, ExecState* exec, PropertyNa
         }
         valueCheck = !descriptor.value() || sameValue(exec, descriptor.value(), retrieveArguments(exec, thisObject));
     } else if (propertyName == vm.propertyNames->caller) {
-        if (thisObject->jsExecutable()->isClass()) {
-            thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
-            return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
-        }
-        if (thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function()) {
+        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties()) {
+            if (thisObject->jsExecutable()->isClass()) {
+                thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
+                return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
+            }
             PropertySlot slot(thisObject, PropertySlot::InternalMethodType::VMInquiry);
             if (!Base::getOwnPropertySlot(thisObject, exec, propertyName, slot))
                 thisObject->putDirectAccessor(exec, propertyName, thisObject->globalObject(vm)->throwTypeErrorArgumentsCalleeAndCallerGetterSetter(), DontDelete | DontEnum | Accessor);
index 085adfb..f8dfec5 100644 (file)
@@ -862,7 +862,7 @@ EncodedJSValue JSC_HOST_CALL globalFuncThrowTypeErrorArgumentsCalleeAndCaller(Ex
 {
     VM& vm = exec->vm();
     auto scope = DECLARE_THROW_SCOPE(vm);
-    return throwVMTypeError(exec, scope, "'arguments', 'callee', and 'caller' cannot be accessed in strict mode.");
+    return throwVMTypeError(exec, scope, "'arguments', 'callee', and 'caller' cannot be accessed in this context.");
 }
 
 EncodedJSValue JSC_HOST_CALL globalFuncProtoGetter(ExecState* exec)