-
Notifications
You must be signed in to change notification settings - Fork 461
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add test coverage for correct binding object MOP executions in with-e…
…nvironment
- Loading branch information
Showing
6 changed files
with
408 additions
and
0 deletions.
There are no files selected for viewing
66 changes: 66 additions & 0 deletions
66
test/language/statements/with/get-binding-value-call-with-proxy-env.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
// Copyright (C) 2024 André Bargull. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
|
||
/*--- | ||
esid: sec-object-environment-records-getbindingvalue-n-s | ||
description: > | ||
Lookups in proxy binding object for call expression. | ||
info: | | ||
9.1.1.2.1 HasBinding ( N ) | ||
1. Let bindingObject be envRec.[[BindingObject]]. | ||
2. Let foundBinding be ? HasProperty(bindingObject, N). | ||
3. If foundBinding is false, return false. | ||
... | ||
5. Let unscopables be ? Get(bindingObject, %Symbol.unscopables%). | ||
... | ||
7. Return true. | ||
9.1.1.2.6 GetBindingValue ( N, S ) | ||
1. Let bindingObject be envRec.[[BindingObject]]. | ||
2. Let value be ? HasProperty(bindingObject, N). | ||
3. If value is false, then | ||
a. If S is false, return undefined; otherwise throw a ReferenceError exception. | ||
4. Return ? Get(bindingObject, N). | ||
features: [Proxy, Reflect] | ||
flags: [noStrict] | ||
includes: [compareArray.js, proxyTrapsHelper.js] | ||
---*/ | ||
|
||
var log = []; | ||
|
||
// Environment contains referenced binding. | ||
var env = { | ||
Object, | ||
}; | ||
|
||
var proxy = new Proxy(env, allowProxyTraps({ | ||
has(t, pk) { | ||
log.push("has:" + String(pk)); | ||
return Reflect.has(t, pk); | ||
}, | ||
get(t, pk, r) { | ||
log.push("get:" + String(pk)); | ||
return Reflect.get(t, pk, r); | ||
}, | ||
})); | ||
|
||
with (proxy) { | ||
Object(); | ||
} | ||
|
||
assert.compareArray(log, [ | ||
// HasBinding, step 2. | ||
"has:Object", | ||
|
||
// HasBinding, step 5. | ||
"get:Symbol(Symbol.unscopables)", | ||
|
||
// GetBindingValue, step 2. | ||
"has:Object", | ||
|
||
// GetBindingValue, step 4. | ||
"get:Object", | ||
]); |
66 changes: 66 additions & 0 deletions
66
test/language/statements/with/get-binding-value-idref-with-proxy-env.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
// Copyright (C) 2024 André Bargull. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
|
||
/*--- | ||
esid: sec-object-environment-records-getbindingvalue-n-s | ||
description: > | ||
Lookups in proxy binding object for identifier reference. | ||
info: | | ||
9.1.1.2.1 HasBinding ( N ) | ||
1. Let bindingObject be envRec.[[BindingObject]]. | ||
2. Let foundBinding be ? HasProperty(bindingObject, N). | ||
3. If foundBinding is false, return false. | ||
... | ||
5. Let unscopables be ? Get(bindingObject, %Symbol.unscopables%). | ||
... | ||
7. Return true. | ||
9.1.1.2.6 GetBindingValue ( N, S ) | ||
1. Let bindingObject be envRec.[[BindingObject]]. | ||
2. Let value be ? HasProperty(bindingObject, N). | ||
3. If value is false, then | ||
a. If S is false, return undefined; otherwise throw a ReferenceError exception. | ||
4. Return ? Get(bindingObject, N). | ||
features: [Proxy, Reflect] | ||
flags: [noStrict] | ||
includes: [compareArray.js, proxyTrapsHelper.js] | ||
---*/ | ||
|
||
var log = []; | ||
|
||
// Environment contains referenced binding. | ||
var env = { | ||
Object, | ||
}; | ||
|
||
var proxy = new Proxy(env, allowProxyTraps({ | ||
has(t, pk) { | ||
log.push("has:" + String(pk)); | ||
return Reflect.has(t, pk); | ||
}, | ||
get(t, pk, r) { | ||
log.push("get:" + String(pk)); | ||
return Reflect.get(t, pk, r); | ||
}, | ||
})); | ||
|
||
with (proxy) { | ||
Object; | ||
} | ||
|
||
assert.compareArray(log, [ | ||
// HasBinding, step 2. | ||
"has:Object", | ||
|
||
// HasBinding, step 5. | ||
"get:Symbol(Symbol.unscopables)", | ||
|
||
// GetBindingValue, step 2. | ||
"has:Object", | ||
|
||
// GetBindingValue, step 4. | ||
"get:Object", | ||
]); |
40 changes: 40 additions & 0 deletions
40
test/language/statements/with/has-binding-call-with-proxy-env.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// Copyright (C) 2024 André Bargull. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
|
||
/*--- | ||
esid: sec-object-environment-records-hasbinding-n | ||
description: > | ||
Lookups in proxy binding object for call expression. | ||
info: | | ||
9.1.1.2.1 HasBinding ( N ) | ||
1. Let bindingObject be envRec.[[BindingObject]]. | ||
2. Let foundBinding be ? HasProperty(bindingObject, N). | ||
3. If foundBinding is false, return false. | ||
... | ||
features: [Proxy, Reflect] | ||
flags: [noStrict] | ||
includes: [compareArray.js, proxyTrapsHelper.js] | ||
---*/ | ||
|
||
var log = []; | ||
|
||
// Empty environment. | ||
var env = {}; | ||
|
||
var proxy = new Proxy(env, allowProxyTraps({ | ||
has(t, pk) { | ||
log.push("has:" + String(pk)); | ||
return Reflect.has(t, pk); | ||
}, | ||
})); | ||
|
||
with (proxy) { | ||
Object(); | ||
} | ||
|
||
assert.compareArray(log, [ | ||
// HasBinding, step 2. | ||
"has:Object", | ||
]); |
40 changes: 40 additions & 0 deletions
40
test/language/statements/with/has-binding-idref-with-proxy-env.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// Copyright (C) 2024 André Bargull. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
|
||
/*--- | ||
esid: sec-object-environment-records-hasbinding-n | ||
description: > | ||
Lookups in proxy binding object for identifier reference. | ||
info: | | ||
9.1.1.2.1 HasBinding ( N ) | ||
1. Let bindingObject be envRec.[[BindingObject]]. | ||
2. Let foundBinding be ? HasProperty(bindingObject, N). | ||
3. If foundBinding is false, return false. | ||
... | ||
features: [Proxy, Reflect] | ||
flags: [noStrict] | ||
includes: [compareArray.js, proxyTrapsHelper.js] | ||
---*/ | ||
|
||
var log = []; | ||
|
||
// Empty environment. | ||
var env = {}; | ||
|
||
var proxy = new Proxy(env, allowProxyTraps({ | ||
has(t, pk) { | ||
log.push("has:" + String(pk)); | ||
return Reflect.has(t, pk); | ||
}, | ||
})); | ||
|
||
with (proxy) { | ||
Object; | ||
} | ||
|
||
assert.compareArray(log, [ | ||
// HasBinding, step 2. | ||
"has:Object", | ||
]); |
105 changes: 105 additions & 0 deletions
105
test/language/statements/with/set-mutable-binding-idref-compound-assign-with-proxy-env.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
// Copyright (C) 2024 André Bargull. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
|
||
/*--- | ||
esid: sec-object-environment-records-setmutablebinding-n-v-s | ||
description: > | ||
Lookups in proxy binding object for identifier reference. | ||
info: | | ||
9.1.1.2.1 HasBinding ( N ) | ||
1. Let bindingObject be envRec.[[BindingObject]]. | ||
2. Let foundBinding be ? HasProperty(bindingObject, N). | ||
3. If foundBinding is false, return false. | ||
... | ||
5. Let unscopables be ? Get(bindingObject, %Symbol.unscopables%). | ||
... | ||
7. Return true. | ||
9.1.1.2.6 GetBindingValue ( N, S ) | ||
1. Let bindingObject be envRec.[[BindingObject]]. | ||
2. Let value be ? HasProperty(bindingObject, N). | ||
3. If value is false, then | ||
a. If S is false, return undefined; otherwise throw a ReferenceError exception. | ||
4. Return ? Get(bindingObject, N). | ||
9.1.1.2.5 SetMutableBinding ( N, V, S ) | ||
1. Let bindingObject be envRec.[[BindingObject]]. | ||
2. Let stillExists be ? HasProperty(bindingObject, N). | ||
... | ||
4. Perform ? Set(bindingObject, N, V, S). | ||
... | ||
10.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc ) | ||
... | ||
2. If IsDataDescriptor(ownDesc) is true, then | ||
... | ||
c. Let existingDescriptor be ? Receiver.[[GetOwnProperty]](P). | ||
d. If existingDescriptor is not undefined, then | ||
... | ||
iv. Return ? Receiver.[[DefineOwnProperty]](P, valueDesc). | ||
... | ||
features: [Proxy, Reflect] | ||
flags: [noStrict] | ||
includes: [compareArray.js, proxyTrapsHelper.js] | ||
---*/ | ||
|
||
var log = []; | ||
|
||
// Environment contains referenced binding. | ||
var env = { | ||
p: 0, | ||
}; | ||
|
||
var proxy = new Proxy(env, allowProxyTraps({ | ||
has(t, pk) { | ||
log.push("has:" + String(pk)); | ||
return Reflect.has(t, pk); | ||
}, | ||
get(t, pk, r) { | ||
log.push("get:" + String(pk)); | ||
return Reflect.get(t, pk, r); | ||
}, | ||
set(t, pk, v, r) { | ||
log.push("set:" + String(pk)); | ||
return Reflect.set(t, pk, v, r); | ||
}, | ||
getOwnPropertyDescriptor(t, pk) { | ||
log.push("getOwnPropertyDescriptor:" + String(pk)); | ||
return Reflect.getOwnPropertyDescriptor(t, pk); | ||
}, | ||
defineProperty(t, pk, d) { | ||
log.push("defineProperty:" + String(pk)); | ||
return Reflect.defineProperty(t, pk, d); | ||
}, | ||
})); | ||
|
||
with (proxy) { | ||
p += 1; | ||
} | ||
|
||
assert.compareArray(log, [ | ||
// HasBinding, step 2. | ||
"has:p", | ||
|
||
// HasBinding, step 5. | ||
"get:Symbol(Symbol.unscopables)", | ||
|
||
// GetBindingValue, step 2. | ||
"has:p", | ||
|
||
// GetBindingValue, step 4. | ||
"get:p", | ||
|
||
// SetMutableBinding, step 2. | ||
"has:p", | ||
|
||
// SetMutableBinding, step 4. | ||
"set:p", | ||
"getOwnPropertyDescriptor:p", | ||
"defineProperty:p", | ||
]); |
Oops, something went wrong.