Merge pull request #1323 from bocoup/classfields-scope

classfields: add early error tests for privatename references
This commit is contained in:
Leo Balter 2017-11-03 14:12:10 -04:00 committed by GitHub
commit ce203360b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 695 additions and 0 deletions

View File

@ -0,0 +1,23 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-semantics-static-semantics-early-errors
description: Early error when referencing privatename in constructor without being declared in class fields
info: |
Static Semantics: Early Errors
Module : ModuleBody
It is a Syntax Error if AllPrivateNamesValid of ModuleBody with an empty List as an argument is false.
features: [class-fields]
flags: [module]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
constructor() {
this.#x;
}
}

View File

@ -0,0 +1,23 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-semantics-static-semantics-early-errors
description: Early error when referencing privatename in function without declaring in class
info: |
Static Semantics: Early Errors
Module : ModuleBody
It is a Syntax Error if AllPrivateNamesValid of ModuleBody with an empty List as an argument is false.
features: [class-fields]
flags: [module]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
f() {
this.#x;
}
}

View File

@ -0,0 +1,21 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-semantics-static-semantics-early-errors
description: Early error when referencing privatename in field without being declared in class fields
info: |
Static Semantics: Early Errors
Module : ModuleBody
It is a Syntax Error if AllPrivateNamesValid of ModuleBody with an empty List as an argument is false.
features: [class-fields]
flags: [module]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
y = this.#x;
}

View File

@ -0,0 +1,27 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-semantics-static-semantics-early-errors
description: Early error when referencing privatename that has not been declared in class.
info: |
Static Semantics: Early Errors
Static Semantics: Early Errors
Module : ModuleBody
It is a Syntax Error if AllPrivateNamesValid of ModuleBody with an empty List as an argument is false.
features: [class-fields]
flags: [module]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
f() {
this.#x;
class D extends C {
#x;
}
}
}

View File

@ -0,0 +1,23 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-semantics-static-semantics-early-errors
description: Early error when referencing privatename outside of class
info: |
Static Semantics: Early Errors
Module : ModuleBody
It is a Syntax Error if AllPrivateNamesValid of ModuleBody with an empty List as an argument is false.
features: [class-fields]
flags: [module]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
#x;
}
new C().#x;

View File

@ -0,0 +1,21 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-semantics-static-semantics-early-errors
description: Early error when referencing privatename outside of class.
info: |
Static Semantics: Early Errors
Module : ModuleBody
It is a Syntax Error if AllPrivateNamesValid of ModuleBody with an empty List as an argument is false.
features: [class-fields]
flags: [module]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {}
new C().#x;

View File

@ -0,0 +1,21 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-semantics-static-semantics-early-errors
description: Early error when referencing privatename on object, outside of class.
info: |
Static Semantics: Early Errors
Module : ModuleBody
It is a Syntax Error if AllPrivateNamesValid of ModuleBody with an empty List as an argument is false.
features: [class-fields]
flags: [module]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
obj = {};
obj.#x;

View File

@ -0,0 +1,21 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-semantics-static-semantics-early-errors
description: Early error when referencing privatename on object, outside of class.
info: |
Static Semantics: Early Errors
Module : ModuleBody
It is a Syntax Error if AllPrivateNamesValid of ModuleBody with an empty List as an argument is false.
features: [class-fields]
flags: [module]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
function f() {
this.#x;
}

View File

@ -0,0 +1,47 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-module-semantics-static-semantics-early-errors
description: Referencing privatename in class within class does not error.
info: |
Static Semantics: Early Errors
Module : ModuleBody
It is a Syntax Error if AllPrivateNamesValid of ModuleBody with an empty List as an argument is false.
Static Semantics: AllPrivateNamesValid
AllPrivateNamesValid is an abstract operation which takes names as an argument.
MemberExpression : MemberExpression . PrivateName
1. If StringValue of PrivateName is in names, return true.
2. Return false.
CallExpression : CallExpression . PrivateName
1. If StringValue of PrivateName is in names, return true.
2. Return false.
ClassBody:ClassElementList
1. Let newNames be the concatenation of names with PrivateBoundNames of ClassBody.
2.Return AllPrivateNamesValid of ClassElementList with the argument newNames.
For all other grammatical productions, recurse on subexpressions/substatements, passing in the names of the caller. If all pieces return true, then return true. If any returns false, return false.
flags: [module]
features: [class-fields]
---*/
class outer {
#x = 42;
f() {
var self = this;
return class inner {
g() {
return self.#x;
}
}
}
}
var innerclass = new outer().f();
var test = new innerclass().g();
assert.equal(test, 42);

View File

@ -0,0 +1,24 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename in constructor without being declared in class fields
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
constructor() {
this.#x;
}
}

View File

@ -0,0 +1,24 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename in function in class without declaring in field
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
f() {
this.#x;
}
}

View File

@ -0,0 +1,22 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename that has not been declared in class.
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
y = this.#x;
}

View File

@ -0,0 +1,27 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename that has not been declared in class.
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
f() {
this.#x;
class D extends C {
#x;
}
}
}

View File

@ -0,0 +1,24 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename outside of class
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {
#x;
}
new C().#x;

View File

@ -0,0 +1,22 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename outside of class.
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
class C {}
new C().#x;

View File

@ -0,0 +1,22 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename on object, outside of class.
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
obj = {};
obj.#x;

View File

@ -0,0 +1,22 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename on object, outside of class.
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
negative:
phase: early
type: SyntaxError
---*/
throw "Test262: This statement should not be evaluated.";
function f() {
this.#x;
}

View File

@ -0,0 +1,32 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename in constructor without being declared in class fields
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
2. If Script is parsed directly from PerformEval,
a. Let env be the running execution context's PrivateNameEnvironment.
b. Repeat while env is not null,
i. For each binding named N in env,
1. If names does not contain N, append N to names.
ii. Let env be env's outer environment reference.
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
---*/
var executed = false;
class C {
constructor() {
eval("executed = true; this.#x;");
}
}
assert.throws(SyntaxError, function() {
new C();
});
assert.sameValue(executed, false);

View File

@ -0,0 +1,32 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename in function in class without declaring in field
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
2. If Script is parsed directly from PerformEval,
a. Let env be the running execution context's PrivateNameEnvironment.
b. Repeat while env is not null,
i. For each binding named N in env,
1. If names does not contain N, append N to names.
ii. Let env be env's outer environment reference.
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
---*/
var executed = false;
class C {
f() {
eval("executed = true; this.#x;");
}
}
assert.throws(SyntaxError, function() {
new C().f();
});
assert.sameValue(executed, false);

View File

@ -0,0 +1,30 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename that has not been declared in class.
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
2. If Script is parsed directly from PerformEval,
a. Let env be the running execution context's PrivateNameEnvironment.
b. Repeat while env is not null,
i. For each binding named N in env,
1. If names does not contain N, append N to names.
ii. Let env be env's outer environment reference.
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
---*/
var executed = false;
class C {
y = eval("executed = true; this.#x;")
}
assert.throws(SyntaxError, function() {
new C();
});
assert.sameValue(executed, false);

View File

@ -0,0 +1,35 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename that has not been declared in class.
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
2. If Script is parsed directly from PerformEval,
a. Let env be the running execution context's PrivateNameEnvironment.
b. Repeat while env is not null,
i. For each binding named N in env,
1. If names does not contain N, append N to names.
ii. Let env be env's outer environment reference.
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
---*/
var executed = false;
class C {
f() {
eval("executed = true; this.#x;");
class D extends C {
#x;
}
}
}
assert.throws(SyntaxError, function() {
new C().f();
});
assert.sameValue(executed, false);

View File

@ -0,0 +1,30 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename outside of class
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
2. If Script is parsed directly from PerformEval,
a. Let env be the running execution context's PrivateNameEnvironment.
b. Repeat while env is not null,
i. For each binding named N in env,
1. If names does not contain N, append N to names.
ii. Let env be env's outer environment reference.
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
---*/
var executed = false;
class C {
#x;
}
assert.throws(SyntaxError, function() {
eval("executed = true; new C().#x");
});
assert.sameValue(executed, false);

View File

@ -0,0 +1,27 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename outside of class.
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
2. If Script is parsed directly from PerformEval,
a. Let env be the running execution context's PrivateNameEnvironment.
b. Repeat while env is not null,
i. For each binding named N in env,
1. If names does not contain N, append N to names.
ii. Let env be env's outer environment reference.
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
---*/
var executed = false;
class C {}
assert.throws(SyntaxError, function() {
eval("executed = true; new C().#x");
});
assert.sameValue(executed, false);

View File

@ -0,0 +1,21 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename on object, outside of class.
info: |
Static Semantics: Early Errors
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
---*/
var executed = false;
var obj = {};
assert.throws(SyntaxError, function() {
eval("executed = true; obj.#x;");
});
assert.sameValue(executed, false);

View File

@ -0,0 +1,25 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Early error when referencing privatename on object, outside of class.
info: |
Static Semantics: Early Errors
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
features: [class-fields]
---*/
var executed = false;
function f() {
eval("executed = true; this.#x;");
}
assert.throws(SyntaxError, function() {
f();
});
assert.sameValue(executed, false);

View File

@ -0,0 +1,49 @@
// Copyright (C) 2017 Valerie Young. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-scripts-static-semantics-early-errors
description: Referencing privatename in class within class does not error.
info: |
Static Semantics: Early Errors
Script : ScriptBody
1. Let names be an empty List.
...
3. If AllPrivateNamesValid of ScriptBody with the argument names is false, throw a SyntaxError exception.
Static Semantics: AllPrivateNamesValid
AllPrivateNamesValid is an abstract operation which takes names as an argument.
MemberExpression : MemberExpression . PrivateName
1. If StringValue of PrivateName is in names, return true.
2. Return false.
CallExpression : CallExpression . PrivateName
1. If StringValue of PrivateName is in names, return true.
2. Return false.
ClassBody:ClassElementList
1. Let newNames be the concatenation of names with PrivateBoundNames of ClassBody.
2.Return AllPrivateNamesValid of ClassElementList with the argument newNames.
For all other grammatical productions, recurse on subexpressions/substatements, passing in the names of the caller. If all pieces return true, then return true. If any returns false, return false.
features: [class-fields]
---*/
class outer {
#x = 42;
f() {
var self = this;
return class inner {
g() {
return self.#x;
}
}
}
}
var innerclass = new outer().f();
var test = new innerclass().g();
assert.equal(test, 42);