Skip to content

Commit

Permalink
Add tests for change in Reference Records
Browse files Browse the repository at this point in the history
These tests support the following normative change

"Normative: Allow null or undefined in Reference Records"
tc39/ecma262#2267

The tests concerning the `delete` operator increase coverage to verify
behavior which, though related, is not altered by the normative change.
These tests are intended to guard against regressions as engines
implement the new semantics.
  • Loading branch information
jugglinmike authored and rwaldron committed Jun 24, 2021
1 parent 93541f0 commit 9b4ca43
Show file tree
Hide file tree
Showing 12 changed files with 320 additions and 76 deletions.
38 changes: 0 additions & 38 deletions test/language/expressions/assignment/S11.13.1_A7_T1.js

This file was deleted.

38 changes: 0 additions & 38 deletions test/language/expressions/assignment/S11.13.1_A7_T2.js

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-assignment-operators
description: Assignment Operator evaluates the value prior validating a MemberExpression's reference (null)
info: |
# 13.15.2 Runtime Semantics: Evaluation
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
1. If LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral,
then
a. Let lref be the result of evaluating LeftHandSideExpression.
[...]
e. Perform ? PutValue(lref, rval).
# 6.2.4.5 PutValue ( V, W )
[...]
5. If IsPropertyReference(V) is true, then
a. Let baseObj be ? ToObject(V.[[Base]]).
---*/

function DummyError() { }

assert.throws(DummyError, function() {
var base = null;
var prop = function() {
throw new DummyError();
};
var expr = function() {
$ERROR("right-hand side expression evaluated");
};

base[prop()] = expr();
});

assert.throws(DummyError, function() {
var base = null;
var prop = {
toString: function() {
$ERROR("property key evaluated");
}
};
var expr = function() {
throw new DummyError();
};

base[prop] = expr();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-assignment-operators
description: Assignment Operator evaluates the value prior validating a MemberExpression's reference (undefined)
info: |
# 13.15.2 Runtime Semantics: Evaluation
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
1. If LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral,
then
a. Let lref be the result of evaluating LeftHandSideExpression.
[...]
e. Perform ? PutValue(lref, rval).
# 6.2.4.5 PutValue ( V, W )
[...]
5. If IsPropertyReference(V) is true, then
a. Let baseObj be ? ToObject(V.[[Base]]).
---*/

function DummyError() { }

assert.throws(DummyError, function() {
var base = undefined;
var prop = function() {
throw new DummyError();
};
var expr = function() {
$ERROR("right-hand side expression evaluated");
};

base[prop()] = expr();
});

assert.throws(DummyError, function() {
var base = undefined;
var prop = {
toString: function() {
$ERROR("property key evaluated");
}
};
var expr = function() {
throw new DummyError();
};

base[prop] = expr();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-assignment-operators
description: Assignment Operator evaluates the value prior validating a MemberExpression's reference (null)
info: |
# 13.15.2 Runtime Semantics: Evaluation
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
1. If LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral,
then
a. Let lref be the result of evaluating LeftHandSideExpression.
[...]
e. Perform ? PutValue(lref, rval).
# 6.2.4.5 PutValue ( V, W )
[...]
5. If IsPropertyReference(V) is true, then
a. Let baseObj be ? ToObject(V.[[Base]]).
---*/

var count = 0;
var base = null;

assert.throws(TypeError, function() {
base.prop = count += 1;
});

assert.sameValue(count, 1);
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-assignment-operators
description: Assignment Operator evaluates the value prior validating a MemberExpression's reference (undefined)
info: |
# 13.15.2 Runtime Semantics: Evaluation
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
1. If LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral,
then
a. Let lref be the result of evaluating LeftHandSideExpression.
[...]
e. Perform ? PutValue(lref, rval).
# 6.2.4.5 PutValue ( V, W )
[...]
5. If IsPropertyReference(V) is true, then
a. Let baseObj be ? ToObject(V.[[Base]]).
---*/

var count = 0;
var base = undefined;

assert.throws(TypeError, function() {
base.prop = count += 1;
});

assert.sameValue(count, 1);
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-assignment-operators
description: Assignment Operator evaluates the value prior validating a SuperProperty's reference (null)
info: |
# 13.15.2 Runtime Semantics: Evaluation
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
1. If LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral,
then
a. Let lref be the result of evaluating LeftHandSideExpression.
[...]
e. Perform ? PutValue(lref, rval).
# 6.2.4.5 PutValue ( V, W )
[...]
5. If IsPropertyReference(V) is true, then
a. Let baseObj be ? ToObject(V.[[Base]]).
---*/

var count = 0;
class C {
static m() {
super[0] = count += 1;
}
}

Object.setPrototypeOf(C, null);

assert.throws(TypeError, function() {
C.m();
});

assert.sameValue(count, 1);
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-assignment-operators
description: Assignment Operator evaluates the value prior validating a SuperProperty's reference (null)
info: |
# 13.15.2 Runtime Semantics: Evaluation
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
1. If LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral,
then
a. Let lref be the result of evaluating LeftHandSideExpression.
[...]
e. Perform ? PutValue(lref, rval).
# 6.2.4.5 PutValue ( V, W )
[...]
5. If IsPropertyReference(V) is true, then
a. Let baseObj be ? ToObject(V.[[Base]]).
---*/

var count = 0;
class C {
static m() {
super.x = count += 1;
}
}

Object.setPrototypeOf(C, null);

assert.throws(TypeError, function() {
C.m();
});

assert.sameValue(count, 1);
21 changes: 21 additions & 0 deletions test/language/expressions/delete/member-computed-reference-null.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-delete-operator
description: Delete Operator throws an error if the base reference is not object-coercible (null).
info: |
# 12.5.3.2 Runtime Semantics: Evaluation
UnaryExpression : delete UnaryExpression
[...]
5. If IsPropertyReference(ref) is true, then
a. If IsSuperReference(ref) is true, throw a ReferenceError exception.
b. Let baseObj be ? ToObject(ref.[[Base]]).
---*/

var base = null;

assert.throws(TypeError, function() {
delete base[0];
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-delete-operator
description: Delete Operator throws an error if the base reference is not object-coercible (undefined).
info: |
# 12.5.3.2 Runtime Semantics: Evaluation
UnaryExpression : delete UnaryExpression
[...]
5. If IsPropertyReference(ref) is true, then
a. If IsSuperReference(ref) is true, throw a ReferenceError exception.
b. Let baseObj be ? ToObject(ref.[[Base]]).
---*/

var base = undefined;

assert.throws(TypeError, function() {
delete base[0];
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-delete-operator
description: Delete Operator throws an error if the base reference is not object-coercible (null).
info: |
# 12.5.3.2 Runtime Semantics: Evaluation
UnaryExpression : delete UnaryExpression
[...]
5. If IsPropertyReference(ref) is true, then
a. If IsSuperReference(ref) is true, throw a ReferenceError exception.
b. Let baseObj be ? ToObject(ref.[[Base]]).
---*/

var base = null;

assert.throws(TypeError, function() {
delete base.prop;
});
Loading

0 comments on commit 9b4ca43

Please sign in to comment.