From 7e3019e382bfd231f8e9c2506ea097d751b9d5e4 Mon Sep 17 00:00:00 2001
From: Mike Pennisi <mike@mikepennisi.com>
Date: Tue, 31 May 2016 17:30:41 -0400
Subject: [PATCH] Add tests for function length with dflt parameters

---
 .../default-parameters/function-length.js     | 26 -------
 .../expressions/arrow-function/length-dflt.js | 60 +++++++++++++++++
 .../class/gen-method-length-dflt.js           | 59 ++++++++++++++++
 .../expressions/class/getter-param-dflt.js    | 19 ++++++
 .../expressions/class/method-length-dflt.js   | 59 ++++++++++++++++
 .../expressions/class/setter-length-dflt.js   | 39 +++++++++++
 .../class/static-method-length-dflt.js        | 59 ++++++++++++++++
 .../expressions/function/length-dflt.js       | 60 +++++++++++++++++
 .../expressions/generators/length-dflt.js     | 60 +++++++++++++++++
 .../expressions/object/getter-param-dflt.js   | 19 ++++++
 .../generator-length-dflt.js                  | 60 +++++++++++++++++
 .../method-definition/name-length-dflt.js     | 60 +++++++++++++++++
 .../expressions/object/setter-length-dflt.js  | 39 +++++++++++
 .../class/gen-method-length-dflt.js           | 67 +++++++++++++++++++
 .../statements/class/getter-param-dflt.js     | 19 ++++++
 .../statements/class/method-length-dflt.js    | 67 +++++++++++++++++++
 .../statements/class/setter-length-dflt.js    | 39 +++++++++++
 .../class/static-method-length-dflt.js        | 67 +++++++++++++++++++
 .../statements/function/length-dflt.js        | 60 +++++++++++++++++
 .../statements/generators/length-dflt.js      | 60 +++++++++++++++++
 20 files changed, 972 insertions(+), 26 deletions(-)
 delete mode 100644 test/language/default-parameters/function-length.js
 create mode 100644 test/language/expressions/arrow-function/length-dflt.js
 create mode 100644 test/language/expressions/class/gen-method-length-dflt.js
 create mode 100644 test/language/expressions/class/getter-param-dflt.js
 create mode 100644 test/language/expressions/class/method-length-dflt.js
 create mode 100644 test/language/expressions/class/setter-length-dflt.js
 create mode 100644 test/language/expressions/class/static-method-length-dflt.js
 create mode 100644 test/language/expressions/function/length-dflt.js
 create mode 100644 test/language/expressions/generators/length-dflt.js
 create mode 100644 test/language/expressions/object/getter-param-dflt.js
 create mode 100644 test/language/expressions/object/method-definition/generator-length-dflt.js
 create mode 100644 test/language/expressions/object/method-definition/name-length-dflt.js
 create mode 100644 test/language/expressions/object/setter-length-dflt.js
 create mode 100644 test/language/statements/class/gen-method-length-dflt.js
 create mode 100644 test/language/statements/class/getter-param-dflt.js
 create mode 100644 test/language/statements/class/method-length-dflt.js
 create mode 100644 test/language/statements/class/setter-length-dflt.js
 create mode 100644 test/language/statements/class/static-method-length-dflt.js
 create mode 100644 test/language/statements/function/length-dflt.js
 create mode 100644 test/language/statements/generators/length-dflt.js

diff --git a/test/language/default-parameters/function-length.js b/test/language/default-parameters/function-length.js
deleted file mode 100644
index c26f313a6e..0000000000
--- a/test/language/default-parameters/function-length.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-/*---
-es6id: 14.1.6
-description: >
-  Default parameters' effect on function length
-info: >
-  Function length is counted by the non initialized parameters in the left.
-
-  FormalsList : FormalParameter
-
-    1. If HasInitializer of FormalParameter is true return 0
-    2. Return 1.
-
-  FormalsList : FormalsList , FormalParameter
-
-    1. Let count be the ExpectedArgumentCount of FormalsList.
-    2. If HasInitializer of FormalsList is true or HasInitializer of
-    FormalParameter is true, return count.
-    3. Return count+1.
----*/
-
-assert.sameValue((function (x = 42) {}).length, 0);
-assert.sameValue((function (x = 42, y) {}).length, 0);
-assert.sameValue((function (x, y = 42) {}).length, 1);
-assert.sameValue((function (x, y = 42, z) {}).length, 1);
diff --git a/test/language/expressions/arrow-function/length-dflt.js b/test/language/expressions/arrow-function/length-dflt.js
new file mode 100644
index 0000000000..b06e5b1d5a
--- /dev/null
+++ b/test/language/expressions/arrow-function/length-dflt.js
@@ -0,0 +1,60 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+
+var f1 = (x = 42) => {};
+
+assert.sameValue(f1.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(f1, 'length');
+verifyNotWritable(f1, 'length');
+verifyConfigurable(f1, 'length');
+
+var f2 = (x = 42, y) => {};
+
+assert.sameValue(f2.length, 0, 'FormalsList: x = 42, y');
+verifyNotEnumerable(f2, 'length');
+verifyNotWritable(f2, 'length');
+verifyConfigurable(f2, 'length');
+
+var f3 = (x, y = 42) => {};
+
+assert.sameValue(f3.length, 1, 'FormalsList: x, y = 42');
+verifyNotEnumerable(f3, 'length');
+verifyNotWritable(f3, 'length');
+verifyConfigurable(f3, 'length');
+
+var f4 = (x, y = 42, z) => {};
+
+assert.sameValue(f4.length, 1, 'FormalsList: x, y = 42, z');
+verifyNotEnumerable(f4, 'length');
+verifyNotWritable(f4, 'length');
+verifyConfigurable(f4, 'length');
diff --git a/test/language/expressions/class/gen-method-length-dflt.js b/test/language/expressions/class/gen-method-length-dflt.js
new file mode 100644
index 0000000000..0de44b844c
--- /dev/null
+++ b/test/language/expressions/class/gen-method-length-dflt.js
@@ -0,0 +1,59 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+var m1 = class { *m(x = 42) {} }.prototype.m;
+
+assert.sameValue(m1.length, 0, 'formalslist: x = 42');
+verifyNotEnumerable(m1, 'length');
+verifyNotWritable(m1, 'length');
+verifyConfigurable(m1, 'length');
+
+var m2 = class { *m(x = 42, y) {} }.prototype.m;
+
+assert.sameValue(m2.length, 0, 'formalslist: x = 42, y');
+verifyNotEnumerable(m2, 'length');
+verifyNotWritable(m2, 'length');
+verifyConfigurable(m2, 'length');
+
+var m3 = class { *m(x, y = 42) {} }.prototype.m;
+
+assert.sameValue(m3.length, 1, 'formalslist: x, y = 42');
+verifyNotEnumerable(m3, 'length');
+verifyNotWritable(m3, 'length');
+verifyConfigurable(m3, 'length');
+
+var m4 = class { *m(x, y = 42, z) {} }.prototype.m;
+
+assert.sameValue(m4.length, 1, 'formalslist: x, y = 42, z');
+verifyNotEnumerable(m4, 'length');
+verifyNotWritable(m4, 'length');
+verifyConfigurable(m4, 'length');
diff --git a/test/language/expressions/class/getter-param-dflt.js b/test/language/expressions/class/getter-param-dflt.js
new file mode 100644
index 0000000000..a6cbb974ec
--- /dev/null
+++ b/test/language/expressions/class/getter-param-dflt.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-method-definitions
+es6id: 14.3
+description: >
+  Get accessor method may not have a formal parameter (regardless of the
+  presence of an initializer)
+info: |
+  Syntax
+
+  MethodDefinition[Yield] :
+
+    get PropertyName[?Yield] ( ) { FunctionBody }
+features: [default-parameters]
+negative: SyntaxError
+---*/
+
+0, class { get a(param = null) {} };
diff --git a/test/language/expressions/class/method-length-dflt.js b/test/language/expressions/class/method-length-dflt.js
new file mode 100644
index 0000000000..7d86f69902
--- /dev/null
+++ b/test/language/expressions/class/method-length-dflt.js
@@ -0,0 +1,59 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+var m1 = class { m(x = 42) {} }.prototype.m;
+
+assert.sameValue(m1.length, 0, 'formalslist: x = 42');
+verifyNotEnumerable(m1, 'length');
+verifyNotWritable(m1, 'length');
+verifyConfigurable(m1, 'length');
+
+var m2 = class { m(x = 42, y) {} }.prototype.m;
+
+assert.sameValue(m2.length, 0, 'formalslist: x = 42, y');
+verifyNotEnumerable(m2, 'length');
+verifyNotWritable(m2, 'length');
+verifyConfigurable(m2, 'length');
+
+var m3 = class { m(x, y = 42) {} }.prototype.m;
+
+assert.sameValue(m3.length, 1, 'formalslist: x, y = 42');
+verifyNotEnumerable(m3, 'length');
+verifyNotWritable(m3, 'length');
+verifyConfigurable(m3, 'length');
+
+var m4 = class { m(x, y = 42, z) {} }.prototype.m;
+
+assert.sameValue(m4.length, 1, 'formalslist: x, y = 42, z');
+verifyNotEnumerable(m4, 'length');
+verifyNotWritable(m4, 'length');
+verifyConfigurable(m4, 'length');
diff --git a/test/language/expressions/class/setter-length-dflt.js b/test/language/expressions/class/setter-length-dflt.js
new file mode 100644
index 0000000000..49ec1512dc
--- /dev/null
+++ b/test/language/expressions/class/setter-length-dflt.js
@@ -0,0 +1,39 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+var C = class { set m(x = 42) {} };
+var set = Object.getOwnPropertyDescriptor(C.prototype, 'm').set;
+
+assert.sameValue(set.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(set, 'length');
+verifyNotWritable(set, 'length');
+verifyConfigurable(set, 'length');
diff --git a/test/language/expressions/class/static-method-length-dflt.js b/test/language/expressions/class/static-method-length-dflt.js
new file mode 100644
index 0000000000..4e638ef2ad
--- /dev/null
+++ b/test/language/expressions/class/static-method-length-dflt.js
@@ -0,0 +1,59 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+var m1 = class { static m(x = 42) {} }.m;
+
+assert.sameValue(m1.length, 0, 'formalslist: x = 42');
+verifyNotEnumerable(m1, 'length');
+verifyNotWritable(m1, 'length');
+verifyConfigurable(m1, 'length');
+
+var m2 = class { static m(x = 42, y) {} }.m;
+
+assert.sameValue(m2.length, 0, 'formalslist: x = 42, y');
+verifyNotEnumerable(m2, 'length');
+verifyNotWritable(m2, 'length');
+verifyConfigurable(m2, 'length');
+
+var m3 = class { static m(x, y = 42) {} }.m;
+
+assert.sameValue(m3.length, 1, 'formalslist: x, y = 42');
+verifyNotEnumerable(m3, 'length');
+verifyNotWritable(m3, 'length');
+verifyConfigurable(m3, 'length');
+
+var m4 = class { static m(x, y = 42, z) {} }.m;
+
+assert.sameValue(m4.length, 1, 'formalslist: x, y = 42, z');
+verifyNotEnumerable(m4, 'length');
+verifyNotWritable(m4, 'length');
+verifyConfigurable(m4, 'length');
diff --git a/test/language/expressions/function/length-dflt.js b/test/language/expressions/function/length-dflt.js
new file mode 100644
index 0000000000..724e8f7443
--- /dev/null
+++ b/test/language/expressions/function/length-dflt.js
@@ -0,0 +1,60 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+
+var f1 = function (x = 42) {};
+
+assert.sameValue(f1.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(f1, 'length');
+verifyNotWritable(f1, 'length');
+verifyConfigurable(f1, 'length');
+
+var f2 = function (x = 42, y) {};
+
+assert.sameValue(f2.length, 0, 'FormalsList: x = 42, y');
+verifyNotEnumerable(f2, 'length');
+verifyNotWritable(f2, 'length');
+verifyConfigurable(f2, 'length');
+
+var f3 = function (x, y = 42) {};
+
+assert.sameValue(f3.length, 1, 'FormalsList: x, y = 42');
+verifyNotEnumerable(f3, 'length');
+verifyNotWritable(f3, 'length');
+verifyConfigurable(f3, 'length');
+
+var f4 = function (x, y = 42, z) {};
+
+assert.sameValue(f4.length, 1, 'FormalsList: x, y = 42, z');
+verifyNotEnumerable(f4, 'length');
+verifyNotWritable(f4, 'length');
+verifyConfigurable(f4, 'length');
diff --git a/test/language/expressions/generators/length-dflt.js b/test/language/expressions/generators/length-dflt.js
new file mode 100644
index 0000000000..8ea33c7934
--- /dev/null
+++ b/test/language/expressions/generators/length-dflt.js
@@ -0,0 +1,60 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+
+var f1 = function* (x = 42) {};
+
+assert.sameValue(f1.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(f1, 'length');
+verifyNotWritable(f1, 'length');
+verifyConfigurable(f1, 'length');
+
+var f2 = function* (x = 42, y) {};
+
+assert.sameValue(f2.length, 0, 'FormalsList: x = 42, y');
+verifyNotEnumerable(f2, 'length');
+verifyNotWritable(f2, 'length');
+verifyConfigurable(f2, 'length');
+
+var f3 = function* (x, y = 42) {};
+
+assert.sameValue(f3.length, 1, 'FormalsList: x, y = 42');
+verifyNotEnumerable(f3, 'length');
+verifyNotWritable(f3, 'length');
+verifyConfigurable(f3, 'length');
+
+var f4 = function* (x, y = 42, z) {};
+
+assert.sameValue(f4.length, 1, 'FormalsList: x, y = 42, z');
+verifyNotEnumerable(f4, 'length');
+verifyNotWritable(f4, 'length');
+verifyConfigurable(f4, 'length');
diff --git a/test/language/expressions/object/getter-param-dflt.js b/test/language/expressions/object/getter-param-dflt.js
new file mode 100644
index 0000000000..12d1a159a4
--- /dev/null
+++ b/test/language/expressions/object/getter-param-dflt.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-method-definitions
+es6id: 14.3
+description: >
+  Get accessor method may not have a formal parameter (regardless of the
+  presence of an initializer)
+info: |
+  Syntax
+
+  MethodDefinition[Yield] :
+
+    get PropertyName[?Yield] ( ) { FunctionBody }
+features: [default-parameters]
+negative: SyntaxError
+---*/
+
+0, { get a(param = null) {} };
diff --git a/test/language/expressions/object/method-definition/generator-length-dflt.js b/test/language/expressions/object/method-definition/generator-length-dflt.js
new file mode 100644
index 0000000000..97cfe97971
--- /dev/null
+++ b/test/language/expressions/object/method-definition/generator-length-dflt.js
@@ -0,0 +1,60 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+
+var f1 = { *m(x = 42) {} }.m;
+
+assert.sameValue(f1.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(f1, 'length');
+verifyNotWritable(f1, 'length');
+verifyConfigurable(f1, 'length');
+
+var f2 = { *m(x = 42, y) {} }.m;
+
+assert.sameValue(f2.length, 0, 'FormalsList: x = 42, y');
+verifyNotEnumerable(f2, 'length');
+verifyNotWritable(f2, 'length');
+verifyConfigurable(f2, 'length');
+
+var f3 = { *m(x, y = 42) {} }.m;
+
+assert.sameValue(f3.length, 1, 'FormalsList: x, y = 42');
+verifyNotEnumerable(f3, 'length');
+verifyNotWritable(f3, 'length');
+verifyConfigurable(f3, 'length');
+
+var f4 = { *m(x, y = 42, z) {} }.m;
+
+assert.sameValue(f4.length, 1, 'FormalsList: x, y = 42, z');
+verifyNotEnumerable(f4, 'length');
+verifyNotWritable(f4, 'length');
+verifyConfigurable(f4, 'length')
diff --git a/test/language/expressions/object/method-definition/name-length-dflt.js b/test/language/expressions/object/method-definition/name-length-dflt.js
new file mode 100644
index 0000000000..91db6172ad
--- /dev/null
+++ b/test/language/expressions/object/method-definition/name-length-dflt.js
@@ -0,0 +1,60 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+
+var f1 = { m(x = 42) {} }.m;
+
+assert.sameValue(f1.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(f1, 'length');
+verifyNotWritable(f1, 'length');
+verifyConfigurable(f1, 'length');
+
+var f2 = { m(x = 42, y) {} }.m;
+
+assert.sameValue(f2.length, 0, 'FormalsList: x = 42, y');
+verifyNotEnumerable(f2, 'length');
+verifyNotWritable(f2, 'length');
+verifyConfigurable(f2, 'length');
+
+var f3 = { m(x, y = 42) {} }.m;
+
+assert.sameValue(f3.length, 1, 'FormalsList: x, y = 42');
+verifyNotEnumerable(f3, 'length');
+verifyNotWritable(f3, 'length');
+verifyConfigurable(f3, 'length');
+
+var f4 = { m(x, y = 42, z) {} }.m;
+
+assert.sameValue(f4.length, 1, 'FormalsList: x, y = 42, z');
+verifyNotEnumerable(f4, 'length');
+verifyNotWritable(f4, 'length');
+verifyConfigurable(f4, 'length');
diff --git a/test/language/expressions/object/setter-length-dflt.js b/test/language/expressions/object/setter-length-dflt.js
new file mode 100644
index 0000000000..a5e44d602b
--- /dev/null
+++ b/test/language/expressions/object/setter-length-dflt.js
@@ -0,0 +1,39 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+
+var set = Object.getOwnPropertyDescriptor({ set m(x = 42) {} }, 'm').set;
+
+assert.sameValue(set.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(set, 'length');
+verifyNotWritable(set, 'length');
+verifyConfigurable(set, 'length');
diff --git a/test/language/statements/class/gen-method-length-dflt.js b/test/language/statements/class/gen-method-length-dflt.js
new file mode 100644
index 0000000000..a26a287fe7
--- /dev/null
+++ b/test/language/statements/class/gen-method-length-dflt.js
@@ -0,0 +1,67 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+class C1 { *m(x = 42) {} }
+
+var m1 = C1.prototype.m;
+
+assert.sameValue(m1.length, 0, 'formalslist: x = 42');
+verifyNotEnumerable(m1, 'length');
+verifyNotWritable(m1, 'length');
+verifyConfigurable(m1, 'length');
+
+class C2 { *m(x = 42, y) {} }
+
+var m2 = C2.prototype.m;
+
+assert.sameValue(m2.length, 0, 'formalslist: x = 42, y');
+verifyNotEnumerable(m2, 'length');
+verifyNotWritable(m2, 'length');
+verifyConfigurable(m2, 'length');
+
+class C3 { *m(x, y = 42) {} }
+
+var m3 = C3.prototype.m;
+
+assert.sameValue(m3.length, 1, 'formalslist: x, y = 42');
+verifyNotEnumerable(m3, 'length');
+verifyNotWritable(m3, 'length');
+verifyConfigurable(m3, 'length');
+
+class C4 { *m(x, y = 42, z) {} }
+
+var m4 = C4.prototype.m;
+
+assert.sameValue(m4.length, 1, 'formalslist: x, y = 42, z');
+verifyNotEnumerable(m4, 'length');
+verifyNotWritable(m4, 'length');
+verifyConfigurable(m4, 'length');
diff --git a/test/language/statements/class/getter-param-dflt.js b/test/language/statements/class/getter-param-dflt.js
new file mode 100644
index 0000000000..460bec80b8
--- /dev/null
+++ b/test/language/statements/class/getter-param-dflt.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-method-definitions
+es6id: 14.3
+description: >
+  Get accessor method may not have a formal parameter (regardless of the
+  presence of an initializer)
+info: |
+  Syntax
+
+  MethodDefinition[Yield] :
+
+    get PropertyName[?Yield] ( ) { FunctionBody }
+features: [default-parameters]
+negative: SyntaxError
+---*/
+
+class C { get a(param = null) {} }
diff --git a/test/language/statements/class/method-length-dflt.js b/test/language/statements/class/method-length-dflt.js
new file mode 100644
index 0000000000..42a742ed4b
--- /dev/null
+++ b/test/language/statements/class/method-length-dflt.js
@@ -0,0 +1,67 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+class C1 { m(x = 42) {} }
+
+var m1 = C1.prototype.m;
+
+assert.sameValue(m1.length, 0, 'formalslist: x = 42');
+verifyNotEnumerable(m1, 'length');
+verifyNotWritable(m1, 'length');
+verifyConfigurable(m1, 'length');
+
+class C2 { m(x = 42, y) {} }
+
+var m2 = C2.prototype.m;
+
+assert.sameValue(m2.length, 0, 'formalslist: x = 42, y');
+verifyNotEnumerable(m2, 'length');
+verifyNotWritable(m2, 'length');
+verifyConfigurable(m2, 'length');
+
+class C3 { m(x, y = 42) {} }
+
+var m3 = C3.prototype.m;
+
+assert.sameValue(m3.length, 1, 'formalslist: x, y = 42');
+verifyNotEnumerable(m3, 'length');
+verifyNotWritable(m3, 'length');
+verifyConfigurable(m3, 'length');
+
+class C4 { m(x, y = 42, z) {} }
+
+var m4 = C4.prototype.m;
+
+assert.sameValue(m4.length, 1, 'formalslist: x, y = 42, z');
+verifyNotEnumerable(m4, 'length');
+verifyNotWritable(m4, 'length');
+verifyConfigurable(m4, 'length');
diff --git a/test/language/statements/class/setter-length-dflt.js b/test/language/statements/class/setter-length-dflt.js
new file mode 100644
index 0000000000..b6a962d686
--- /dev/null
+++ b/test/language/statements/class/setter-length-dflt.js
@@ -0,0 +1,39 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+class C { set m(x = 42) {} }
+var set = Object.getOwnPropertyDescriptor(C.prototype, 'm').set;
+
+assert.sameValue(set.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(set, 'length');
+verifyNotWritable(set, 'length');
+verifyConfigurable(set, 'length');
diff --git a/test/language/statements/class/static-method-length-dflt.js b/test/language/statements/class/static-method-length-dflt.js
new file mode 100644
index 0000000000..4a008d9fc8
--- /dev/null
+++ b/test/language/statements/class/static-method-length-dflt.js
@@ -0,0 +1,67 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+class C1 { static m(x = 42) {} }
+
+var m1 = C1.m;
+
+assert.sameValue(m1.length, 0, 'formalslist: x = 42');
+verifyNotEnumerable(m1, 'length');
+verifyNotWritable(m1, 'length');
+verifyConfigurable(m1, 'length');
+
+class C2 { static m(x = 42, y) {} }
+
+var m2 = C2.m;
+
+assert.sameValue(m2.length, 0, 'formalslist: x = 42, y');
+verifyNotEnumerable(m2, 'length');
+verifyNotWritable(m2, 'length');
+verifyConfigurable(m2, 'length');
+
+class C3 { static m(x, y = 42) {} }
+
+var m3 = C3.m;
+
+assert.sameValue(m3.length, 1, 'formalslist: x, y = 42');
+verifyNotEnumerable(m3, 'length');
+verifyNotWritable(m3, 'length');
+verifyConfigurable(m3, 'length');
+
+class C4 { static m(x, y = 42, z) {} }
+
+var m4 = C4.m;
+
+assert.sameValue(m4.length, 1, 'formalslist: x, y = 42, z');
+verifyNotEnumerable(m4, 'length');
+verifyNotWritable(m4, 'length');
+verifyConfigurable(m4, 'length');
diff --git a/test/language/statements/function/length-dflt.js b/test/language/statements/function/length-dflt.js
new file mode 100644
index 0000000000..edcc10fb85
--- /dev/null
+++ b/test/language/statements/function/length-dflt.js
@@ -0,0 +1,60 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+
+function f1(x = 42) {}
+
+assert.sameValue(f1.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(f1, 'length');
+verifyNotWritable(f1, 'length');
+verifyConfigurable(f1, 'length');
+
+function f2(x = 42, y) {}
+
+assert.sameValue(f2.length, 0, 'FormalsList: x = 42, y');
+verifyNotEnumerable(f2, 'length');
+verifyNotWritable(f2, 'length');
+verifyConfigurable(f2, 'length');
+
+function f3(x, y = 42) {}
+
+assert.sameValue(f3.length, 1, 'FormalsList: x, y = 42');
+verifyNotEnumerable(f3, 'length');
+verifyNotWritable(f3, 'length');
+verifyConfigurable(f3, 'length');
+
+function f4(x, y = 42, z) {}
+
+assert.sameValue(f4.length, 1, 'FormalsList: x, y = 42, z');
+verifyNotEnumerable(f4, 'length');
+verifyNotWritable(f4, 'length');
+verifyConfigurable(f4, 'length');
diff --git a/test/language/statements/generators/length-dflt.js b/test/language/statements/generators/length-dflt.js
new file mode 100644
index 0000000000..5fbf570467
--- /dev/null
+++ b/test/language/statements/generators/length-dflt.js
@@ -0,0 +1,60 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 14.1.6
+description: >
+  Default parameters' effect on function length
+info: |
+  Function length is counted by the non initialized parameters in the left.
+
+  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)
+
+  [...]
+  2. Let len be the ExpectedArgumentCount of ParameterList.
+  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
+     len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}).
+  [...]
+
+  FormalsList : FormalParameter
+
+    1. If HasInitializer of FormalParameter is true return 0
+    2. Return 1.
+
+  FormalsList : FormalsList , FormalParameter
+
+    1. Let count be the ExpectedArgumentCount of FormalsList.
+    2. If HasInitializer of FormalsList is true or HasInitializer of
+    FormalParameter is true, return count.
+    3. Return count+1.
+features: [default-parameters]
+includes: [propertyHelper.js]
+---*/
+
+
+function* f1(x = 42) {}
+
+assert.sameValue(f1.length, 0, 'FormalsList: x = 42');
+verifyNotEnumerable(f1, 'length');
+verifyNotWritable(f1, 'length');
+verifyConfigurable(f1, 'length');
+
+function* f2(x = 42, y) {}
+
+assert.sameValue(f2.length, 0, 'FormalsList: x = 42, y');
+verifyNotEnumerable(f2, 'length');
+verifyNotWritable(f2, 'length');
+verifyConfigurable(f2, 'length');
+
+function* f3(x, y = 42) {}
+
+assert.sameValue(f3.length, 1, 'FormalsList: x, y = 42');
+verifyNotEnumerable(f3, 'length');
+verifyNotWritable(f3, 'length');
+verifyConfigurable(f3, 'length');
+
+function* f4(x, y = 42, z) {}
+
+assert.sameValue(f4.length, 1, 'FormalsList: x, y = 42, z');
+verifyNotEnumerable(f4, 'length');
+verifyNotWritable(f4, 'length');
+verifyConfigurable(f4, 'length');
-- 
GitLab