Title: [206268] trunk
Revision
206268
Author
commit-qu...@webkit.org
Date
2016-09-22 12:11:23 -0700 (Thu, 22 Sep 2016)

Log Message

test262: Function length should be number of parameters before parameters with default values
https://bugs.webkit.org/show_bug.cgi?id=162377

Patch by Joseph Pecoraro <pecor...@apple.com> on 2016-09-22
Reviewed by Saam Barati.

JSTests:

* stress/es6-default-parameters.js:
Add our own tests for function lengths with default parameters.

* test262.yaml:
We now pass all dflt-length tests.

Source/_javascript_Core:

https://tc39.github.io/ecma262/#sec-function-definitions-static-semantics-expectedargumentcount

> NOTE: The ExpectedArgumentCount of a FormalParameterList is the number of
> FormalParameters to the left of either the rest parameter or the first
> FormalParameter with an Initializer. A FormalParameter without an
> initializer is allowed after the first parameter with an initializer
> but such parameters are considered to be optional with undefined as
> their default value.

Alongside the parameterCount value, maintain a separate count,
functionLength, which will be the count before seeing a rest parameter
or parameter with a default value. This will be the function's length.

* bytecode/UnlinkedCodeBlock.h:
* bytecode/UnlinkedFunctionExecutable.cpp:
(JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
* bytecode/UnlinkedFunctionExecutable.h:
* parser/ASTBuilder.h:
(JSC::ASTBuilder::createFunctionMetadata):
* parser/Nodes.cpp:
(JSC::FunctionMetadataNode::FunctionMetadataNode):
* parser/Nodes.h:
* parser/Parser.cpp:
(JSC::Parser<LexerType>::isArrowFunctionParameters):
(JSC::Parser<LexerType>::parseGeneratorFunctionSourceElements):
(JSC::Parser<LexerType>::parseFormalParameters):
(JSC::Parser<LexerType>::parseFunctionBody):
(JSC::Parser<LexerType>::parseFunctionParameters):
(JSC::Parser<LexerType>::parseFunctionInfo):
* parser/Parser.h:
* parser/ParserFunctionInfo.h:
* parser/SourceProviderCacheItem.h:
(JSC::SourceProviderCacheItem::SourceProviderCacheItem):
* parser/SyntaxChecker.h:
(JSC::SyntaxChecker::createFunctionMetadata):
* runtime/Executable.h:
* runtime/JSFunction.cpp:
(JSC::JSFunction::createBuiltinFunction):
(JSC::JSFunction::reifyLength):

Modified Paths

Diff

Modified: trunk/JSTests/ChangeLog (206267 => 206268)


--- trunk/JSTests/ChangeLog	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/JSTests/ChangeLog	2016-09-22 19:11:23 UTC (rev 206268)
@@ -1,3 +1,16 @@
+2016-09-22  Joseph Pecoraro  <pecor...@apple.com>
+
+        test262: Function length should be number of parameters before parameters with default values
+        https://bugs.webkit.org/show_bug.cgi?id=162377
+
+        Reviewed by Saam Barati.
+
+        * stress/es6-default-parameters.js:
+        Add our own tests for function lengths with default parameters.
+
+        * test262.yaml:
+        We now pass all dflt-length tests.
+
 2016-09-20  Benjamin Poulain  <bpoul...@apple.com>
 
         [JSC] Do not use EagerRun on tests counting recompilation

Modified: trunk/JSTests/stress/es6-default-parameters.js (206267 => 206268)


--- trunk/JSTests/stress/es6-default-parameters.js	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/JSTests/stress/es6-default-parameters.js	2016-09-22 19:11:23 UTC (rev 206268)
@@ -221,6 +221,115 @@
     }
 })();
 
+// Length
+
+function named1(a){};
+function named2(a=1){};
+function named3(a,b){};
+function named4(a,b=1){};
+function named5(a=1,b=1){};
+function named6(a,b,c){};
+function named7(a=1,b,c){};
+function named8(a,b=1,c){};
+function named9(a,b,c=1){};
+function named10(a,...b){};
+function named11(a=1,...b){};
+function named12(a=10,b,c=20,...r){};
+
+assert( named1.length === 1 );
+assert( named2.length === 0 );
+assert( named3.length === 2 );
+assert( named4.length === 1 );
+assert( named5.length === 0 );
+assert( named6.length === 3 );
+assert( named7.length === 0 );
+assert( named8.length === 1 );
+assert( named9.length === 2 );
+assert( named10.length === 1 );
+assert( named11.length === 0 );
+assert( named12.length === 0 );
+
+assert( (function(a){}).length === 1 );
+assert( (function(a=1){}).length === 0 );
+assert( (function(a,b){}).length === 2 );
+assert( (function(a,b=1){}).length === 1 );
+assert( (function(a=1,b=1){}).length === 0 );
+assert( (function(a,b,c){}).length === 3 );
+assert( (function(a=1,b,c){}).length === 0 );
+assert( (function(a,b=1,c){}).length === 1 );
+assert( (function(a,b,c=1){}).length === 2 );
+assert( (function(a,...b){}).length === 1 );
+assert( (function(a=1,...b){}).length === 0 );
+assert( (function(a=10,b,c=20,...r){}).length === 0 );
+
+assert( (function*(a){}).length === 1 );
+assert( (function*(a=1){}).length === 0 );
+assert( (function*(a,b){}).length === 2 );
+assert( (function*(a,b=1){}).length === 1 );
+assert( (function*(a=1,b=1){}).length === 0 );
+assert( (function*(a,b,c){}).length === 3 );
+assert( (function*(a=1,b,c){}).length === 0 );
+assert( (function*(a,b=1,c){}).length === 1 );
+assert( (function*(a,b,c=1){}).length === 2 );
+assert( (function*(a,...b){}).length === 1 );
+assert( (function*(a=1,...b){}).length === 0 );
+assert( (function*(a=10,b,c=20,...r){}).length === 0 );
+
+assert( ((a)=>{}).length === 1 );
+assert( ((a=1)=>{}).length === 0 );
+assert( ((a,b)=>{}).length === 2 );
+assert( ((a,b=1)=>{}).length === 1 );
+assert( ((a=1,b=1)=>{}).length === 0 );
+assert( ((a,b,c)=>{}).length === 3 );
+assert( ((a=1,b,c)=>{}).length === 0 );
+assert( ((a,b=1,c)=>{}).length === 1 );
+assert( ((a,b,c=1)=>{}).length === 2 );
+assert( ((a,...b)=>{}).length === 1 );
+assert( ((a=1,...b)=>{}).length === 0 );
+assert( ((a=10,b,c=20,...r)=>{}).length === 0 );
+
+assert( Object.getOwnPropertyDescriptor({set setter(a){}}, "setter").set.length === 1 );
+assert( Object.getOwnPropertyDescriptor({set setter(a=1){}}, "setter").set.length === 0 );
+
+assert( ({method(a){}}).method.length === 1 );
+assert( ({method(a=1){}}).method.length === 0 );
+assert( ({method(a,b){}}).method.length === 2 );
+assert( ({method(a,b=1){}}).method.length === 1 );
+assert( ({method(a=1,b=1){}}).method.length === 0 );
+assert( ({method(a,b,c){}}).method.length === 3 );
+assert( ({method(a=1,b,c){}}).method.length === 0 );
+assert( ({method(a,b=1,c){}}).method.length === 1 );
+assert( ({method(a,b,c=1){}}).method.length === 2 );
+assert( ({method(a,...b){}}).method.length === 1 );
+assert( ({method(a=1,...b){}}).method.length === 0 );
+assert( ({method(a=10,b,c=20,...r){}}).method.length === 0 );
+
+assert( ({*method(a){}}).method.length === 1 );
+assert( ({*method(a=1){}}).method.length === 0 );
+assert( ({*method(a,b){}}).method.length === 2 );
+assert( ({*method(a,b=1){}}).method.length === 1 );
+assert( ({*method(a=1,b=1){}}).method.length === 0 );
+assert( ({*method(a,b,c){}}).method.length === 3 );
+assert( ({*method(a=1,b,c){}}).method.length === 0 );
+assert( ({*method(a,b=1,c){}}).method.length === 1 );
+assert( ({*method(a,b,c=1){}}).method.length === 2 );
+assert( ({*method(a,...b){}}).method.length === 1 );
+assert( ({*method(a=1,...b){}}).method.length === 0 );
+assert( ({*method(a=10,b,c=20,...r){}}).method.length === 0 );
+
+assert( (class {static method(a){}}).method.length === 1 );
+assert( (class {static method(a=1){}}).method.length === 0 );
+assert( (class {static method(a,b){}}).method.length === 2 );
+assert( (class {static method(a,b=1){}}).method.length === 1 );
+assert( (class {static method(a=1,b=1){}}).method.length === 0 );
+assert( (class {static method(a,b,c){}}).method.length === 3 );
+assert( (class {static method(a=1,b,c){}}).method.length === 0 );
+assert( (class {static method(a,b=1,c){}}).method.length === 1 );
+assert( (class {static method(a,b,c=1){}}).method.length === 2 );
+assert( (class {static method(a,...b){}}).method.length === 1 );
+assert( (class {static method(a=1,...b){}}).method.length === 0 );
+assert( (class {static method(a=10,b,c=20,...r){}}).method.length === 0 );
+
 // TDZ errors.
 ;(function() {
     function basicError(x = y, y) { }

Modified: trunk/JSTests/test262.yaml (206267 => 206268)


--- trunk/JSTests/test262.yaml	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/JSTests/test262.yaml	2016-09-22 19:11:23 UTC (rev 206268)
@@ -54000,9 +54000,9 @@
 - path: test262/test/language/expressions/arrow-function/_expression_-body-implicit-return.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/arrow-function/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/arrow-function/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/arrow-function/lexical-arguments.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/arrow-function/lexical-arguments.js
@@ -58852,9 +58852,9 @@
 - path: test262/test/language/expressions/class/dstr-meth-static-obj-ptrn-prop-obj.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/class/gen-method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/class/gen-method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/class/gen-method-param-dflt-yield.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/class/gen-method-param-dflt-yield.js
@@ -58864,9 +58864,9 @@
 - path: test262/test/language/expressions/class/getter-param-dflt.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/class/method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/class/method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/class/method-param-dflt-yield.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/class/method-param-dflt-yield.js
@@ -59100,17 +59100,17 @@
 - path: test262/test/language/expressions/class/scope-static-setter-paramsbody-var-open.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/class/setter-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/class/setter-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/class/static-gen-method-param-dflt-yield.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/class/static-gen-method-param-dflt-yield.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/class/static-method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/class/static-method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/class/static-method-param-dflt-yield.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/class/static-method-param-dflt-yield.js
@@ -62148,9 +62148,9 @@
 - path: test262/test/language/expressions/function/early-params-super-prop.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/function/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/function/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/function/name.js
   cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/function/name.js
@@ -62958,9 +62958,9 @@
 - path: test262/test/language/expressions/generators/invoke-as-constructor.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/generators/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/generators/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/generators/length-property-descriptor.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/generators/length-property-descriptor.js
@@ -66474,9 +66474,9 @@
 - path: test262/test/language/expressions/object/method-definition/generator-invoke-fn-strict.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/object/method-definition/generator-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/object/method-definition/generator-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/object/method-definition/generator-length.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/object/method-definition/generator-length.js
@@ -66562,9 +66562,9 @@
 - path: test262/test/language/expressions/object/method-definition/name-invoke-fn-strict.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/language/expressions/object/method-definition/name-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/object/method-definition/name-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/object/method-definition/name-length.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/object/method-definition/name-length.js
@@ -66876,9 +66876,9 @@
 - path: test262/test/language/expressions/object/scope-setter-paramsbody-var-open.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/expressions/object/setter-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/object/setter-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/expressions/object/setter-prop-desc.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/expressions/object/setter-prop-desc.js
@@ -76122,9 +76122,9 @@
 - path: test262/test/language/statements/class/dstr-meth-static-obj-ptrn-prop-obj.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/gen-method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/class/gen-method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/statements/class/gen-method-param-dflt-yield.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/gen-method-param-dflt-yield.js
@@ -76134,9 +76134,9 @@
 - path: test262/test/language/statements/class/getter-param-dflt.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/class/method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/statements/class/method-param-yield.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/method-param-yield.js
@@ -76394,9 +76394,9 @@
 - path: test262/test/language/statements/class/scope-static-setter-paramsbody-var-open.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/setter-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/class/setter-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/statements/class/static-gen-method-param-dflt-yield.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/static-gen-method-param-dflt-yield.js
@@ -76406,9 +76406,9 @@
 - path: test262/test/language/statements/class/static-method-gen-non-configurable-err.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/class/static-method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/class/static-method-length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/statements/class/static-method-non-configurable-err.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/language/statements/class/static-method-non-configurable-err.js
@@ -83324,9 +83324,9 @@
 - path: test262/test/language/statements/function/early-params-super-prop.js
   cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/function/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/function/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/statements/function/name.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/function/name.js
@@ -84126,9 +84126,9 @@
 - path: test262/test/language/statements/generators/invoke-as-constructor.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/language/statements/generators/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/generators/length-dflt.js
-  cmd: runTest262 :fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/language/statements/generators/length-property-descriptor.js
   cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js", "../../../../harness/propertyHelper.js"], []
 - path: test262/test/language/statements/generators/length-property-descriptor.js

Modified: trunk/Source/_javascript_Core/ChangeLog (206267 => 206268)


--- trunk/Source/_javascript_Core/ChangeLog	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-09-22 19:11:23 UTC (rev 206268)
@@ -1,5 +1,52 @@
 2016-09-22  Joseph Pecoraro  <pecor...@apple.com>
 
+        test262: Function length should be number of parameters before parameters with default values
+        https://bugs.webkit.org/show_bug.cgi?id=162377
+
+        Reviewed by Saam Barati.
+
+        https://tc39.github.io/ecma262/#sec-function-definitions-static-semantics-expectedargumentcount
+
+        > NOTE: The ExpectedArgumentCount of a FormalParameterList is the number of
+        > FormalParameters to the left of either the rest parameter or the first
+        > FormalParameter with an Initializer. A FormalParameter without an
+        > initializer is allowed after the first parameter with an initializer
+        > but such parameters are considered to be optional with undefined as
+        > their default value.
+
+        Alongside the parameterCount value, maintain a separate count,
+        functionLength, which will be the count before seeing a rest parameter
+        or parameter with a default value. This will be the function's length.
+
+        * bytecode/UnlinkedCodeBlock.h:
+        * bytecode/UnlinkedFunctionExecutable.cpp:
+        (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
+        * bytecode/UnlinkedFunctionExecutable.h:
+        * parser/ASTBuilder.h:
+        (JSC::ASTBuilder::createFunctionMetadata):
+        * parser/Nodes.cpp:
+        (JSC::FunctionMetadataNode::FunctionMetadataNode):
+        * parser/Nodes.h:
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::isArrowFunctionParameters):
+        (JSC::Parser<LexerType>::parseGeneratorFunctionSourceElements):
+        (JSC::Parser<LexerType>::parseFormalParameters):
+        (JSC::Parser<LexerType>::parseFunctionBody):
+        (JSC::Parser<LexerType>::parseFunctionParameters):
+        (JSC::Parser<LexerType>::parseFunctionInfo):
+        * parser/Parser.h:
+        * parser/ParserFunctionInfo.h:
+        * parser/SourceProviderCacheItem.h:
+        (JSC::SourceProviderCacheItem::SourceProviderCacheItem):
+        * parser/SyntaxChecker.h:
+        (JSC::SyntaxChecker::createFunctionMetadata):
+        * runtime/Executable.h:
+        * runtime/JSFunction.cpp:
+        (JSC::JSFunction::createBuiltinFunction):
+        (JSC::JSFunction::reifyLength):
+
+2016-09-22  Joseph Pecoraro  <pecor...@apple.com>
+
         Remove a bunch of unnecessary includes
         https://bugs.webkit.org/show_bug.cgi?id=162376
 

Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h (206267 => 206268)


--- trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h	2016-09-22 19:11:23 UTC (rev 206268)
@@ -47,7 +47,6 @@
 
 class BytecodeRewriter;
 class Debugger;
-class FunctionMetadataNode;
 class FunctionExecutable;
 class ParserError;
 class ScriptExecutable;

Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.cpp (206267 => 206268)


--- trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.cpp	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.cpp	2016-09-22 19:11:23 UTC (rev 206268)
@@ -88,6 +88,7 @@
     , m_typeProfilingStartOffset(node->functionKeywordStart())
     , m_typeProfilingEndOffset(node->startStartOffset() + node->source().length() - 1)
     , m_parameterCount(node->parameterCount())
+    , m_functionLength(node->functionLength())
     , m_features(0)
     , m_isInStrictContext(node->isInStrictContext())
     , m_hasCapturedVariables(false)

Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.h (206267 => 206268)


--- trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.h	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedFunctionExecutable.h	2016-09-22 19:11:23 UTC (rev 206268)
@@ -77,6 +77,7 @@
     void setEcmaName(const Identifier& name) { m_ecmaName = name; }
     const Identifier& inferredName() const { return m_inferredName; }
     unsigned parameterCount() const { return m_parameterCount; };
+    unsigned functionLength() const { return m_functionLength; }
     SourceParseMode parseMode() const { return static_cast<SourceParseMode>(m_sourceParseMode); };
 
     const SourceCode& classSource() const { return m_classSource; };
@@ -154,6 +155,7 @@
     unsigned m_typeProfilingStartOffset;
     unsigned m_typeProfilingEndOffset;
     unsigned m_parameterCount;
+    unsigned m_functionLength;
     CodeFeatures m_features;
     unsigned m_isInStrictContext : 1;
     unsigned m_hasCapturedVariables : 1;

Modified: trunk/Source/_javascript_Core/parser/ASTBuilder.h (206267 => 206268)


--- trunk/Source/_javascript_Core/parser/ASTBuilder.h	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/parser/ASTBuilder.h	2016-09-22 19:11:23 UTC (rev 206268)
@@ -394,12 +394,15 @@
         const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, 
         unsigned startColumn, unsigned endColumn, int functionKeywordStart, 
         int functionNameStart, int parametersStart, bool inStrictContext, 
-        ConstructorKind constructorKind, SuperBinding superBinding, unsigned parameterCount, SourceParseMode mode, bool isArrowFunctionBodyExpression)
+        ConstructorKind constructorKind, SuperBinding superBinding,
+        unsigned parameterCount, unsigned functionLength,
+        SourceParseMode mode, bool isArrowFunctionBodyExpression)
     {
         return new (m_parserArena) FunctionMetadataNode(
             m_parserArena, startLocation, endLocation, startColumn, endColumn, 
             functionKeywordStart, functionNameStart, parametersStart, 
-            inStrictContext, constructorKind, superBinding, parameterCount, mode, isArrowFunctionBodyExpression);
+            inStrictContext, constructorKind, superBinding,
+            parameterCount, functionLength, mode, isArrowFunctionBodyExpression);
     }
 
     ExpressionNode* createArrowFunctionExpr(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& functionInfo)

Modified: trunk/Source/_javascript_Core/parser/Nodes.cpp (206267 => 206268)


--- trunk/Source/_javascript_Core/parser/Nodes.cpp	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/parser/Nodes.cpp	2016-09-22 19:11:23 UTC (rev 206268)
@@ -135,7 +135,7 @@
     ParserArena&, const JSTokenLocation& startLocation, 
     const JSTokenLocation& endLocation, unsigned startColumn, unsigned endColumn, 
     int functionKeywordStart, int functionNameStart, int parametersStart, bool isInStrictContext, 
-    ConstructorKind constructorKind, SuperBinding superBinding, unsigned parameterCount, SourceParseMode mode, bool isArrowFunctionBodyExpression)
+    ConstructorKind constructorKind, SuperBinding superBinding, unsigned parameterCount, unsigned functionLength, SourceParseMode mode, bool isArrowFunctionBodyExpression)
         : Node(endLocation)
         , m_startColumn(startColumn)
         , m_endColumn(endColumn)
@@ -144,6 +144,7 @@
         , m_parametersStart(parametersStart)
         , m_startStartOffset(startLocation.startOffset)
         , m_parameterCount(parameterCount)
+        , m_functionLength(functionLength)
         , m_parseMode(mode)
         , m_isInStrictContext(isInStrictContext)
         , m_superBinding(static_cast<unsigned>(superBinding))

Modified: trunk/Source/_javascript_Core/parser/Nodes.h (206267 => 206268)


--- trunk/Source/_javascript_Core/parser/Nodes.h	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/parser/Nodes.h	2016-09-22 19:11:23 UTC (rev 206268)
@@ -1859,7 +1859,8 @@
             ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, 
             unsigned startColumn, unsigned endColumn, int functionKeywordStart, 
             int functionNameStart, int parametersStart, bool isInStrictContext, 
-            ConstructorKind, SuperBinding, unsigned, SourceParseMode, bool isArrowFunctionBodyExpression);
+            ConstructorKind, SuperBinding, unsigned parameterCount, unsigned functionLength,
+            SourceParseMode, bool isArrowFunctionBodyExpression);
 
         void finishParsing(const SourceCode&, const Identifier&, FunctionMode);
         
@@ -1878,6 +1879,7 @@
         unsigned startColumn() const { return m_startColumn; }
         unsigned endColumn() const { return m_endColumn; }
         unsigned parameterCount() const { return m_parameterCount; }
+        unsigned functionLength() const { return m_functionLength; }
         SourceParseMode parseMode() const { return m_parseMode; }
 
         void setEndPosition(JSTextPosition);
@@ -1914,6 +1916,7 @@
         SourceCode m_classSource;
         int m_startStartOffset;
         unsigned m_parameterCount;
+        unsigned m_functionLength;
         int m_lastLine;
         SourceParseMode m_parseMode;
         unsigned m_isInStrictContext : 1;

Modified: trunk/Source/_javascript_Core/parser/Parser.cpp (206267 => 206268)


--- trunk/Source/_javascript_Core/parser/Parser.cpp	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/parser/Parser.cpp	2016-09-22 19:11:23 UTC (rev 206268)
@@ -378,7 +378,8 @@
             fakeScope->setSourceParseMode(SourceParseMode::ArrowFunctionMode);
 
             unsigned parametersCount = 0;
-            isArrowFunction = parseFormalParameters(syntaxChecker, syntaxChecker.createFormalParameterList(), parametersCount) && consume(CLOSEPAREN) && match(ARROWFUNCTION);
+            unsigned functionLength = 0;
+            isArrowFunction = parseFormalParameters(syntaxChecker, syntaxChecker.createFormalParameterList(), parametersCount, functionLength) && consume(CLOSEPAREN) && match(ARROWFUNCTION);
                 
             popScope(fakeScope, syntaxChecker.NeedsFreeVariableInfo);
         }
@@ -525,7 +526,7 @@
         failIfFalse(parseSourceElements(generatorFunctionContext, mode), "Cannot parse the body of a generator");
         popScope(generatorBodyScope, TreeBuilder::NeedsFreeVariableInfo);
     }
-    info.body = context.createFunctionMetadata(startLocation, tokenLocation(), startColumn, tokenColumn(), functionKeywordStart, functionNameStart, parametersStart, strictMode(), ConstructorKind::None, m_superBinding, info.parameterCount, SourceParseMode::GeneratorBodyMode, false);
+    info.body = context.createFunctionMetadata(startLocation, tokenLocation(), startColumn, tokenColumn(), functionKeywordStart, functionNameStart, parametersStart, strictMode(), ConstructorKind::None, m_superBinding, info.parameterCount, info.functionLength, SourceParseMode::GeneratorBodyMode, false);
 
     info.endLine = tokenLine();
     info.endOffset = m_token.m_data.offset;
@@ -1743,7 +1744,7 @@
 }
 
 template <typename LexerType>
-template <class TreeBuilder> bool Parser<LexerType>::parseFormalParameters(TreeBuilder& context, TreeFormalParameterList list, unsigned& parameterCount)
+template <class TreeBuilder> bool Parser<LexerType>::parseFormalParameters(TreeBuilder& context, TreeFormalParameterList list, unsigned& parameterCount, unsigned& functionLength)
 {
 #define failIfDuplicateIfViolation() \
     if (duplicateParameter) {\
@@ -1783,8 +1784,11 @@
         if (isRestParameter || defaultValue || hasDestructuringPattern)
             currentScope()->setHasNonSimpleParameterList();
         context.appendParameter(list, parameter, defaultValue);
-        if (!isRestParameter)
+        if (!isRestParameter) {
             parameterCount++;
+            if (!hasDefaultParameterValues)
+                functionLength++;
+        }
     } while (!isRestParameter && consume(COMMA));
 
     return true;
@@ -1793,8 +1797,8 @@
 
 template <typename LexerType>
 template <class TreeBuilder> TreeFunctionBody Parser<LexerType>::parseFunctionBody(
-    TreeBuilder& context, SyntaxChecker& syntaxChecker, const JSTokenLocation& startLocation, int startColumn, int functionKeywordStart, int functionNameStart, int parametersStart, 
-    ConstructorKind constructorKind, SuperBinding superBinding, FunctionBodyType bodyType, unsigned parameterCount, SourceParseMode parseMode)
+    TreeBuilder& context, SyntaxChecker& syntaxChecker, const JSTokenLocation& startLocation, int startColumn, int functionKeywordStart, int functionNameStart, int parametersStart,
+    ConstructorKind constructorKind, SuperBinding superBinding, FunctionBodyType bodyType, unsigned parameterCount, unsigned functionLength, SourceParseMode parseMode)
 {
     bool isArrowFunctionBodyExpression = bodyType == ArrowFunctionBodyExpression;
     if (!isArrowFunctionBodyExpression) {
@@ -1801,7 +1805,7 @@
         next();
         if (match(CLOSEBRACE)) {
             unsigned endColumn = tokenColumn();
-            return context.createFunctionMetadata(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, superBinding, parameterCount, parseMode, isArrowFunctionBodyExpression);
+            return context.createFunctionMetadata(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, superBinding, parameterCount, functionLength, parseMode, isArrowFunctionBodyExpression);
         }
     }
 
@@ -1812,7 +1816,7 @@
     else
         failIfFalse(parseSourceElements(syntaxChecker, CheckForStrictMode), bodyType == StandardFunctionBodyBlock ? "Cannot parse body of this function" : "Cannot parse body of this arrow function");
     unsigned endColumn = tokenColumn();
-    return context.createFunctionMetadata(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, superBinding, parameterCount, parseMode, isArrowFunctionBodyExpression);
+    return context.createFunctionMetadata(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, superBinding, parameterCount, functionLength, parseMode, isArrowFunctionBodyExpression);
 }
 
 static const char* stringForFunctionMode(SourceParseMode mode)
@@ -1856,14 +1860,16 @@
             if (match(OPENPAREN)) {
                 next();
                 
-                if (match(CLOSEPAREN))
+                if (match(CLOSEPAREN)) {
                     functionInfo.parameterCount = 0;
-                else
-                    failIfFalse(parseFormalParameters(context, parameterList, functionInfo.parameterCount), "Cannot parse parameters for this ", stringForFunctionMode(mode));
+                    functionInfo.functionLength = 0;
+                } else
+                    failIfFalse(parseFormalParameters(context, parameterList, functionInfo.parameterCount, functionInfo.functionLength), "Cannot parse parameters for this ", stringForFunctionMode(mode));
                 
                 consumeOrFail(CLOSEPAREN, "Expected a ')' or a ',' after a parameter declaration");
             } else {
                 functionInfo.parameterCount = 1;
+                functionInfo.functionLength = 1;
                 auto parameter = parseDestructuringPattern(context, DestructuringKind::DestructureToParameters, ExportType::NotExported);
                 failIfFalse(parameter, "Cannot parse parameter pattern");
                 context.appendParameter(parameterList, parameter, 0);
@@ -1881,6 +1887,7 @@
     if (mode == SourceParseMode::GetterMode) {
         consumeOrFail(CLOSEPAREN, "getter functions must have no parameters");
         functionInfo.parameterCount = 0;
+        functionInfo.functionLength = 0;
     } else if (mode == SourceParseMode::SetterMode) {
         failIfTrue(match(CLOSEPAREN), "setter functions must have one parameter");
         const Identifier* duplicateParameter = nullptr;
@@ -1891,13 +1898,15 @@
         semanticFailIfTrue(duplicateParameter && defaultValue, "Duplicate parameter '", duplicateParameter->impl(), "' not allowed in function with default parameter values");
         context.appendParameter(parameterList, parameter, defaultValue);
         functionInfo.parameterCount = 1;
+        functionInfo.functionLength = defaultValue ? 0 : 1;
         failIfTrue(match(COMMA), "setter functions must have one parameter");
         consumeOrFail(CLOSEPAREN, "Expected a ')' after a parameter declaration");
     } else {
-        if (match(CLOSEPAREN))
+        if (match(CLOSEPAREN)) {
             functionInfo.parameterCount = 0;
-        else
-            failIfFalse(parseFormalParameters(context, parameterList, functionInfo.parameterCount), "Cannot parse parameters for this ", stringForFunctionMode(mode));
+            functionInfo.functionLength = 0;
+        } else
+            failIfFalse(parseFormalParameters(context, parameterList, functionInfo.parameterCount, functionInfo.functionLength), "Cannot parse parameters for this ", stringForFunctionMode(mode));
         consumeOrFail(CLOSEPAREN, "Expected a ')' or a ',' after a parameter declaration");
     }
 
@@ -1990,9 +1999,12 @@
             functionInfo.body = context.createFunctionMetadata(
                 startLocation, endLocation, startColumn, bodyEndColumn, 
                 functionKeywordStart, functionNameStart, parametersStart, 
-                cachedInfo->strictMode, constructorKind, expectedSuperBinding, cachedInfo->parameterCount, mode, functionBodyType == ArrowFunctionBodyExpression);
+                cachedInfo->strictMode, constructorKind, expectedSuperBinding,
+                cachedInfo->parameterCount, cachedInfo->functionLength,
+                mode, functionBodyType == ArrowFunctionBodyExpression);
             functionInfo.endOffset = cachedInfo->endFunctionOffset;
             functionInfo.parameterCount = cachedInfo->parameterCount;
+            functionInfo.functionLength = cachedInfo->functionLength;
 
             functionScope->restoreFromSourceProviderCache(cachedInfo);
             popScope(functionScope, TreeBuilder::NeedsFreeVariableInfo);
@@ -2149,7 +2161,7 @@
     });
 
     auto performParsingFunctionBody = [&] {
-        return parseFunctionBody(context, syntaxChecker, startLocation, startColumn, functionKeywordStart, functionNameStart, parametersStart, constructorKind, expectedSuperBinding, functionBodyType, functionInfo.parameterCount, mode);
+        return parseFunctionBody(context, syntaxChecker, startLocation, startColumn, functionKeywordStart, functionNameStart, parametersStart, constructorKind, expectedSuperBinding, functionBodyType, functionInfo.parameterCount, functionInfo.functionLength, mode);
     };
 
     if (mode == SourceParseMode::GeneratorWrapperFunctionMode) {
@@ -2202,6 +2214,7 @@
         parameters.lastTokenEndOffset = location.endOffset;
         parameters.lastTokenLineStartOffset = location.lineStartOffset;
         parameters.parameterCount = functionInfo.parameterCount;
+        parameters.functionLength = functionInfo.functionLength;
         parameters.constructorKind = constructorKind;
         parameters.expectedSuperBinding = expectedSuperBinding;
         if (functionBodyType == ArrowFunctionBodyExpression) {

Modified: trunk/Source/_javascript_Core/parser/Parser.h (206267 => 206268)


--- trunk/Source/_javascript_Core/parser/Parser.h	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/parser/Parser.h	2016-09-22 19:11:23 UTC (rev 206268)
@@ -20,8 +20,7 @@
  *
  */
 
-#ifndef Parser_h
-#define Parser_h
+#pragma once
 
 #include "ExceptionHelpers.h"
 #include "Executable.h"
@@ -1397,8 +1396,8 @@
     template <class TreeBuilder> TreeProperty parseProperty(TreeBuilder&, bool strict);
     template <class TreeBuilder> TreeExpression parsePropertyMethod(TreeBuilder& context, const Identifier* methodName, bool isGenerator);
     template <class TreeBuilder> TreeProperty parseGetterSetter(TreeBuilder&, bool strict, PropertyNode::Type, unsigned getterOrSetterStartOffset, ConstructorKind, bool isClassProperty);
-    template <class TreeBuilder> ALWAYS_INLINE TreeFunctionBody parseFunctionBody(TreeBuilder&, SyntaxChecker&, const JSTokenLocation&, int, int functionKeywordStart, int functionNameStart, int parametersStart, ConstructorKind, SuperBinding, FunctionBodyType, unsigned, SourceParseMode);
-    template <class TreeBuilder> ALWAYS_INLINE bool parseFormalParameters(TreeBuilder&, TreeFormalParameterList, unsigned&);
+    template <class TreeBuilder> ALWAYS_INLINE TreeFunctionBody parseFunctionBody(TreeBuilder&, SyntaxChecker&, const JSTokenLocation&, int, int functionKeywordStart, int functionNameStart, int parametersStart, ConstructorKind, SuperBinding, FunctionBodyType, unsigned, unsigned, SourceParseMode);
+    template <class TreeBuilder> ALWAYS_INLINE bool parseFormalParameters(TreeBuilder&, TreeFormalParameterList, unsigned&, unsigned&);
     enum VarDeclarationListContext { ForLoopContext, VarDeclarationContext };
     template <class TreeBuilder> TreeExpression parseVariableDeclarationList(TreeBuilder&, int& declarations, TreeDestructuringPattern& lastPattern, TreeExpression& lastInitializer, JSTextPosition& identStart, JSTextPosition& initStart, JSTextPosition& initEnd, VarDeclarationListContext, DeclarationType, ExportType, bool& forLoopConstDoesNotHaveInitializer);
     template <class TreeBuilder> TreeSourceElements parseArrowFunctionSingleExpressionBodySourceElements(TreeBuilder&);
@@ -1741,4 +1740,3 @@
 }
 
 } // namespace
-#endif

Modified: trunk/Source/_javascript_Core/parser/ParserFunctionInfo.h (206267 => 206268)


--- trunk/Source/_javascript_Core/parser/ParserFunctionInfo.h	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/parser/ParserFunctionInfo.h	2016-09-22 19:11:23 UTC (rev 206268)
@@ -23,8 +23,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef ParserFunctionInfo_h
-#define ParserFunctionInfo_h
+#pragma once
 
 namespace JSC {
 
@@ -33,6 +32,7 @@
     const Identifier* name = 0;
     typename TreeBuilder::FunctionBody body = 0;
     unsigned parameterCount = 0;
+    unsigned functionLength = 0;
     unsigned startOffset = 0;
     unsigned endOffset = 0;
     int startLine = 0;
@@ -50,5 +50,3 @@
 };
 
 }
-
-#endif

Modified: trunk/Source/_javascript_Core/parser/SourceProviderCacheItem.h (206267 => 206268)


--- trunk/Source/_javascript_Core/parser/SourceProviderCacheItem.h	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/parser/SourceProviderCacheItem.h	2016-09-22 19:11:23 UTC (rev 206268)
@@ -41,6 +41,7 @@
     unsigned lastTokenLineStartOffset;
     unsigned endFunctionOffset;
     unsigned parameterCount;
+    unsigned functionLength;
     bool needsFullActivation;
     bool usesEval;
     bool strictMode;
@@ -88,6 +89,7 @@
     unsigned constructorKind : 2; // ConstructorKind
     unsigned parameterCount : 31;
     unsigned expectedSuperBinding : 1; // SuperBinding
+    unsigned functionLength;
     unsigned lastTokenLineStartOffset;
     unsigned usedVariablesCount;
     InnerArrowFunctionCodeFeatures innerArrowFunctionFeatures;
@@ -128,6 +130,7 @@
     , constructorKind(static_cast<unsigned>(parameters.constructorKind))
     , parameterCount(parameters.parameterCount)
     , expectedSuperBinding(static_cast<unsigned>(parameters.expectedSuperBinding))
+    , functionLength(parameters.functionLength)
     , lastTokenLineStartOffset(parameters.lastTokenLineStartOffset)
     , usedVariablesCount(parameters.usedVariables.size())
     , innerArrowFunctionFeatures(parameters.innerArrowFunctionFeatures)

Modified: trunk/Source/_javascript_Core/parser/SyntaxChecker.h (206267 => 206268)


--- trunk/Source/_javascript_Core/parser/SyntaxChecker.h	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/parser/SyntaxChecker.h	2016-09-22 19:11:23 UTC (rev 206268)
@@ -184,7 +184,7 @@
     ExpressionType createYield(const JSTokenLocation&, ExpressionType, bool, int, int, int) { return YieldExpr; }
     ClassExpression createClassExpr(const JSTokenLocation&, const ParserClassInfo<SyntaxChecker>&, VariableEnvironment&, ExpressionType, ExpressionType, PropertyList, PropertyList) { return ClassExpr; }
     ExpressionType createFunctionExpr(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; }
-    int createFunctionMetadata(const JSTokenLocation&, const JSTokenLocation&, int, int, bool, int, int, int, ConstructorKind, SuperBinding, unsigned, SourceParseMode, bool, InnerArrowFunctionCodeFeatures = NoInnerArrowFunctionFeatures) { return FunctionBodyResult; }
+    int createFunctionMetadata(const JSTokenLocation&, const JSTokenLocation&, int, int, bool, int, int, int, ConstructorKind, SuperBinding, unsigned, int, SourceParseMode, bool, InnerArrowFunctionCodeFeatures = NoInnerArrowFunctionFeatures) { return FunctionBodyResult; }
     ExpressionType createArrowFunctionExpr(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; }
     ExpressionType createMethodDefinition(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; }
     void setFunctionNameStart(int, int) { }

Modified: trunk/Source/_javascript_Core/runtime/Executable.h (206267 => 206268)


--- trunk/Source/_javascript_Core/runtime/Executable.h	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/runtime/Executable.h	2016-09-22 19:11:23 UTC (rev 206268)
@@ -657,7 +657,8 @@
     const Identifier& name() { return m_unlinkedExecutable->name(); }
     const Identifier& ecmaName() { return m_unlinkedExecutable->ecmaName(); }
     const Identifier& inferredName() { return m_unlinkedExecutable->inferredName(); }
-    size_t parameterCount() const { return m_unlinkedExecutable->parameterCount(); } // Excluding 'this'!
+    unsigned parameterCount() const { return m_unlinkedExecutable->parameterCount(); } // Excluding 'this'!
+    unsigned functionLength() const { return m_unlinkedExecutable->functionLength(); }
     SourceParseMode parseMode() const { return m_unlinkedExecutable->parseMode(); }
     JSParserCommentMode commentMode() const { return m_unlinkedExecutable->commentMode(); }
     const SourceCode& classSource() const { return m_unlinkedExecutable->classSource(); }

Modified: trunk/Source/_javascript_Core/runtime/JSFunction.cpp (206267 => 206268)


--- trunk/Source/_javascript_Core/runtime/JSFunction.cpp	2016-09-22 18:59:47 UTC (rev 206267)
+++ trunk/Source/_javascript_Core/runtime/JSFunction.cpp	2016-09-22 19:11:23 UTC (rev 206268)
@@ -114,7 +114,7 @@
 {
     JSFunction* function = create(vm, executable, globalObject);
     function->putDirect(vm, vm.propertyNames->name, jsString(&vm, executable->name().string()), ReadOnly | DontEnum);
-    function->putDirect(vm, vm.propertyNames->length, jsNumber(executable->parameterCount()), ReadOnly | DontEnum);
+    function->putDirect(vm, vm.propertyNames->length, jsNumber(executable->functionLength()), ReadOnly | DontEnum);
     return function;
 }
 
@@ -122,7 +122,7 @@
 {
     JSFunction* function = create(vm, executable, globalObject);
     function->putDirect(vm, vm.propertyNames->name, jsString(&vm, name), ReadOnly | DontEnum);
-    function->putDirect(vm, vm.propertyNames->length, jsNumber(executable->parameterCount()), ReadOnly | DontEnum);
+    function->putDirect(vm, vm.propertyNames->length, jsNumber(executable->functionLength()), ReadOnly | DontEnum);
     return function;
 }
 
@@ -627,7 +627,7 @@
 
     ASSERT(!hasReifiedLength());
     ASSERT(!isHostFunction());
-    JSValue initialValue = jsNumber(jsExecutable()->parameterCount());
+    JSValue initialValue = jsNumber(jsExecutable()->functionLength());
     unsigned initialAttributes = DontEnum | ReadOnly;
     const Identifier& identifier = vm.propertyNames->length;
     putDirect(vm, identifier, initialValue, initialAttributes);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to