Skip to content

Commit

Permalink
Merge branch 'master' into regexp-match-indices
Browse files Browse the repository at this point in the history
  • Loading branch information
leobalter authored Sep 18, 2019
2 parents 85db19d + c41a8ac commit ca88c5c
Show file tree
Hide file tree
Showing 137 changed files with 3,069 additions and 1,615 deletions.
2 changes: 0 additions & 2 deletions INTERPRETING.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ properties of the global scope prior to test execution.
Completion{[[Type]]: throw, [[Value]]: error, [[Target]]: empty}.
5. Let status be ScriptEvaluation(s).
6. Return Completion(status).

- **`gc`** - a function that wraps the host's garbage collection invocation mechanism, if such a capability exists. Must throw an exception if no capability exists. This is necessary for testing the semantics of any feature that relies on garbage collection, e.g. the `WeakRef` API.
- **`global`** - a reference to the global object on which `$262` was initially defined
- **`IsHTMLDDA`** - (present only in implementations that can provide it) an
object that 1) has an [[IsHTMLDDA]] internal slot, and 2) when called with
Expand Down
1 change: 0 additions & 1 deletion features.txt
Original file line number Diff line number Diff line change
Expand Up @@ -236,4 +236,3 @@ WeakSet
# object, go here.

IsHTMLDDA
host-gc-required
20 changes: 16 additions & 4 deletions harness/assert.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ function assert(mustBeTrue, message) {
}

if (message === undefined) {
message = 'Expected true but got ' + String(mustBeTrue);
message = 'Expected true but got ' + assert._toString(mustBeTrue);
}
$ERROR(message);
}
Expand Down Expand Up @@ -45,7 +45,7 @@ assert.sameValue = function (actual, expected, message) {
message += ' ';
}

message += 'Expected SameValue(«' + String(actual) + '», «' + String(expected) + '») to be true';
message += 'Expected SameValue(«' + assert._toString(actual) + '», «' + assert._toString(expected) + '») to be true';

$ERROR(message);
};
Expand All @@ -61,7 +61,7 @@ assert.notSameValue = function (actual, unexpected, message) {
message += ' ';
}

message += 'Expected SameValue(«' + String(actual) + '», «' + String(unexpected) + '») to be false';
message += 'Expected SameValue(«' + assert._toString(actual) + '», «' + assert._toString(unexpected) + '») to be false';

$ERROR(message);
};
Expand Down Expand Up @@ -145,4 +145,16 @@ assert._formatValue = function(value, seen) {
default:
return typeof value;
}
};
};

assert._toString = function (value) {
try {
return String(value);
} catch (err) {
if (err.name === 'TypeError') {
return Object.prototype.toString.call(value);
}

throw err;
}
};
42 changes: 42 additions & 0 deletions src/class-elements/fields-anonymous-function-length.case
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
desc: Anonymous function in field initilizer have length properly set
info: |
Updated Productions

FieldDefinition :
ClassElementName Initializer_opt

InitializeInstanceFields ( O, constructor )
1. Assert: Type ( O ) is Object.
2. Assert: constructor is an ECMAScript function object.
3. Let fields be the value of constructor.[[Fields]].
4. For each item fieldRecord in order from fields,
a. Perform ? DefineField(O, fieldRecord).
5. Return.

DefineField(receiver, fieldRecord)
1. Assert: Type(receiver) is Object.
2. Assert: fieldRecord is a Record as created by ClassFieldDefinitionEvaluation.
3. Let name be fieldRecord.[[Name]].
4. Let initializer be fieldRecord.[[Initializer]].
5. If initializer is not empty, then
a. Let initValue be ? Call(initializer, receiver).
...
template: default
features: [class-static-fields-private, class-static-fields-public]
---*/

//- elements
field = function() {};
#field = (a, b, c, d) => undefined;

accessPrivateField() {
return this.#field;
}
//- assertions
let c = new C();
assert.sameValue(c.accessPrivateField().length, 4);
assert.sameValue(c.field.length, 0);
55 changes: 55 additions & 0 deletions src/class-elements/private-async-generator-method-name.case
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
desc: Private async generators methods have name property properly configured
info: |
Updated Productions

ClassElement : MethodDefinition
1. Return ClassElementEvaluation of MethodDefinition with arguments ! Get(homeObject, "prototype"),enumerable, and "prototype".

ClassElement : MethodDefinition
ClassElement : static MethodDefinition
1. Perform ? PropertyDefinitionEvaluation with parameters object and enumerable.
2. Return empty.

AsyncMethod : async [no LineTerminator here] * ClassElementName (UniqueFormalParameters) { AsyncFunctionBody }
1. Let propKey be the result of evaluating ClassElementName.
...
12. Perform ? DefineOrdinaryMethod(key, homeObject, closure, enumerable).

ClassElementName : PrivateIdentifier
1. Let bindingName be StringValue of PrivateIdentifier.
...
5. If scopeEnvRec's binding for bindingName is uninitialized,
a. Let field be NewPrivateName(bindingName).
b. Perform ! scopeEnvRec.InitializeBinding(bindingName, field).
6. Otherwise,
a. Let field be scopeEnvRec.GetBindingValue(bindingName).
7. Assert: field.[[Description]] is bindingName.
8. Return field.

DefineOrdinaryMethod(key, homeObject, closure, enumerable)
1. Perform SetFunctionName(closure, key).
2. If key is a Private Name,
a. Assert: key does not have a [[Kind]] field.
b. Set key.[[Kind]] to "method".
c. Set key.[[Value]] to closure.
d. Set key.[[Brand]] to homeObject.
3. Else,
a. Let desc be the PropertyDescriptor{[[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true}.
b. Perform ? DefinePropertyOrThrow(homeObject, key, desc).
template: default
features: [class-methods-private]
---*/

//- elements
async * #method() {};

getPrivateMethod() {
return this.#method;
}
//- assertions
let c = new C();
assert.sameValue(c.getPrivateMethod().name, "#method");
55 changes: 55 additions & 0 deletions src/class-elements/private-async-method-name.case
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
desc: Private async methods have name property properly configured
info: |
Updated Productions

ClassElement : MethodDefinition
1. Return ClassElementEvaluation of MethodDefinition with arguments ! Get(homeObject, "prototype"),enumerable, and "prototype".

ClassElement : MethodDefinition
ClassElement : static MethodDefinition
1. Perform ? PropertyDefinitionEvaluation with parameters object and enumerable.
2. Return empty.

AsyncMethod : async [no LineTerminator here] ClassElementName (UniqueFormalParameters) { AsyncFunctionBody }
1. Let propKey be the result of evaluating ClassElementName.
...
10. Perform ? DefineOrdinaryMethod(key, homeObject, closure, enumerable).

ClassElementName : PrivateIdentifier
1. Let bindingName be StringValue of PrivateIdentifier.
...
5. If scopeEnvRec's binding for bindingName is uninitialized,
a. Let field be NewPrivateName(bindingName).
b. Perform ! scopeEnvRec.InitializeBinding(bindingName, field).
6. Otherwise,
a. Let field be scopeEnvRec.GetBindingValue(bindingName).
7. Assert: field.[[Description]] is bindingName.
8. Return field.

DefineOrdinaryMethod(key, homeObject, closure, enumerable)
1. Perform SetFunctionName(closure, key).
2. If key is a Private Name,
a. Assert: key does not have a [[Kind]] field.
b. Set key.[[Kind]] to "method".
c. Set key.[[Value]] to closure.
d. Set key.[[Brand]] to homeObject.
3. Else,
a. Let desc be the PropertyDescriptor{[[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true}.
b. Perform ? DefinePropertyOrThrow(homeObject, key, desc).
template: default
features: [class-methods-private]
---*/

//- elements
async #method() {};

getPrivateMethod() {
return this.#method;
}
//- assertions
let c = new C();
assert.sameValue(c.getPrivateMethod().name, "#method");
55 changes: 55 additions & 0 deletions src/class-elements/private-generator-method-name.case
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
desc: Private generator methods have name property properly configured
info: |
Updated Productions

ClassElement : MethodDefinition
1. Return ClassElementEvaluation of MethodDefinition with arguments ! Get(homeObject, "prototype"),enumerable, and "prototype".

GeneratorMethod : * ClassElementName (UniqueFormalParameters) { GeneratorBody }
1. Let key be the result of evaluating ClassElementName.
...
12. Return DefineOrdinaryMethod(key, homeObject, closure, enumerable).

ClassElement : MethodDefinition
ClassElement : static MethodDefinition
1. Perform ? PropertyDefinitionEvaluation with parameters object and enumerable.
2. Return empty.

ClassElementName : PrivateIdentifier
1. Let bindingName be StringValue of PrivateIdentifier.
...
5. If scopeEnvRec's binding for bindingName is uninitialized,
a. Let field be NewPrivateName(bindingName).
b. Perform ! scopeEnvRec.InitializeBinding(bindingName, field).
6. Otherwise,
a. Let field be scopeEnvRec.GetBindingValue(bindingName).
7. Assert: field.[[Description]] is bindingName.
8. Return field.

DefineOrdinaryMethod(key, homeObject, closure, enumerable)
1. Perform SetFunctionName(closure, key).
2. If key is a Private Name,
a. Assert: key does not have a [[Kind]] field.
b. Set key.[[Kind]] to "method".
c. Set key.[[Value]] to closure.
d. Set key.[[Brand]] to homeObject.
3. Else,
a. Let desc be the PropertyDescriptor{[[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true}.
b. Perform ? DefinePropertyOrThrow(homeObject, key, desc).
template: default
features: [class-methods-private]
---*/

//- elements
* #method() {};

getPrivateMethod() {
return this.#method;
}
//- assertions
let c = new C();
assert.sameValue(c.getPrivateMethod().name, "#method");
43 changes: 43 additions & 0 deletions src/class-elements/private-method-length.case
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
desc: Private methods have length property properly configured
info: |
Updated Productions

ClassElement : MethodDefinition
1. Return ClassElementEvaluation of MethodDefinition with arguments ! Get(homeObject, "prototype"),enumerable, and "prototype".

ClassElement : static MethodDefinition
1. Return ClassElementEvaluation of MethodDefinition with arguments homeObject, enumerable and "static".

MethodDefinition : ClassElementName( UniqueFormalParameters ) { FunctionBody }
1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject.
2. ReturnIfAbrupt(methodDef).
3. Perform ? DefineOrdinaryMethod(methodDef.[[Key]], homeObject, methodDef.[[Closure]], _enumerable).

ClassElement : MethodDefinition
ClassElement : static MethodDefinition
1. Perform ? PropertyDefinitionEvaluation with parameters object and enumerable.
2. Return empty.

MethodDefinition : ClassElementName (UniqueFormalParameters) { FunctionBody }
...
8. Let closure be FunctionCreate(kind, UniqueFormalParameters, FunctionBody, scope, privateScope, strict, prototype).
9. Perform MakeMethod(closure, object).
10. Return the Record{[[Key]]: propKey, [[Closure]]: closure}.
template: default
features: [class-methods-private]
---*/

//- elements
#method(a) {};

getPrivateMethod() {
return this.#method;
}

//- assertions
let c = new C();
assert.sameValue(c.getPrivateMethod().length, 1);
56 changes: 56 additions & 0 deletions src/class-elements/private-static-async-generator-method-name.case
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
desc: Private static async generator methods have name property properly configured
info: |
Updated Productions

ClassElement : MethodDefinition
1. Return ClassElementEvaluation of MethodDefinition with arguments ! Get(homeObject, "prototype"),enumerable, and "prototype".

ClassElement : static MethodDefinition
1. Return ClassElementEvaluation of MethodDefinition with arguments homeObject, enumerable and "static".

AsyncMethod : async [no LineTerminator here] * ClassElementName (UniqueFormalParameters) { AsyncFunctionBody }
...
12. Perform ? DefineOrdinaryMethod(key, homeObject, closure, _enumerable).

ClassElement : MethodDefinition
ClassElement : static MethodDefinition
1. Perform ? PropertyDefinitionEvaluation with parameters object and enumerable.
2. Return empty.

ClassElementName : PrivateIdentifier
1. Let bindingName be StringValue of PrivateIdentifier.
...
5. If scopeEnvRec's binding for bindingName is uninitialized,
a. Let field be NewPrivateName(bindingName).
b. Perform ! scopeEnvRec.InitializeBinding(bindingName, field).
6. Otherwise,
a. Let field be scopeEnvRec.GetBindingValue(bindingName).
7. Assert: field.[[Description]] is bindingName.
8. Return field.

DefineOrdinaryMethod(key, homeObject, closure, enumerable)
1. Perform SetFunctionName(closure, key).
2. If key is a Private Name,
a. Assert: key does not have a [[Kind]] field.
b. Set key.[[Kind]] to "method".
c. Set key.[[Value]] to closure.
d. Set key.[[Brand]] to homeObject.
3. Else,
a. Let desc be the PropertyDescriptor{[[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true}.
b. Perform ? DefinePropertyOrThrow(homeObject, key, desc).
template: default
features: [class-static-methods-private]
---*/

//- elements
static async * #method() {};

static getPrivateMethod() {
return this.#method;
}
//- assertions
assert.sameValue(C.getPrivateMethod().name, "#method");
Loading

0 comments on commit ca88c5c

Please sign in to comment.