-
Notifications
You must be signed in to change notification settings - Fork 470
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Attempting to set a value to a binding that no longer exists must thr…
…ow a ReferenceError exception in strict mode code. Fixes gh-427
- Loading branch information
Showing
32 changed files
with
1,266 additions
and
0 deletions.
There are no files selected for viewing
41 changes: 41 additions & 0 deletions
41
test/language/expressions/assignment/assignment-operator-calls-putvalue(lref,-rval)-1.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,41 @@ | ||
// Copyright (C) 2020 Rick Waldron. 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: > | ||
Assignment Operator calls PutValue(lref, rval) (formerly S11.13.1_A5_T5) | ||
info: | | ||
The concrete Environment Record method SetMutableBinding for object Environment | ||
Records attempts to set the value of the Environment Record's associated binding | ||
object's property whose name is the value of the argument N to the value of argument V. | ||
A property named N normally already exists but if it does not or is not currently writable, | ||
error handling is determined by the value of the Boolean argument S. | ||
Let stillExists be ? HasProperty(bindings, N). | ||
If stillExists is false and S is true, throw a ReferenceError exception. | ||
flags: [noStrict] | ||
---*/ | ||
|
||
var count = 0; | ||
var global = this; | ||
|
||
Object.defineProperty(this, "x", { | ||
configurable: true, | ||
value: 1 | ||
}); | ||
|
||
(function() { | ||
"use strict"; | ||
assert.throws(ReferenceError, () => { | ||
count++; | ||
x = (delete global.x, 2); | ||
count++; | ||
}); | ||
count++; | ||
})(); | ||
|
||
assert.sameValue(count, 2); | ||
assert(!('x' in this)); | ||
assert(!('x' in global)); | ||
|
36 changes: 36 additions & 0 deletions
36
test/language/expressions/assignment/assignment-operator-calls-putvalue(lref,-rval).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,36 @@ | ||
// Copyright (C) 2020 Rick Waldron. 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: > | ||
Assignment Operator calls PutValue(lref, rval) (formerly S11.13.1_A5_T4) | ||
info: | | ||
The concrete Environment Record method SetMutableBinding for object Environment | ||
Records attempts to set the value of the Environment Record's associated binding | ||
object's property whose name is the value of the argument N to the value of argument V. | ||
A property named N normally already exists but if it does not or is not currently writable, | ||
error handling is determined by the value of the Boolean argument S. | ||
Let stillExists be ? HasProperty(bindings, N). | ||
If stillExists is false and S is true, throw a ReferenceError exception. | ||
flags: [noStrict] | ||
---*/ | ||
|
||
var count = 0; | ||
var scope = {x: 1}; | ||
|
||
with (scope) { | ||
(function() { | ||
"use strict"; | ||
assert.throws(ReferenceError, () => { | ||
count++; | ||
x = (delete scope.x, 2); | ||
count++; | ||
}); | ||
count++; | ||
})(); | ||
} | ||
|
||
assert.sameValue(count, 2); | ||
assert(!('x' in scope)); |
40 changes: 40 additions & 0 deletions
40
...expressions/compound-assignment/compound-assignment-operator-calls-putvalue(lref,-v)-1.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) 2020 Rick Waldron. 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: > | ||
Compound Assignment Operator calls PutValue(lref, v) (formerly S11.13.2_A5.10_T5) | ||
info: | | ||
The concrete Environment Record method SetMutableBinding for object Environment | ||
Records attempts to set the value of the Environment Record's associated binding | ||
object's property whose name is the value of the argument N to the value of argument V. | ||
A property named N normally already exists but if it does not or is not currently writable, | ||
error handling is determined by the value of the Boolean argument S. | ||
Let stillExists be ? HasProperty(bindings, N). | ||
If stillExists is false and S is true, throw a ReferenceError exception. | ||
flags: [noStrict] | ||
---*/ | ||
var count = 0; | ||
|
||
Object.defineProperty(this, "x", { | ||
configurable: true, | ||
get: function() { | ||
delete this.x; | ||
return 2; | ||
} | ||
}); | ||
|
||
(function() { | ||
"use strict"; | ||
assert.throws(ReferenceError, () => { | ||
count++; | ||
x ^= 3; | ||
count++; | ||
}); | ||
count++; | ||
})(); | ||
|
||
assert.sameValue(count, 2); | ||
assert(!('x' in this)); |
41 changes: 41 additions & 0 deletions
41
...xpressions/compound-assignment/compound-assignment-operator-calls-putvalue(lref,-v)-10.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,41 @@ | ||
// Copyright (C) 2020 Rick Waldron. 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: > | ||
Compound Assignment Operator calls PutValue(lref, v) (formerly S11.13.2_A5.4_T4) | ||
info: | | ||
The concrete Environment Record method SetMutableBinding for object Environment | ||
Records attempts to set the value of the Environment Record's associated binding | ||
object's property whose name is the value of the argument N to the value of argument V. | ||
A property named N normally already exists but if it does not or is not currently writable, | ||
error handling is determined by the value of the Boolean argument S. | ||
Let stillExists be ? HasProperty(bindings, N). | ||
If stillExists is false and S is true, throw a ReferenceError exception. | ||
flags: [noStrict] | ||
---*/ | ||
|
||
var count = 0; | ||
var scope = { | ||
get x() { | ||
delete this.x; | ||
return 2; | ||
} | ||
}; | ||
|
||
with (scope) { | ||
(function() { | ||
"use strict"; | ||
assert.throws(ReferenceError, () => { | ||
count++; | ||
x += 1; | ||
count++; | ||
}); | ||
count++; | ||
})(); | ||
} | ||
|
||
assert.sameValue(count, 2); | ||
assert(!('x' in scope)); |
40 changes: 40 additions & 0 deletions
40
...xpressions/compound-assignment/compound-assignment-operator-calls-putvalue(lref,-v)-11.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) 2020 Rick Waldron. 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: > | ||
Compound Assignment Operator calls PutValue(lref, v) (formerly S11.13.2_A5.4_T5) | ||
info: | | ||
The concrete Environment Record method SetMutableBinding for object Environment | ||
Records attempts to set the value of the Environment Record's associated binding | ||
object's property whose name is the value of the argument N to the value of argument V. | ||
A property named N normally already exists but if it does not or is not currently writable, | ||
error handling is determined by the value of the Boolean argument S. | ||
Let stillExists be ? HasProperty(bindings, N). | ||
If stillExists is false and S is true, throw a ReferenceError exception. | ||
flags: [noStrict] | ||
---*/ | ||
var count = 0; | ||
Object.defineProperty(this, "x", { | ||
configurable: true, | ||
get: function() { | ||
delete this.x; | ||
return 2; | ||
} | ||
}); | ||
|
||
(function() { | ||
"use strict"; | ||
assert.throws(ReferenceError, () => { | ||
count++; | ||
x += 1; | ||
count++; | ||
}); | ||
count++; | ||
})(); | ||
|
||
assert.sameValue(count, 2); | ||
assert(!('x' in this)); | ||
|
41 changes: 41 additions & 0 deletions
41
...xpressions/compound-assignment/compound-assignment-operator-calls-putvalue(lref,-v)-12.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,41 @@ | ||
// Copyright (C) 2020 Rick Waldron. 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: > | ||
Compound Assignment Operator calls PutValue(lref, v) (formerly S11.13.2_A5.5_T4) | ||
info: | | ||
The concrete Environment Record method SetMutableBinding for object Environment | ||
Records attempts to set the value of the Environment Record's associated binding | ||
object's property whose name is the value of the argument N to the value of argument V. | ||
A property named N normally already exists but if it does not or is not currently writable, | ||
error handling is determined by the value of the Boolean argument S. | ||
Let stillExists be ? HasProperty(bindings, N). | ||
If stillExists is false and S is true, throw a ReferenceError exception. | ||
flags: [noStrict] | ||
---*/ | ||
var count = 0; | ||
var scope = { | ||
get x() { | ||
delete this.x; | ||
return 2; | ||
} | ||
}; | ||
|
||
with (scope) { | ||
(function() { | ||
"use strict"; | ||
assert.throws(ReferenceError, () => { | ||
count++; | ||
x -= 1; | ||
count++; | ||
}); | ||
count++; | ||
})(); | ||
} | ||
|
||
assert.sameValue(count, 2); | ||
assert(!('x' in scope)); | ||
|
39 changes: 39 additions & 0 deletions
39
...xpressions/compound-assignment/compound-assignment-operator-calls-putvalue(lref,-v)-13.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,39 @@ | ||
// Copyright (C) 2020 Rick Waldron. 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: > | ||
Compound Assignment Operator calls PutValue(lref, v) (formerly S11.13.2_A5.5_T5) | ||
info: | | ||
The concrete Environment Record method SetMutableBinding for object Environment | ||
Records attempts to set the value of the Environment Record's associated binding | ||
object's property whose name is the value of the argument N to the value of argument V. | ||
A property named N normally already exists but if it does not or is not currently writable, | ||
error handling is determined by the value of the Boolean argument S. | ||
Let stillExists be ? HasProperty(bindings, N). | ||
If stillExists is false and S is true, throw a ReferenceError exception. | ||
flags: [noStrict] | ||
---*/ | ||
var count = 0; | ||
Object.defineProperty(this, "x", { | ||
configurable: true, | ||
get: function() { | ||
delete this.x; | ||
return 2; | ||
} | ||
}); | ||
|
||
(function() { | ||
"use strict"; | ||
assert.throws(ReferenceError, () => { | ||
count++; | ||
x -= 1; | ||
count++; | ||
}); | ||
count++; | ||
})(); | ||
|
||
assert.sameValue(count, 2); | ||
assert(!('x' in this)); |
40 changes: 40 additions & 0 deletions
40
...xpressions/compound-assignment/compound-assignment-operator-calls-putvalue(lref,-v)-14.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) 2020 Rick Waldron. 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: > | ||
Compound Assignment Operator calls PutValue(lref, v) (formerly S11.13.2_A5.6_T4) | ||
info: | | ||
The concrete Environment Record method SetMutableBinding for object Environment | ||
Records attempts to set the value of the Environment Record's associated binding | ||
object's property whose name is the value of the argument N to the value of argument V. | ||
A property named N normally already exists but if it does not or is not currently writable, | ||
error handling is determined by the value of the Boolean argument S. | ||
Let stillExists be ? HasProperty(bindings, N). | ||
If stillExists is false and S is true, throw a ReferenceError exception. | ||
flags: [noStrict] | ||
---*/ | ||
var count = 0; | ||
var scope = { | ||
get x() { | ||
delete this.x; | ||
return 2; | ||
} | ||
}; | ||
|
||
with (scope) { | ||
(function() { | ||
"use strict"; | ||
assert.throws(ReferenceError, () => { | ||
count++; | ||
x <<= 3; | ||
count++; | ||
}); | ||
count++; | ||
})(); | ||
} | ||
|
||
assert.sameValue(count, 2); | ||
assert(!('x' in scope)); |
39 changes: 39 additions & 0 deletions
39
...xpressions/compound-assignment/compound-assignment-operator-calls-putvalue(lref,-v)-15.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,39 @@ | ||
// Copyright (C) 2020 Rick Waldron. 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: > | ||
Compound Assignment Operator calls PutValue(lref, v) (formerly S11.13.2_A5.6_T5) | ||
info: | | ||
The concrete Environment Record method SetMutableBinding for object Environment | ||
Records attempts to set the value of the Environment Record's associated binding | ||
object's property whose name is the value of the argument N to the value of argument V. | ||
A property named N normally already exists but if it does not or is not currently writable, | ||
error handling is determined by the value of the Boolean argument S. | ||
Let stillExists be ? HasProperty(bindings, N). | ||
If stillExists is false and S is true, throw a ReferenceError exception. | ||
flags: [noStrict] | ||
---*/ | ||
var count = 0; | ||
Object.defineProperty(this, "x", { | ||
configurable: true, | ||
get: function() { | ||
delete this.x; | ||
return 2; | ||
} | ||
}); | ||
|
||
(function() { | ||
"use strict"; | ||
assert.throws(ReferenceError, () => { | ||
count++; | ||
x <<= 3; | ||
count++; | ||
}); | ||
count++; | ||
})(); | ||
|
||
assert.sameValue(count, 2); | ||
assert(!('x' in this)); |
Oops, something went wrong.