Skip to content

Commit

Permalink
Add tests for normative change
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
  • Loading branch information
jugglinmike committed May 21, 2021
1 parent 5e0fc43 commit 4d508ea
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 (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 = 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 4d508ea

Please sign in to comment.