Changeset 207461 in webkit


Ignore:
Timestamp:
Oct 18, 2016 5:51:33 AM (8 years ago)
Author:
caitp@igalia.com
Message:

[JSC] ES6 Method functions should not have prototype
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.

  • 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:
Location:
trunk
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChakraCore/test/strict/05.arguments_sm.baseline-jsc

    r205387 r207461  
    1919}
    2020arguments.caller:value        : undefined
    21 Exception: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    22 Exception: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    23 Exception: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    24 Exception: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     21Exception: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     22Exception: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     23Exception: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     24Exception: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
  • trunk/JSTests/ChangeLog

    r207453 r207461  
     12016-10-18  Caitlin Potter  <caitp@igalia.com>
     2
     3        [JSC] ES6 Method functions should not have prototype
     4        https://bugs.webkit.org/show_bug.cgi?id=162530
     5
     6        Reviewed by Saam Barati.
     7
     8        Fix test262 expectations about MethodDefinitions
     9
     10        * ChakraCore/test/strict/05.arguments_sm.baseline-jsc:
     11        * stress/reflect-set.js:
     12        * test262.yaml:
     13
    1142016-10-17  Keith Miller  <keith_miller@apple.com>
    215
  • trunk/JSTests/stress/reflect-set.js

    r203263 r207461  
    880880        shouldThrow(() => {
    881881            Reflect.set(object, 'callee', 'Cappuccino');
    882         }, `TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.`);
     882        }, `TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.`);
    883883        shouldThrow(() => {
    884884            Reflect.get(object, 'callee');
    885         }, `TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.`);
     885        }, `TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.`);
    886886    }
    887887
  • trunk/JSTests/test262.yaml

    r207347 r207461  
    1765717657  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
    1765817658- path: test262/test/built-ins/Function/prototype/Symbol.hasInstance/this-val-poisoned-prototype.js
    17659   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     17659  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
    1766017660- path: test262/test/built-ins/Function/prototype/Symbol.hasInstance/this-val-poisoned-prototype.js
    17661   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
     17661  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
    1766217662- path: test262/test/built-ins/Function/prototype/Symbol.hasInstance/this-val-prototype-non-obj.js
    1766317663  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     
    6660366603  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
    6660466604- path: test262/test/language/expressions/object/method-definition/name-prototype-prop.js
    66605   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     66605  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
    6660666606- path: test262/test/language/expressions/object/method-definition/name-prototype-prop.js
    66607   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
     66607  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
    6660866608- path: test262/test/language/expressions/object/method-definition/name-prototype.js
    6660966609  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     
    7307173071  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
    7307273072- path: test262/test/language/statements/class/definition/accessors.js
    73073   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     73073  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
    7307473074- path: test262/test/language/statements/class/definition/accessors.js
    73075   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
     73075  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
    7307673076- path: test262/test/language/statements/class/definition/basics.js
    7307773077  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     
    7315973159  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
    7316073160- path: test262/test/language/statements/class/definition/getters-prop-desc.js
    73161   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
     73161  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
    7316273162- path: test262/test/language/statements/class/definition/getters-prop-desc.js
    73163   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
     73163  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
    7316473164- path: test262/test/language/statements/class/definition/getters-restricted-ids.js
    7316573165  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     
    7326773267  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
    7326873268- path: test262/test/language/statements/class/definition/methods.js
    73269   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     73269  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
    7327073270- path: test262/test/language/statements/class/definition/methods.js
    73271   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
     73271  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
    7327273272- path: test262/test/language/statements/class/definition/numeric-property-names.js
    73273   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     73273  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
    7327473274- path: test262/test/language/statements/class/definition/numeric-property-names.js
    73275   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
     73275  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
    7327673276- path: test262/test/language/statements/class/definition/params-trailing-comma-arguments.js
    7327773277  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
     
    7331173311  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
    7331273312- path: test262/test/language/statements/class/definition/setters-prop-desc.js
    73313   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
     73313  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
    7331473314- path: test262/test/language/statements/class/definition/setters-prop-desc.js
    73315   cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
     73315  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
    7331673316- path: test262/test/language/statements/class/definition/setters-restricted-ids.js
    7331773317  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
  • trunk/LayoutTests/ChangeLog

    r207460 r207461  
     12016-10-18  Caitlin Potter  <caitp@igalia.com>
     2
     3        [JSC] ES6 Method functions should not have prototype
     4        https://bugs.webkit.org/show_bug.cgi?id=162530
     5
     6        Reviewed by Saam Barati.
     7
     8        Update expected error message to no longer indicate "strict mode"
     9        (which is not always true), and add additional tests for the presence
     10        of "caller" and "arguments" on accessor MethodDefinitions.
     11
     12        * js/basic-strict-mode-expected.txt:
     13        * js/caller-property-expected.txt:
     14        * js/class-syntax-method-names-expected.txt:
     15        * js/es6-function-properties-expected.txt:
     16        * js/non-strict-function-properties-expected.txt:
     17        * js/script-tests/caller-property.js:
     18        * js/script-tests/class-syntax-method-names.js:
     19        * js/script-tests/es6-function-properties.js:
     20        (k.get getter):
     21        (k.set setter):
     22        (get checkProperties):
     23        * js/script-tests/non-strict-function-properties.js:
     24
    1252016-10-18  Javier Fernandez  <jfernandez@igalia.com>
    226
  • trunk/LayoutTests/js/basic-strict-mode-expected.txt

    r205856 r207461  
    5757PASS (function (){'use strict'; with(1){};}) threw exception SyntaxError: 'with' statements are not valid in strict mode..
    5858PASS (function(){(function (){'use strict'; with(1){};})}) threw exception SyntaxError: 'with' statements are not valid in strict mode..
    59 PASS (function (){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    60 PASS (function (){'use strict'; arguments.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    61 PASS (function f(){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    62 PASS (function f(){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    63 PASS (function f(){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    64 PASS (function f(){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    65 PASS (function (arg){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    66 PASS (function (arg){'use strict'; arguments.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    67 PASS (function f(arg){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    68 PASS (function f(arg){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    69 PASS (function f(arg){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    70 PASS (function f(arg){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     59PASS (function (){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     60PASS (function (){'use strict'; arguments.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     61PASS (function f(){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     62PASS (function f(){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     63PASS (function f(){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     64PASS (function f(){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     65PASS (function (arg){'use strict'; arguments.callee; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     66PASS (function (arg){'use strict'; arguments.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     67PASS (function f(arg){'use strict'; f.arguments; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     68PASS (function f(arg){'use strict'; f.caller; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     69PASS (function f(arg){'use strict'; f.arguments=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     70PASS (function f(arg){'use strict'; f.caller=5; })() threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    7171PASS (function a(a){'use strict'; return a+2; })(40) is 42
    7272PASS var foo = function a(a){'use strict'; return a+2; }; foo(40) is 42
  • trunk/LayoutTests/js/caller-property-expected.txt

    r201619 r207461  
    88PASS childHasCallerWhenCalledFromWithinParent is true
    99PASS nonStrictCaller(nonStrictCallee) is nonStrictCaller
    10 PASS nonStrictCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     10PASS nonStrictCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    1111PASS strictCaller(nonStrictCallee) threw exception TypeError: Function.caller used to retrieve strict caller.
    12 PASS strictCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     12PASS strictCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    1313PASS strictTailCaller(nonStrictCallee) is null
    14 PASS strictTailCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     14PASS strictTailCaller(strictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    1515PASS nonStrictCaller(boundNonStrictCallee) is nonStrictCaller
    16 PASS nonStrictCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     16PASS nonStrictCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    1717PASS strictCaller(boundNonStrictCallee) threw exception TypeError: Function.caller used to retrieve strict caller.
    18 PASS strictCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     18PASS strictCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    1919PASS strictTailCaller(boundNonStrictCallee) is null
    20 PASS strictTailCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    21 PASS nonStrictGetter(nonStrictAccessor) is nonStrictGetter
    22 PASS nonStrictSetter(nonStrictAccessor) is true
    23 PASS nonStrictGetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    24 PASS nonStrictSetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    25 PASS strictGetter(nonStrictAccessor) threw exception TypeError: Function.caller used to retrieve strict caller.
    26 PASS strictSetter(nonStrictAccessor) threw exception TypeError: Function.caller used to retrieve strict caller.
    27 PASS strictGetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    28 PASS strictSetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     20PASS strictTailCaller(boundStrictCallee) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     21PASS nonStrictGetter(nonStrictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     22PASS nonStrictGetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     23PASS strictGetter(nonStrictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     24PASS strictSetter(nonStrictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     25PASS strictGetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     26PASS strictSetter(strictAccessor) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    2927PASS successfullyParsed is true
    3028
  • trunk/LayoutTests/js/class-syntax-method-names-expected.txt

    r205856 r207461  
    3333PASS (class X {static get arguments() {return staticMethodValue;}}).hasOwnProperty('arguments') is true
    3434PASS (class X {static get caller() {return staticMethodValue;}}).hasOwnProperty('caller') is true
    35 PASS class X {static caller() {return staticMethodValue;}};X.arguments = function(){} threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
    36 PASS class X {static arguments() {return staticMethodValue;}}; X.caller = function(){} threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     35PASS class X {static caller() {return staticMethodValue;}};X.arguments = function(){} threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
     36PASS class X {static arguments() {return staticMethodValue;}}; X.caller = function(){} threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    3737PASS class X {static caller() {return "";}} X.caller = function(){ return staticMethodValue; };X.caller() is staticMethodValue
    3838PASS class X {static arguments() {return "";}}; X.arguments = function(){ return staticMethodValue; };X.arguments() is staticMethodValue
  • trunk/LayoutTests/js/es6-function-properties-expected.txt

    r205856 r207461  
    88(new A()).constructor
    99PASS 'length,name,prototype':::'length,name,prototype'
    10 PASS a.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    11 PASS a.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    12 PASS a.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    13 PASS a.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    14 PASS a.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    15 PASS a.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    16 PASS a.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    17 PASS a.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     10PASS a.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     11PASS a.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     12PASS a.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     13PASS a.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     14PASS a.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     15PASS a.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     16PASS a.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     17PASS a.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    1818PASS a.constructor.hasOwnProperty("caller"):::false
    1919PASS a.constructor.hasOwnProperty("arguments"):::false
     
    2424PASS delete a.constructor.arguments:::true
    2525PASS delete a.constructor["arguments"]:::true
    26 PASS a.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    27 PASS a.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    28 PASS a.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    29 PASS a.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    30 PASS a.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    31 PASS a.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    32 PASS a.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    33 PASS a.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     26PASS a.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     27PASS a.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     28PASS a.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     29PASS a.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     30PASS a.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     31PASS a.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     32PASS a.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     33PASS a.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    3434PASS a.constructor.hasOwnProperty("caller"):::false
    3535PASS a.constructor.hasOwnProperty("arguments"):::false
     
    4040PASS delete a.constructor.arguments:::true
    4141PASS delete a.constructor["arguments"]:::true
    42 PASS (new A()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    43 PASS (new A()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    44 PASS (new A()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    45 PASS (new A()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    46 PASS (new A()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    47 PASS (new A()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    48 PASS (new A()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    49 PASS (new A()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     42PASS (new A()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     43PASS (new A()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     44PASS (new A()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     45PASS (new A()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     46PASS (new A()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     47PASS (new A()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     48PASS (new A()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     49PASS (new A()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    5050PASS (new A()).constructor.hasOwnProperty("caller"):::false
    5151PASS (new A()).constructor.hasOwnProperty("arguments"):::false
     
    6060(new B()).constructor
    6161PASS 'length,name,prototype':::'length,name,prototype'
    62 PASS b.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    63 PASS b.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    64 PASS b.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    65 PASS b.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    66 PASS b.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    67 PASS b.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    68 PASS b.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    69 PASS b.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     62PASS b.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     63PASS b.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     64PASS b.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     65PASS b.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     66PASS b.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     67PASS b.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     68PASS b.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     69PASS b.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    7070PASS b.constructor.hasOwnProperty("caller"):::false
    7171PASS b.constructor.hasOwnProperty("arguments"):::false
     
    7676PASS delete b.constructor.arguments:::true
    7777PASS delete b.constructor["arguments"]:::true
    78 PASS (new B()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    79 PASS (new B()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    80 PASS (new B()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    81 PASS (new B()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    82 PASS (new B()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    83 PASS (new B()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    84 PASS (new B()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    85 PASS (new B()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     78PASS (new B()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     79PASS (new B()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     80PASS (new B()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     81PASS (new B()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     82PASS (new B()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     83PASS (new B()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     84PASS (new B()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     85PASS (new B()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    8686PASS (new B()).constructor.hasOwnProperty("caller"):::false
    8787PASS (new B()).constructor.hasOwnProperty("arguments"):::false
     
    9696(new C()).constructor
    9797PASS 'length,name,prototype':::'length,name,prototype'
    98 PASS c.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    99 PASS c.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    100 PASS c.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    101 PASS c.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    102 PASS c.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    103 PASS c.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    104 PASS c.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    105 PASS c.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     98PASS c.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     99PASS c.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     100PASS c.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     101PASS c.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     102PASS c.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     103PASS c.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     104PASS c.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     105PASS c.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    106106PASS c.constructor.hasOwnProperty("caller"):::false
    107107PASS c.constructor.hasOwnProperty("arguments"):::false
     
    112112PASS delete c.constructor.arguments:::true
    113113PASS delete c.constructor["arguments"]:::true
    114 PASS (new C()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    115 PASS (new C()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    116 PASS (new C()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    117 PASS (new C()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    118 PASS (new C()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    119 PASS (new C()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    120 PASS (new C()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    121 PASS (new C()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     114PASS (new C()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     115PASS (new C()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     116PASS (new C()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     117PASS (new C()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     118PASS (new C()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     119PASS (new C()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     120PASS (new C()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     121PASS (new C()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    122122PASS (new C()).constructor.hasOwnProperty("caller"):::false
    123123PASS (new C()).constructor.hasOwnProperty("arguments"):::false
     
    132132(new D()).constructor
    133133PASS 'length,name,prototype':::'length,name,prototype'
    134 PASS d.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    135 PASS d.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    136 PASS d.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    137 PASS d.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    138 PASS d.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    139 PASS d.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    140 PASS d.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    141 PASS d.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     134PASS d.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     135PASS d.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     136PASS d.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     137PASS d.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     138PASS d.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     139PASS d.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     140PASS d.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     141PASS d.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    142142PASS d.constructor.hasOwnProperty("caller"):::false
    143143PASS d.constructor.hasOwnProperty("arguments"):::false
     
    148148PASS delete d.constructor.arguments:::true
    149149PASS delete d.constructor["arguments"]:::true
    150 PASS (new D()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    151 PASS (new D()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    152 PASS (new D()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    153 PASS (new D()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    154 PASS (new D()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    155 PASS (new D()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    156 PASS (new D()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    157 PASS (new D()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     150PASS (new D()).constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     151PASS (new D()).constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     152PASS (new D()).constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     153PASS (new D()).constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     154PASS (new D()).constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     155PASS (new D()).constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     156PASS (new D()).constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     157PASS (new D()).constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    158158PASS (new D()).constructor.hasOwnProperty("caller"):::false
    159159PASS (new D()).constructor.hasOwnProperty("arguments"):::false
     
    167167PASS 'length,name,prototype':::'length,name,prototype'
    168168(new E()).getItem
    169 PASS 'length,name,prototype':::'length,name,prototype'
    170 PASS e.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    171 PASS e.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    172 PASS e.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    173 PASS e.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    174 PASS e.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    175 PASS e.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    176 PASS e.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    177 PASS e.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     169PASS 'length,name':::'length,name'
     170PASS e.constructor.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     171PASS e.constructor.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     172PASS e.constructor["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     173PASS e.constructor["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     174PASS e.constructor.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     175PASS e.constructor.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     176PASS e.constructor["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     177PASS e.constructor["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    178178PASS e.constructor.hasOwnProperty("caller"):::false
    179179PASS e.constructor.hasOwnProperty("arguments"):::false
     
    184184PASS delete e.constructor.arguments:::true
    185185PASS delete e.constructor["arguments"]:::true
    186 PASS (new E()).getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    187 PASS (new E()).getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    188 PASS (new E()).getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    189 PASS (new E()).getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    190 PASS (new E()).getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    191 PASS (new E()).getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    192 PASS (new E()).getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    193 PASS (new E()).getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     186PASS (new E()).getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     187PASS (new E()).getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     188PASS (new E()).getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     189PASS (new E()).getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     190PASS (new E()).getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     191PASS (new E()).getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     192PASS (new E()).getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     193PASS (new E()).getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    194194PASS (new E()).getItem.hasOwnProperty("caller"):::false
    195195PASS (new E()).getItem.hasOwnProperty("arguments"):::false
     
    201201PASS delete (new E()).getItem["arguments"]:::true
    202202f.getItem
    203 PASS 'length,name,prototype':::'length,name,prototype'
     203PASS 'length,name':::'length,name'
    204204f.getElement
    205 PASS 'length,name,prototype':::'length,name,prototype'
    206 PASS f.getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    207 PASS f.getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    208 PASS f.getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    209 PASS f.getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    210 PASS f.getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    211 PASS f.getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    212 PASS f.getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    213 PASS f.getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     205PASS 'length,name':::'length,name'
     206PASS f.getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     207PASS f.getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     208PASS f.getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     209PASS f.getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     210PASS f.getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     211PASS f.getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     212PASS f.getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     213PASS f.getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    214214PASS f.getItem.hasOwnProperty("caller"):::false
    215215PASS f.getItem.hasOwnProperty("arguments"):::false
     
    220220PASS delete f.getItem.arguments:::true
    221221PASS delete f.getItem["arguments"]:::true
    222 PASS f.getElement.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    223 PASS f.getElement.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    224 PASS f.getElement["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    225 PASS f.getElement["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    226 PASS f.getElement.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    227 PASS f.getElement.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    228 PASS f.getElement["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    229 PASS f.getElement["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     222PASS f.getElement.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     223PASS f.getElement.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     224PASS f.getElement["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     225PASS f.getElement["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     226PASS f.getElement.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     227PASS f.getElement.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     228PASS f.getElement["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     229PASS f.getElement["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    230230PASS f.getElement.hasOwnProperty("caller"):::false
    231231PASS f.getElement.hasOwnProperty("arguments"):::false
     
    237237PASS delete f.getElement["arguments"]:::true
    238238(new F()).getItem
    239 PASS 'length,name,prototype':::'length,name,prototype'
     239PASS 'length,name':::'length,name'
    240240(new F()).getElement
    241 PASS 'length,name,prototype':::'length,name,prototype'
    242 PASS (new F()).getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    243 PASS (new F()).getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    244 PASS (new F()).getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    245 PASS (new F()).getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    246 PASS (new F()).getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    247 PASS (new F()).getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    248 PASS (new F()).getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    249 PASS (new F()).getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     241PASS 'length,name':::'length,name'
     242PASS (new F()).getItem.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     243PASS (new F()).getItem.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     244PASS (new F()).getItem["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     245PASS (new F()).getItem["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     246PASS (new F()).getItem.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     247PASS (new F()).getItem.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     248PASS (new F()).getItem["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     249PASS (new F()).getItem["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    250250PASS (new F()).getItem.hasOwnProperty("caller"):::false
    251251PASS (new F()).getItem.hasOwnProperty("arguments"):::false
     
    256256PASS delete (new F()).getItem.arguments:::true
    257257PASS delete (new F()).getItem["arguments"]:::true
    258 PASS (new F()).getElement.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    259 PASS (new F()).getElement.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    260 PASS (new F()).getElement["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    261 PASS (new F()).getElement["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    262 PASS (new F()).getElement.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    263 PASS (new F()).getElement.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    264 PASS (new F()).getElement["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    265 PASS (new F()).getElement["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     258PASS (new F()).getElement.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     259PASS (new F()).getElement.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     260PASS (new F()).getElement["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     261PASS (new F()).getElement["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     262PASS (new F()).getElement.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     263PASS (new F()).getElement.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     264PASS (new F()).getElement["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     265PASS (new F()).getElement["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    266266PASS (new F()).getElement.hasOwnProperty("caller"):::false
    267267PASS (new F()).getElement.hasOwnProperty("arguments"):::false
     
    276276()=>{}
    277277PASS 'length,name':::'length,name'
    278 PASS arr.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    279 PASS arr.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    280 PASS arr["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    281 PASS arr["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    282 PASS arr.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    283 PASS arr.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    284 PASS arr["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    285 PASS arr["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     278PASS arr.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     279PASS arr.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     280PASS arr["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     281PASS arr["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     282PASS arr.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     283PASS arr.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     284PASS arr["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     285PASS arr["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    286286PASS arr.hasOwnProperty("caller"):::false
    287287PASS arr.hasOwnProperty("arguments"):::false
     
    292292PASS delete arr.arguments:::true
    293293PASS delete arr["arguments"]:::true
    294 PASS (()=>{}).caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    295 PASS (()=>{}).arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    296 PASS (()=>{})["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    297 PASS (()=>{})["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    298 PASS (()=>{}).caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    299 PASS (()=>{}).arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    300 PASS (()=>{})["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    301 PASS (()=>{})["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     294PASS (()=>{}).caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     295PASS (()=>{}).arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     296PASS (()=>{})["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     297PASS (()=>{})["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     298PASS (()=>{}).caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     299PASS (()=>{}).arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     300PASS (()=>{})["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     301PASS (()=>{})["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    302302PASS (()=>{}).hasOwnProperty("caller"):::false
    303303PASS (()=>{}).hasOwnProperty("arguments"):::false
     
    312312PASS (new G()).item.caller:::undefined
    313313PASS (new G()).item.arguments:::undefined
    314 PASS H.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    315 PASS H.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    316 PASS H["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    317 PASS H["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    318 PASS H.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    319 PASS H.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    320 PASS H["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    321 PASS H["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     314PASS H.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     315PASS H.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     316PASS H["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     317PASS H["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     318PASS H.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     319PASS H.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     320PASS H["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     321PASS H["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    322322PASS H.hasOwnProperty("caller"):::false
    323323PASS H.hasOwnProperty("arguments"):::false
     
    331331PASS h.arguments():::"value"
    332332h.caller
    333 PASS 'length,name,prototype':::'length,name,prototype'
     333PASS 'length,name':::'length,name'
    334334h.arguments
    335 PASS 'length,name,prototype':::'length,name,prototype'
    336 PASS h.caller.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    337 PASS h.caller.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    338 PASS h.caller["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    339 PASS h.caller["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    340 PASS h.caller.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    341 PASS h.caller.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    342 PASS h.caller["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    343 PASS h.caller["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     335PASS 'length,name':::'length,name'
     336PASS h.caller.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     337PASS h.caller.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     338PASS h.caller["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     339PASS h.caller["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     340PASS h.caller.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     341PASS h.caller.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     342PASS h.caller["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     343PASS h.caller["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    344344PASS h.caller.hasOwnProperty("caller"):::false
    345345PASS h.caller.hasOwnProperty("arguments"):::false
     
    352352PASS (new H()).caller():::"value"
    353353PASS (new H()).arguments():::"value"
    354 PASS (new H()).caller.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    355 PASS (new H()).caller.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    356 PASS (new H()).caller["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    357 PASS (new H()).caller["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    358 PASS (new H()).caller.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    359 PASS (new H()).caller.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    360 PASS (new H()).caller["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    361 PASS (new H()).caller["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     354PASS (new H()).caller.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     355PASS (new H()).caller.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     356PASS (new H()).caller["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     357PASS (new H()).caller["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     358PASS (new H()).caller.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     359PASS (new H()).caller.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     360PASS (new H()).caller["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     361PASS (new H()).caller["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    362362PASS (new H()).caller.hasOwnProperty("caller"):::false
    363363PASS (new H()).caller.hasOwnProperty("arguments"):::false
     
    372372J.get
    373373PASS 'length,name,prototype':::'length,name,prototype'
    374 PASS J.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    375 PASS J.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    376 PASS J.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    377 PASS J.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    378 PASS J.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    379 PASS J.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    380 PASS J.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    381 PASS J.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     374PASS J.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     375PASS J.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     376PASS J.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     377PASS J.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     378PASS J.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     379PASS J.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     380PASS J.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     381PASS J.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    382382PASS J.gen.hasOwnProperty("caller"):::false
    383383PASS J.gen.hasOwnProperty("arguments"):::false
     
    388388PASS delete J.gen.arguments:::true
    389389PASS delete J.gen["arguments"]:::true
    390 PASS J.get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    391 PASS J.get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    392 PASS J.get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    393 PASS J.get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    394 PASS J.get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    395 PASS J.get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    396 PASS J.get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    397 PASS J.get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     390PASS J.get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     391PASS J.get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     392PASS J.get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     393PASS J.get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     394PASS J.get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     395PASS J.get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     396PASS J.get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     397PASS J.get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    398398PASS J.get.hasOwnProperty("caller"):::false
    399399PASS J.get.hasOwnProperty("arguments"):::false
     
    408408j.get
    409409PASS 'length,name,prototype':::'length,name,prototype'
    410 PASS j.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    411 PASS j.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    412 PASS j.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    413 PASS j.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    414 PASS j.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    415 PASS j.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    416 PASS j.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    417 PASS j.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     410PASS j.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     411PASS j.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     412PASS j.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     413PASS j.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     414PASS j.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     415PASS j.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     416PASS j.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     417PASS j.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    418418PASS j.gen.hasOwnProperty("caller"):::false
    419419PASS j.gen.hasOwnProperty("arguments"):::false
     
    424424PASS delete j.gen.arguments:::true
    425425PASS delete j.gen["arguments"]:::true
    426 PASS j.get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    427 PASS j.get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    428 PASS j.get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    429 PASS j.get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    430 PASS j.get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    431 PASS j.get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    432 PASS j.get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    433 PASS j.get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     426PASS j.get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     427PASS j.get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     428PASS j.get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     429PASS j.get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     430PASS j.get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     431PASS j.get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     432PASS j.get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     433PASS j.get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    434434PASS j.get.hasOwnProperty("caller"):::false
    435435PASS j.get.hasOwnProperty("arguments"):::false
     
    444444(new J).get
    445445PASS 'length,name,prototype':::'length,name,prototype'
    446 PASS (new J).gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    447 PASS (new J).gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    448 PASS (new J).gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    449 PASS (new J).gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    450 PASS (new J).gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    451 PASS (new J).gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    452 PASS (new J).gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    453 PASS (new J).gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     446PASS (new J).gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     447PASS (new J).gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     448PASS (new J).gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     449PASS (new J).gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     450PASS (new J).gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     451PASS (new J).gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     452PASS (new J).gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     453PASS (new J).gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    454454PASS (new J).gen.hasOwnProperty("caller"):::false
    455455PASS (new J).gen.hasOwnProperty("arguments"):::false
     
    460460PASS delete (new J).gen.arguments:::true
    461461PASS delete (new J).gen["arguments"]:::true
    462 PASS (new J).get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    463 PASS (new J).get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    464 PASS (new J).get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    465 PASS (new J).get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    466 PASS (new J).get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    467 PASS (new J).get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    468 PASS (new J).get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
    469 PASS (new J).get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode.
     462PASS (new J).get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     463PASS (new J).get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     464PASS (new J).get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     465PASS (new J).get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     466PASS (new J).get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     467PASS (new J).get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     468PASS (new J).get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     469PASS (new J).get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
    470470PASS (new J).get.hasOwnProperty("caller"):::false
    471471PASS (new J).get.hasOwnProperty("arguments"):::false
     
    476476PASS delete (new J).get.arguments:::true
    477477PASS delete (new J).get["arguments"]:::true
     478k.method
     479PASS 'length,name':::'length,name'
     480PASS k.method.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     481PASS k.method.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     482PASS k.method["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     483PASS k.method["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     484PASS k.method.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     485PASS k.method.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     486PASS k.method["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     487PASS k.method["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     488PASS k.method.hasOwnProperty("caller"):::false
     489PASS k.method.hasOwnProperty("arguments"):::false
     490PASS Object.getOwnPropertyDescriptor(k.method, "caller"):::undefined
     491PASS Object.getOwnPropertyDescriptor(k.method, "arguments"):::undefined
     492PASS delete k.method.caller:::true
     493PASS delete k.method["caller"]:::true
     494PASS delete k.method.arguments:::true
     495PASS delete k.method["arguments"]:::true
     496k.gen
     497PASS 'length,name,prototype':::'length,name,prototype'
     498PASS k.gen.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     499PASS k.gen.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     500PASS k.gen["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     501PASS k.gen["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     502PASS k.gen.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     503PASS k.gen.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     504PASS k.gen["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     505PASS k.gen["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     506PASS k.gen.hasOwnProperty("caller"):::false
     507PASS k.gen.hasOwnProperty("arguments"):::false
     508PASS Object.getOwnPropertyDescriptor(k.gen, "caller"):::undefined
     509PASS Object.getOwnPropertyDescriptor(k.gen, "arguments"):::undefined
     510PASS delete k.gen.caller:::true
     511PASS delete k.gen["caller"]:::true
     512PASS delete k.gen.arguments:::true
     513PASS delete k.gen["arguments"]:::true
     514k.getter
     515PASS 'length,name':::'length,name'
     516PASS Object.getOwnPropertyDescriptor(k, 'getter').get.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     517PASS Object.getOwnPropertyDescriptor(k, 'getter').get.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     518PASS Object.getOwnPropertyDescriptor(k, 'getter').get["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     519PASS Object.getOwnPropertyDescriptor(k, 'getter').get["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     520PASS Object.getOwnPropertyDescriptor(k, 'getter').get.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     521PASS Object.getOwnPropertyDescriptor(k, 'getter').get.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     522PASS Object.getOwnPropertyDescriptor(k, 'getter').get["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     523PASS Object.getOwnPropertyDescriptor(k, 'getter').get["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     524PASS Object.getOwnPropertyDescriptor(k, 'getter').get.hasOwnProperty("caller"):::false
     525PASS Object.getOwnPropertyDescriptor(k, 'getter').get.hasOwnProperty("arguments"):::false
     526PASS Object.getOwnPropertyDescriptor(Object.getOwnPropertyDescriptor(k, 'getter').get, "caller"):::undefined
     527PASS Object.getOwnPropertyDescriptor(Object.getOwnPropertyDescriptor(k, 'getter').get, "arguments"):::undefined
     528PASS delete Object.getOwnPropertyDescriptor(k, 'getter').get.caller:::true
     529PASS delete Object.getOwnPropertyDescriptor(k, 'getter').get["caller"]:::true
     530PASS delete Object.getOwnPropertyDescriptor(k, 'getter').get.arguments:::true
     531PASS delete Object.getOwnPropertyDescriptor(k, 'getter').get["arguments"]:::true
     532k.setter
     533PASS 'length,name':::'length,name'
     534PASS Object.getOwnPropertyDescriptor(k, 'setter').set.caller:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     535PASS Object.getOwnPropertyDescriptor(k, 'setter').set.arguments:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     536PASS Object.getOwnPropertyDescriptor(k, 'setter').set["caller"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     537PASS Object.getOwnPropertyDescriptor(k, 'setter').set["arguments"]:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     538PASS Object.getOwnPropertyDescriptor(k, 'setter').set.caller = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     539PASS Object.getOwnPropertyDescriptor(k, 'setter').set.arguments = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     540PASS Object.getOwnPropertyDescriptor(k, 'setter').set["caller"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     541PASS Object.getOwnPropertyDescriptor(k, 'setter').set["arguments"] = function () {}:::TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.
     542PASS Object.getOwnPropertyDescriptor(k, 'setter').set.hasOwnProperty("caller"):::false
     543PASS Object.getOwnPropertyDescriptor(k, 'setter').set.hasOwnProperty("arguments"):::false
     544PASS Object.getOwnPropertyDescriptor(Object.getOwnPropertyDescriptor(k, 'setter').set, "caller"):::undefined
     545PASS Object.getOwnPropertyDescriptor(Object.getOwnPropertyDescriptor(k, 'setter').set, "arguments"):::undefined
     546PASS delete Object.getOwnPropertyDescriptor(k, 'setter').set.caller:::true
     547PASS delete Object.getOwnPropertyDescriptor(k, 'setter').set["caller"]:::true
     548PASS delete Object.getOwnPropertyDescriptor(k, 'setter').set.arguments:::true
     549PASS delete Object.getOwnPropertyDescriptor(k, 'setter').set["arguments"]:::true
    478550PASS successfullyParsed:::true
    479551
  • trunk/LayoutTests/js/non-strict-function-properties-expected.txt

    r205856 r207461  
    2020PASS boo("expected-value")[0] is "expected-value"
    2121PASS g(f) is g
    22 PASS doSetCaller(value, false) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     22PASS doSetCaller(value, false) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    2323PASS doSetCaller(value, true).__proto__.caller is value
    24 PASS doSetArguments(value, false) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in strict mode..
     24PASS doSetArguments(value, false) threw exception TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context..
    2525PASS doSetArguments(value, true).__proto__.arguments is value
    2626PASS successfullyParsed is true
  • trunk/LayoutTests/js/script-tests/caller-property.js

    r201619 r207461  
    2828function strictTailCaller(x) { "use strict"; return x(); }
    2929shouldBe("nonStrictCaller(nonStrictCallee)", "nonStrictCaller");
    30 shouldThrow("nonStrictCaller(strictCallee)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."');
     30shouldThrow("nonStrictCaller(strictCallee)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
    3131shouldThrow("strictCaller(nonStrictCallee)");
    32 shouldThrow("strictCaller(strictCallee)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."');
     32shouldThrow("strictCaller(strictCallee)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
    3333shouldBe("strictTailCaller(nonStrictCallee)", "null");
    3434shouldThrow("strictTailCaller(strictCallee)");
     
    4444shouldThrow("strictTailCaller(boundStrictCallee)");
    4545
    46 // Check that .caller works (or throws) as expected, over an accessor call.
     46// Check that .caller throws as expected, over an accessor call. (per https://tc39.github.io/ecma262/#sec-forbidden-extensions)
    4747function getFooGetter(x) { return Object.getOwnPropertyDescriptor(x, 'foo').get; }
    4848function getFooSetter(x) { return Object.getOwnPropertyDescriptor(x, 'foo').set; }
     
    5959function strictGetter(x) { "use strict"; return x.foo; }
    6060function strictSetter(x) { "use strict"; x.foo = nonStrictSetter; return true; }
    61 shouldBe("nonStrictGetter(nonStrictAccessor)", "nonStrictGetter");
    62 shouldBeTrue("nonStrictSetter(nonStrictAccessor)");
    63 shouldThrow("nonStrictGetter(strictAccessor)");
    64 shouldThrow("nonStrictSetter(strictAccessor)");
    65 shouldThrow("strictGetter(nonStrictAccessor)", '"TypeError: Function.caller used to retrieve strict caller"');
    66 shouldThrow("strictSetter(nonStrictAccessor)", '"TypeError: Function.caller used to retrieve strict caller"');
     61shouldThrow("nonStrictGetter(nonStrictAccessor)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
     62shouldThrow("nonStrictGetter(strictAccessor)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
     63shouldThrow("strictGetter(nonStrictAccessor)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
     64shouldThrow("strictSetter(nonStrictAccessor)", '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
    6765shouldThrow("strictGetter(strictAccessor)");
    6866shouldThrow("strictSetter(strictAccessor)");
  • trunk/LayoutTests/js/script-tests/class-syntax-method-names.js

    r205856 r207461  
    3232shouldBe("(class X {static get arguments() {return staticMethodValue;}}).hasOwnProperty('arguments')", "true");
    3333shouldBe("(class X {static get caller() {return staticMethodValue;}}).hasOwnProperty('caller')", "true");
    34 shouldThrow('class X {static caller() {return staticMethodValue;}};X.arguments = function(){}', '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."');
    35 shouldThrow('class X {static arguments() {return staticMethodValue;}}; X.caller = function(){}', '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."');
     34shouldThrow('class X {static caller() {return staticMethodValue;}};X.arguments = function(){}', '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
     35shouldThrow('class X {static arguments() {return staticMethodValue;}}; X.caller = function(){}', '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."');
    3636shouldBe('class X {static caller() {return "";}} X.caller = function(){ return staticMethodValue; };X.caller()', 'staticMethodValue');
    3737shouldBe('class X {static arguments() {return "";}}; X.arguments = function(){ return staticMethodValue; };X.arguments()', 'staticMethodValue');
  • trunk/LayoutTests/js/script-tests/es6-function-properties.js

    r205856 r207461  
    2525}
    2626
    27  var typeErrorText = '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."';
     27 var typeErrorText = '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in this context."';
    2828
    2929class A { };
     
    107107
    108108checkProperties(e.constructor, "length,name,prototype", "e.constructor");
    109 checkProperties((new E()).getItem, "length,name,prototype", "(new E()).getItem");
     109checkProperties((new E()).getItem, "length,name", "(new E()).getItem");
    110110
    111111check('e.constructor');
     
    114114var f = new F;
    115115
    116 checkProperties(f.getItem, "length,name,prototype", "f.getItem");
    117 checkProperties(f.getElement, "length,name,prototype", "f.getElement");
     116checkProperties(f.getItem, "length,name", "f.getItem");
     117checkProperties(f.getElement, "length,name", "f.getElement");
    118118
    119119check('f.getItem');
    120120check('f.getElement');
    121121
    122 checkProperties((new F()).getItem, "length,name,prototype", "(new F()).getItem");
    123 checkProperties((new F()).getElement, "length,name,prototype", "(new F()).getElement");
     122checkProperties((new F()).getItem, "length,name", "(new F()).getItem");
     123checkProperties((new F()).getElement, "length,name", "(new F()).getElement");
    124124
    125125check('(new F()).getItem');
     
    152152shouldBe('h.arguments()', '"value"');
    153153
    154 checkProperties(h.caller, "length,name,prototype", "h.caller");
    155 checkProperties(h.arguments, "length,name,prototype", "h.arguments");
     154checkProperties(h.caller, "length,name", "h.caller");
     155checkProperties(h.arguments, "length,name", "h.arguments");
    156156
    157157check('h.caller');
     
    189189check('(new J).get');
    190190
     191var k = {
     192    method() {},
     193    *gen() {},
     194    get getter() { },
     195    set setter(v) { }
     196};
     197
     198checkProperties(k.method, "length,name", "k.method");
     199check("k.method");
     200
     201checkProperties(k.gen, "length,name,prototype", "k.gen");
     202check("k.gen");
     203
     204checkProperties(Object.getOwnPropertyDescriptor(k, "getter").get, "length,name", "k.getter");
     205check("Object.getOwnPropertyDescriptor(k, 'getter').get");
     206
     207checkProperties(Object.getOwnPropertyDescriptor(k, "setter").set, "length,name", "k.setter");
     208check("Object.getOwnPropertyDescriptor(k, 'setter').set");
     209
    191210var successfullyParsed = true;
  • trunk/LayoutTests/js/script-tests/non-strict-function-properties.js

    r205856 r207461  
    5050var value = "property-value";
    5151
    52 shouldThrow("doSetCaller(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in strict mode.'");
     52shouldThrow("doSetCaller(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in this context.'");
    5353shouldBe("doSetCaller(value, true).__proto__.caller", "value");
    5454
     
    6262};
    6363
    64 shouldThrow("doSetArguments(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in strict mode.'");
     64shouldThrow("doSetArguments(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in this context.'");
    6565shouldBe("doSetArguments(value, true).__proto__.arguments", "value");
  • trunk/Source/JavaScriptCore/ChangeLog

    r207456 r207461  
     12016-10-18  Caitlin Potter  <caitp@igalia.com>
     2
     3        [JSC] ES6 Method functions should not have prototype
     4        https://bugs.webkit.org/show_bug.cgi?id=162530
     5
     6        Reviewed by Saam Barati.
     7
     8        ECMA-262 only adds "prototype" properties to specific syntactic function forms.
     9        Specific items which do not contain "prototype" include (most) built-in functions (such as Math.pow),
     10        MethodDefinitions which are not either class "constructor" methods or GeneratorMethods, AsyncFunctions,
     11        and ArrowFunctions.
     12       
     13        For details, see the following spec text, and the difference between GeneratorMethod evaluation and
     14        the evaluation of other MethodDefinition forms.
     15       
     16        - https://tc39.github.io/ecma262/#sec-method-definitions-runtime-semantics-propertydefinitionevaluation
     17        - https://tc39.github.io/ecma262/#sec-arrow-function-definitions-runtime-semantics-evaluation
     18        - https://tc39.github.io/ecmascript-asyncawait/#async-function-instances
     19        - https://tc39.github.io/ecma262/#sec-generator-function-definitions-runtime-semantics-propertydefinitionevaluation
     20       
     21
     22        * runtime/Executable.h:
     23        * runtime/JSFunction.cpp:
     24        (JSC::JSFunction::callerGetter):
     25        (JSC::JSFunction::getOwnPropertySlot):
     26        (JSC::JSFunction::deleteProperty):
     27
     28        * bytecompiler/BytecodeGenerator.h:
     29        (JSC::BytecodeGenerator::makeFunction):
     30        * runtime/Executable.h:
     31        * runtime/JSFunction.cpp:
     32        (JSC::JSFunction::getOwnPropertySlot):
     33        (JSC::JSFunction::getOwnNonIndexPropertyNames):
     34        (JSC::JSFunction::put):
     35        (JSC::JSFunction::deleteProperty):
     36        (JSC::JSFunction::defineOwnProperty):
     37        * runtime/JSGlobalObjectFunctions.cpp:
     38        (JSC::globalFuncThrowTypeErrorArgumentsCalleeAndCaller):
     39
    1402016-10-17  Yusuke Suzuki  <utatane.tea@gmail.com>
    241
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h

    r207228 r207461  
    856856            // https://bugs.webkit.org/show_bug.cgi?id=151547
    857857            SourceParseMode parseMode = metadata->parseMode();
    858             ConstructAbility constructAbility = ConstructAbility::CanConstruct;
    859             if (parseMode == SourceParseMode::GetterMode || parseMode == SourceParseMode::SetterMode || parseMode == SourceParseMode::ArrowFunctionMode || parseMode == SourceParseMode::GeneratorWrapperFunctionMode)
    860                 constructAbility = ConstructAbility::CannotConstruct;
    861             else if (parseMode == SourceParseMode::MethodMode && metadata->constructorKind() == ConstructorKind::None)
    862                 constructAbility = ConstructAbility::CannotConstruct;
     858            ConstructAbility constructAbility = constructAbilityForParseMode(parseMode);
     859            if (parseMode == SourceParseMode::MethodMode && metadata->constructorKind() != ConstructorKind::None)
     860                constructAbility = ConstructAbility::CanConstruct;
    863861
    864862            return UnlinkedFunctionExecutable::create(m_vm, m_scopeNode->source(), metadata, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, scriptMode(), variablesUnderTDZ, newDerivedContextType);
  • trunk/Source/JavaScriptCore/runtime/Executable.h

    r206525 r207461  
    650650    bool isGetter() const { return parseMode() == SourceParseMode::GetterMode; }
    651651    bool isSetter() const { return parseMode() == SourceParseMode::SetterMode; }
    652     bool isGenerator() const { return parseMode() == SourceParseMode::GeneratorBodyMode || parseMode() == SourceParseMode::GeneratorWrapperFunctionMode; }
    653     bool isES6Function() const { return isClassConstructorFunction() || isArrowFunction() || isGenerator() || parseMode() == SourceParseMode::MethodMode;}
     652    bool isGenerator() const { return SourceParseModeSet(SourceParseMode::GeneratorBodyMode, SourceParseMode::GeneratorWrapperFunctionMode).contains(parseMode()); }
     653    bool isMethod() const { return parseMode() == SourceParseMode::MethodMode; }
     654    bool hasCallerAndArgumentsProperties() const
     655    {
     656        // Per https://tc39.github.io/ecma262/#sec-forbidden-extensions, only sloppy-mode non-builtin functions in old-style (pre-ES6) syntactic forms can contain
     657        // "caller" and "arguments".
     658        return !isStrictMode() && parseMode() == SourceParseMode::NormalFunctionMode && !isClassConstructorFunction();
     659    }
     660    bool hasPrototypeProperty() const
     661    {
     662        return SourceParseModeSet(
     663            SourceParseMode::NormalFunctionMode,
     664            SourceParseMode::GeneratorBodyMode,
     665            SourceParseMode::GeneratorWrapperFunctionMode
     666        ).contains(parseMode()) || isClass();
     667    }
    654668    DerivedContextType derivedContextType() const { return m_unlinkedExecutable->derivedContextType(); }
    655669    bool isClassConstructorFunction() const { return m_unlinkedExecutable->isClassConstructorFunction(); }
  • trunk/Source/JavaScriptCore/runtime/JSFunction.cpp

    r207411 r207461  
    353353    }
    354354
    355     if (propertyName == vm.propertyNames->prototype && !thisObject->jsExecutable()->isArrowFunction()) {
     355    if (propertyName == vm.propertyNames->prototype && thisObject->jsExecutable()->hasPrototypeProperty() && !thisObject->jsExecutable()->isClassConstructorFunction()) {
    356356        unsigned attributes;
    357357        PropertyOffset offset = thisObject->getDirectOffset(vm, propertyName, attributes);
     
    377377
    378378    if (propertyName == exec->propertyNames().arguments) {
    379         if (thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function())
     379        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties())
    380380            return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
    381 
     381       
    382382        slot.setCacheableCustom(thisObject, ReadOnly | DontEnum | DontDelete, argumentsGetter);
    383383        return true;
     
    385385
    386386    if (propertyName == exec->propertyNames().caller) {
    387         if (thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function())
     387        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties())
    388388            return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
    389389
     
    406406        thisObject->methodTable(vm)->getOwnPropertySlot(thisObject, exec, vm.propertyNames->prototype, slot);
    407407
    408         if (!thisObject->jsExecutable()->isStrictMode() && !thisObject->jsExecutable()->isES6Function()) {
     408        if (thisObject->jsExecutable()->hasCallerAndArgumentsProperties()) {
    409409            propertyNames.add(vm.propertyNames->arguments);
    410410            propertyNames.add(vm.propertyNames->caller);
     
    447447    }
    448448
    449     if ((thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function()) && (propertyName == vm.propertyNames->arguments || propertyName == vm.propertyNames->caller)) {
    450         // This will trigger the property to be reified, if this is not already the case!
    451         bool okay = thisObject->hasProperty(exec, propertyName);
    452         ASSERT_UNUSED(okay, okay);
    453         scope.release();
    454         return Base::put(thisObject, exec, propertyName, value, slot);
    455     }
    456     if (propertyName == vm.propertyNames->arguments || propertyName == vm.propertyNames->caller)
     449    if (propertyName == exec->propertyNames().arguments || propertyName == exec->propertyNames().caller) {
     450        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties()) {
     451            // This will trigger the property to be reified, if this is not already the case!
     452            // FIXME: Investigate if the `hasProperty()` call is even needed, as in the `!hasCallerAndArgumentsProperties()` case,
     453            // these properties are not lazy and should not need to be reified. (https://bugs.webkit.org/show_bug.cgi?id=163579)
     454            bool okay = thisObject->hasProperty(exec, propertyName);
     455            ASSERT_UNUSED(okay, okay);
     456            scope.release();
     457            return Base::put(thisObject, exec, propertyName, value, slot);
     458        }
    457459        return reject(exec, scope, slot.isStrictMode(), ASCIILiteral(ReadonlyPropertyWriteError));
     460    }
    458461    thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
    459462    scope.release();
     
    470473        VM& vm = exec->vm();
    471474        FunctionExecutable* executable = thisObject->jsExecutable();
    472         bool isES6OrStrictMode = executable->isStrictMode() || executable->isES6Function();
    473         if ((propertyName == exec->propertyNames().arguments && !isES6OrStrictMode)
    474             || (propertyName == exec->propertyNames().prototype && !executable->isArrowFunction())
    475             || (propertyName == exec->propertyNames().caller && !isES6OrStrictMode))
     475       
     476        if (propertyName == exec->propertyNames().caller || propertyName == exec->propertyNames().arguments)
     477            return !executable->hasCallerAndArgumentsProperties();
     478
     479        if (propertyName == exec->propertyNames().prototype && !executable->isArrowFunction())
    476480            return false;
    477        
    478         if ((propertyName == exec->propertyNames().arguments && isES6OrStrictMode)
    479             || (propertyName == exec->propertyNames().caller && isES6OrStrictMode))
    480             return true;
    481481
    482482        thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
     
    509509    bool valueCheck;
    510510    if (propertyName == vm.propertyNames->arguments) {
    511         if (thisObject->jsExecutable()->isClass()) {
    512             thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
    513             return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
    514         }
    515         if (thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function()) {
     511        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties()) {
     512            if (thisObject->jsExecutable()->isClass()) {
     513                thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
     514                return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
     515            }
    516516            PropertySlot slot(thisObject, PropertySlot::InternalMethodType::VMInquiry);
    517517            if (!Base::getOwnPropertySlot(thisObject, exec, propertyName, slot))
     
    521521        valueCheck = !descriptor.value() || sameValue(exec, descriptor.value(), retrieveArguments(exec, thisObject));
    522522    } else if (propertyName == vm.propertyNames->caller) {
    523         if (thisObject->jsExecutable()->isClass()) {
    524             thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
    525             return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
    526         }
    527         if (thisObject->jsExecutable()->isStrictMode() || thisObject->jsExecutable()->isES6Function()) {
     523        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties()) {
     524            if (thisObject->jsExecutable()->isClass()) {
     525                thisObject->reifyLazyPropertyIfNeeded(vm, exec, propertyName);
     526                return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
     527            }
    528528            PropertySlot slot(thisObject, PropertySlot::InternalMethodType::VMInquiry);
    529529            if (!Base::getOwnPropertySlot(thisObject, exec, propertyName, slot))
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp

    r206386 r207461  
    863863    VM& vm = exec->vm();
    864864    auto scope = DECLARE_THROW_SCOPE(vm);
    865     return throwVMTypeError(exec, scope, "'arguments', 'callee', and 'caller' cannot be accessed in strict mode.");
     865    return throwVMTypeError(exec, scope, "'arguments', 'callee', and 'caller' cannot be accessed in this context.");
    866866}
    867867
Note: See TracChangeset for help on using the changeset viewer.