Skip to content

Commit

Permalink
Attempting to set a value to a binding that no longer exists must thr…
Browse files Browse the repository at this point in the history
…ow a ReferenceError exception in strict mode code. Fixes gh-427
  • Loading branch information
rwaldron committed Sep 14, 2020
1 parent 90e335f commit 3a2e804
Show file tree
Hide file tree
Showing 32 changed files with 1,266 additions and 0 deletions.
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));

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

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

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

0 comments on commit 3a2e804

Please sign in to comment.