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);