mirror of https://github.com/tc39/test262.git
Improve coverage for section 12, "Expression" (#695)
* Add missing test for early error * Add missing test for WithBaseObject * Improve coverage for `new.target` * Add test for deletion of SuperReference * Add tests for `in` keyword restrictions * fixup! Improve coverage for `new.target`
This commit is contained in:
parent
e49d2661a8
commit
e290a337b8
|
@ -0,0 +1,27 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-scripts-static-semantics-early-errors
|
||||
es6id: 15.1.1
|
||||
description: >
|
||||
A direct eval in the functon code of an ArrowFunction may not contain
|
||||
`new.target`
|
||||
info: |
|
||||
- It is a Syntax Error if StatementList Contains NewTarget unless the source
|
||||
code containing NewTarget is eval code that is being processed by a direct
|
||||
eval that is contained in function code that is not the function code of an
|
||||
ArrowFunction.
|
||||
features: [arrow-function]
|
||||
---*/
|
||||
|
||||
var caught;
|
||||
var f = () => eval('new.target;');
|
||||
|
||||
try {
|
||||
f();
|
||||
} catch (err) {
|
||||
caught = err;
|
||||
}
|
||||
|
||||
assert.sameValue(typeof caught, 'object');
|
||||
assert.sameValue(caught.constructor, SyntaxError);
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-scripts-static-semantics-early-errors
|
||||
es6id: 15.1.1
|
||||
description: >
|
||||
A direct eval in the functon code of a non-ArrowFunction may contain
|
||||
`new.target`
|
||||
info: |
|
||||
- It is a Syntax Error if StatementList Contains NewTarget unless the source
|
||||
code containing NewTarget is eval code that is being processed by a direct
|
||||
eval that is contained in function code that is not the function code of an
|
||||
ArrowFunction.
|
||||
features: [arrow-function]
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
var getNewTarget = function() {
|
||||
newTarget = eval('new.target;');
|
||||
};
|
||||
|
||||
getNewTarget();
|
||||
|
||||
assert.sameValue(newTarget, undefined);
|
||||
|
||||
new getNewTarget();
|
||||
|
||||
assert.sameValue(newTarget, getNewTarget);
|
|
@ -0,0 +1,23 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-scripts-static-semantics-early-errors
|
||||
es6id: 15.1.1
|
||||
description: A direct eval in global code may not contain `new.target`
|
||||
info: |
|
||||
- It is a Syntax Error if StatementList Contains NewTarget unless the source
|
||||
code containing NewTarget is eval code that is being processed by a direct
|
||||
eval that is contained in function code that is not the function code of an
|
||||
ArrowFunction.
|
||||
---*/
|
||||
|
||||
var caught;
|
||||
|
||||
try {
|
||||
eval('new.target;');
|
||||
} catch (err) {
|
||||
caught = err;
|
||||
}
|
||||
|
||||
assert.sameValue(typeof caught, 'object');
|
||||
assert.sameValue(caught.constructor, SyntaxError);
|
|
@ -0,0 +1,43 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-scripts-static-semantics-early-errors
|
||||
es6id: 15.1.1
|
||||
description: >
|
||||
An indirect eval may not contain `new.target`
|
||||
info: |
|
||||
- It is a Syntax Error if StatementList Contains NewTarget unless the source
|
||||
code containing NewTarget is eval code that is being processed by a direct
|
||||
eval that is contained in function code that is not the function code of an
|
||||
ArrowFunction.
|
||||
---*/
|
||||
|
||||
var caught;
|
||||
|
||||
try {
|
||||
(0,eval)('new.target;');
|
||||
} catch (err) {
|
||||
caught = err;
|
||||
}
|
||||
|
||||
assert.sameValue(typeof caught, 'object', 'object value thrown (global code)');
|
||||
assert.sameValue(
|
||||
caught.constructor, SyntaxError, 'SyntaxError thrown (global code)'
|
||||
);
|
||||
|
||||
caught = null;
|
||||
|
||||
try {
|
||||
(function() {
|
||||
(0,eval)('new.target;');
|
||||
})();
|
||||
} catch (err) {
|
||||
caught = err;
|
||||
}
|
||||
|
||||
assert.sameValue(
|
||||
typeof caught, 'object', 'object value thrown (function code)'
|
||||
);
|
||||
assert.sameValue(
|
||||
caught.constructor, SyntaxError, 'SyntaxError thrown (function code)'
|
||||
);
|
|
@ -0,0 +1,35 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-function-calls-runtime-semantics-evaluation
|
||||
es6id: 12.3.4.1
|
||||
description: Correct retrieval of environment's "with" base object
|
||||
info: |
|
||||
4. If Type(ref) is Reference, then
|
||||
a. If IsPropertyReference(ref) is true, then
|
||||
[...]
|
||||
b. Else the base of ref is an Environment Record,
|
||||
i. Let refEnv be GetBase(ref).
|
||||
ii. Let thisValue be refEnv.WithBaseObject().
|
||||
[...]
|
||||
8. Return ? EvaluateDirectCall(func, thisValue, Arguments, tailCall).
|
||||
flags: [noStrict]
|
||||
---*/
|
||||
|
||||
var viaMember, viaCall;
|
||||
var obj = {
|
||||
method: function() {
|
||||
viaCall = this;
|
||||
},
|
||||
get attribute() {
|
||||
viaMember = this;
|
||||
}
|
||||
};
|
||||
|
||||
with (obj) {
|
||||
method();
|
||||
attribute;
|
||||
}
|
||||
|
||||
assert.sameValue(viaCall, obj, 'via CallExpression');
|
||||
assert.sameValue(viaMember, obj, 'via MemberExpression');
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-conditional-operator
|
||||
es6id: 12.13
|
||||
description: >
|
||||
The first AssignmentExpression may include the `in` keyword in any context
|
||||
info: |
|
||||
Syntax
|
||||
|
||||
ConditionalExpression[In, Yield] :
|
||||
LogicalORExpression[?In, ?Yield]
|
||||
LogicalORExpression[?In, ?Yield] ? AssignmentExpression[+In, ?Yield] : AssignmentExpression[?In, ?Yield]
|
||||
---*/
|
||||
|
||||
var cond1Count = 0;
|
||||
var cond2Count = 0;
|
||||
var cond1 = function() {
|
||||
cond1Count += 1;
|
||||
return {};
|
||||
};
|
||||
var cond2 = function() {
|
||||
cond2Count += 1;
|
||||
};
|
||||
for (true ? '' in cond1() : cond2(); false; ) ;
|
||||
|
||||
assert.sameValue(cond1Count, 1);
|
||||
assert.sameValue(cond2Count, 0);
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-conditional-operator
|
||||
es6id: 12.13
|
||||
description: >
|
||||
The second AssignmentExpression cannot include the `in` keyword in contexts
|
||||
where it is disallowed.
|
||||
info: |
|
||||
Syntax
|
||||
|
||||
ConditionalExpression[In, Yield] :
|
||||
LogicalORExpression[?In, ?Yield]
|
||||
LogicalORExpression[?In, ?Yield] ? AssignmentExpression[+In, ?Yield] : AssignmentExpression[?In, ?Yield]
|
||||
negative: SyntaxError
|
||||
---*/
|
||||
|
||||
for (true ? 0 : 0 in {}; false; ) ;
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-conditional-operator
|
||||
es6id: 12.13
|
||||
description: >
|
||||
The expression's LogicalORExpression sub-expression cannot include the `in`
|
||||
keyword in contexts where it is disallowed.
|
||||
info: |
|
||||
Syntax
|
||||
|
||||
ConditionalExpression[In, Yield] :
|
||||
LogicalORExpression[?In, ?Yield]
|
||||
LogicalORExpression[?In, ?Yield] ? AssignmentExpression[+In, ?Yield] : AssignmentExpression[?In, ?Yield]
|
||||
negative: SyntaxError
|
||||
---*/
|
||||
|
||||
for ('' in {} ? 0 : 0; false; ) ;
|
|
@ -0,0 +1,35 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-delete-operator-runtime-semantics-evaluation
|
||||
es6id: 12.5.4.2
|
||||
description: SuperReferences may not be deleted
|
||||
info: |
|
||||
[...]
|
||||
5.If IsPropertyReference(ref) is true, then
|
||||
a. If IsSuperReference(ref) is true, throw a ReferenceError exception.
|
||||
features: [class]
|
||||
---*/
|
||||
|
||||
var caught;
|
||||
|
||||
class C extends Object {
|
||||
constructor() {
|
||||
try {
|
||||
delete super.x;
|
||||
} catch (err) {
|
||||
caught = err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// When the "construct" invocation completes and the "this" value is
|
||||
// uninitialized, the specification dictates that a ReferenceError must be
|
||||
// thrown. That behavior is tested elsewhere, so the error is ignored (if it is
|
||||
// produced at all).
|
||||
try {
|
||||
new C();
|
||||
} catch (_) {}
|
||||
|
||||
assert.sameValue(typeof caught, 'object');
|
||||
assert.sameValue(caught.constructor, ReferenceError);
|
|
@ -0,0 +1,66 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-meta-properties-runtime-semantics-evaluation
|
||||
es6id: 12.3.8.1
|
||||
description: NewTarget is composed of three distinct tokens
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
|
||||
var withSpaces = function() {
|
||||
newTarget = new . target;
|
||||
};
|
||||
|
||||
withSpaces();
|
||||
assert.sameValue(newTarget, undefined, 'tokens seperated by whitespace');
|
||||
|
||||
new withSpaces();
|
||||
assert.sameValue(newTarget, withSpaces, 'tokens separateed by whitespace');
|
||||
|
||||
newTarget = null;
|
||||
|
||||
var withLineBreaks = function() {
|
||||
newTarget = new
|
||||
|
||||
.
|
||||
|
||||
target;
|
||||
};
|
||||
|
||||
withLineBreaks();
|
||||
assert.sameValue(newTarget, undefined, 'tokens seperated by line breaks');
|
||||
|
||||
new withLineBreaks();
|
||||
assert.sameValue(newTarget, withLineBreaks, 'tokens seperated by line breaks');
|
||||
|
||||
var withSLDC = function() {
|
||||
newTarget = new/* */./* */target;
|
||||
};
|
||||
|
||||
withSLDC();
|
||||
assert.sameValue(
|
||||
newTarget, undefined, 'tokens separated by SingleLineDelimitedComments'
|
||||
);
|
||||
|
||||
new withSLDC();
|
||||
assert.sameValue(
|
||||
newTarget, withSLDC, 'tokens separated by SingleLineDelimitedComments'
|
||||
);
|
||||
|
||||
|
||||
var withMLC = function() {
|
||||
newTarget = new/*
|
||||
*/./*
|
||||
*/target;
|
||||
};
|
||||
|
||||
withMLC();
|
||||
assert.sameValue(
|
||||
newTarget, undefined, 'tokens separated by MultiLineComments'
|
||||
);
|
||||
|
||||
new withMLC();
|
||||
assert.sameValue(
|
||||
newTarget, withMLC, 'tokens separated by MultiLineComments'
|
||||
);
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-function-calls-runtime-semantics-evaluation
|
||||
es6id: 12.3.4.1
|
||||
description: Value when invoked via CallExpression
|
||||
info: |
|
||||
CallExpression : MemberExpressionArguments
|
||||
|
||||
[...]
|
||||
8. Return ? EvaluateDirectCall(func, thisValue, Arguments, tailCall).
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
|
||||
function f() {
|
||||
newTarget = new.target;
|
||||
}
|
||||
|
||||
f();
|
||||
|
||||
assert.sameValue(newTarget, undefined);
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-function.prototype.apply
|
||||
es6id: 19.2.3.1
|
||||
description: Value when invoked via `Function.prototype.apply`
|
||||
info: |
|
||||
[...]
|
||||
5. Return ? Call(func, thisArg, argList).
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
|
||||
function f() {
|
||||
newTarget = new.target;
|
||||
}
|
||||
|
||||
f.apply({});
|
||||
|
||||
assert.sameValue(newTarget, undefined);
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-function.prototype.call
|
||||
es6id: 19.2.3.3
|
||||
description: Value when invoked via `Function.prototype.call`
|
||||
info: |
|
||||
[...]
|
||||
5. Return ? Call(func, thisArg, argList).
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
|
||||
function f() {
|
||||
newTarget = new.target;
|
||||
}
|
||||
|
||||
f.call({});
|
||||
|
||||
assert.sameValue(newTarget, undefined);
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-property-accessors-runtime-semantics-evaluation
|
||||
es6id: 12.3.2.1
|
||||
description: Value when invoked via MemberExpression
|
||||
info: |
|
||||
MemberExpression:MemberExpression.IdentifierName
|
||||
|
||||
[...]
|
||||
6. Return a value of type Reference whose base value component is bv, whose
|
||||
referenced name component is propertyNameString, and whose strict
|
||||
reference flag is strict.
|
||||
|
||||
13.5.1 Runtime Semantics: Evaluation
|
||||
|
||||
ExpressionStatement : Expression ;
|
||||
|
||||
1. Let exprRef be the result of evaluating Expression.
|
||||
2. Return ? GetValue(exprRef).
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
|
||||
var obj = {
|
||||
get m() {
|
||||
newTarget = new.target;
|
||||
}
|
||||
};
|
||||
|
||||
obj.m;
|
||||
|
||||
assert.sameValue(newTarget, undefined);
|
|
@ -0,0 +1,39 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-new-operator-runtime-semantics-evaluation
|
||||
es6id: 12.3.3.1
|
||||
description: Value when invoked via NewExpression
|
||||
info: |
|
||||
NewExpression:newNewExpression
|
||||
|
||||
1. Return ? EvaluateNew(NewExpression, empty).
|
||||
|
||||
MemberExpression:newMemberExpressionArguments
|
||||
|
||||
2. Return ? EvaluateNew(MemberExpression, Arguments).
|
||||
|
||||
12.3.3.1.1 Runtime Semantics: EvaluateNew
|
||||
|
||||
[...]
|
||||
8. Return ? Construct(constructor, argList).
|
||||
|
||||
7.3.13 Construct (F [ , argumentsList [ , newTarget ]])
|
||||
|
||||
1. If newTarget was not passed, let newTarget be F.
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
function f() {
|
||||
newTarget = new.target;
|
||||
}
|
||||
|
||||
new f;
|
||||
|
||||
assert.sameValue(newTarget, f, 'Invoked without Arguments');
|
||||
|
||||
newTarget = null;
|
||||
|
||||
new f();
|
||||
|
||||
assert.sameValue(newTarget, f, 'Invoked with Arguments');
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-reflect.apply
|
||||
es6id: 26.1.1
|
||||
description: Value when invoked via `Reflect.apply`
|
||||
info: |
|
||||
[...]
|
||||
5. Return ? Call(target, thisArgument, args).
|
||||
features: [Reflect]
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
|
||||
function f() {
|
||||
newTarget = new.target;
|
||||
}
|
||||
|
||||
Reflect.apply(f, {}, []);
|
||||
|
||||
assert.sameValue(newTarget, undefined);
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-reflect.construct
|
||||
es6id: 26.1.2
|
||||
description: Value when invoked via `Reflect.construct`
|
||||
info: |
|
||||
[...]
|
||||
2. If newTarget is not present, let newTarget be target.
|
||||
[...]
|
||||
5. Return ? Construct(target, args, newTarget).
|
||||
features: [Reflect]
|
||||
---*/
|
||||
|
||||
var customNewTarget = function() {};
|
||||
var newTarget = null;
|
||||
|
||||
function f() {
|
||||
newTarget = new.target;
|
||||
}
|
||||
|
||||
Reflect.construct(f, []);
|
||||
|
||||
assert.sameValue(newTarget, f, 'NewTarget unspecified');
|
||||
|
||||
Reflect.construct(f, [], customNewTarget);
|
||||
|
||||
assert.sameValue(newTarget, customNewTarget, 'NewTarget explicitly defined');
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-super-keyword-runtime-semantics-evaluation
|
||||
es6id: 12.3.5.1
|
||||
description: Value when invoked via SuperCall
|
||||
info: |
|
||||
SuperCall : super Arguments
|
||||
|
||||
1. Let newTarget be GetNewTarget().
|
||||
[...]
|
||||
6. Let result be ? Construct(func, argList, newTarget).
|
||||
[...]
|
||||
features: [class]
|
||||
---*/
|
||||
|
||||
var baseNewTarget, parentNewTarget;
|
||||
|
||||
class Base {
|
||||
constructor() {
|
||||
baseNewTarget = new.target;
|
||||
}
|
||||
}
|
||||
|
||||
class Parent extends Base {
|
||||
constructor() {
|
||||
parentNewTarget = new.target;
|
||||
super();
|
||||
}
|
||||
}
|
||||
|
||||
class Child extends Parent {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
}
|
||||
|
||||
new Child();
|
||||
|
||||
assert.sameValue(parentNewTarget, Child, 'within "parent" constructor');
|
||||
assert.sameValue(baseNewTarget, Child, 'within "base" constructor');
|
|
@ -0,0 +1,34 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-super-keyword-runtime-semantics-evaluation
|
||||
es6id: 12.3.5.1
|
||||
description: Value when invoked via SuperCall
|
||||
info: |
|
||||
SuperCall : super Arguments
|
||||
|
||||
1. Let newTarget be GetNewTarget().
|
||||
[...]
|
||||
6. Let result be ? Construct(func, argList, newTarget).
|
||||
[...]
|
||||
features: [class]
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
|
||||
class Parent {
|
||||
get attr() {
|
||||
newTarget = new.target;
|
||||
}
|
||||
}
|
||||
|
||||
class Child extends Parent {
|
||||
constructor() {
|
||||
super();
|
||||
super.attr;
|
||||
}
|
||||
}
|
||||
|
||||
new Child();
|
||||
|
||||
assert.sameValue(newTarget, undefined);
|
|
@ -0,0 +1,23 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-tagged-templates-runtime-semantics-evaluation
|
||||
es6id: 12.3.7.1
|
||||
description: Value when invoked via tagged template
|
||||
info: |
|
||||
MemberExpression : MemberExpression TemplateLiteral
|
||||
|
||||
[...]
|
||||
4. Return ? EvaluateCall(tagRef, TemplateLiteral, tailCall).
|
||||
features: [template]
|
||||
---*/
|
||||
|
||||
var newTarget = null;
|
||||
|
||||
function f() {
|
||||
newTarget = new.target;
|
||||
}
|
||||
|
||||
f``;
|
||||
|
||||
assert.sameValue(newTarget, undefined);
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-object-initializer-static-semantics-early-errors
|
||||
es6id: 12.2.6.1
|
||||
description: Initialized name is explicitly barred from object initializers
|
||||
info: |
|
||||
PropertyDefinition : CoverInitializedName
|
||||
|
||||
- Always throw a Syntax Error if code matches this production.
|
||||
|
||||
NOTE This production exists so that ObjectLiteral can serve as a cover
|
||||
grammar for ObjectAssignmentPattern. It cannot occur in an actual object
|
||||
initializer.
|
||||
|
||||
12.2.6 Object Initializer
|
||||
|
||||
Syntax
|
||||
|
||||
[...]
|
||||
|
||||
CoverInitializedName[Yield]:
|
||||
|
||||
IdentifierReference[?Yield] Initializer[+In, ?Yield]
|
||||
negative: SyntaxError
|
||||
---*/
|
||||
|
||||
({ a = 1 });
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-scripts-static-semantics-early-errors
|
||||
es6id: 15.1.1
|
||||
description: An ArrowFunction in global code may not contain `new.target`
|
||||
info: |
|
||||
- It is a Syntax Error if StatementList Contains NewTarget unless the source
|
||||
code containing NewTarget is eval code that is being processed by a direct
|
||||
eval that is contained in function code that is not the function code of an
|
||||
ArrowFunction.
|
||||
|
||||
14.2.3 Static Semantics: Contains
|
||||
|
||||
With parameter symbol.
|
||||
|
||||
ArrowFunction : ArrowParameters => ConciseBody
|
||||
|
||||
1. If symbol is not one of NewTarget, SuperProperty, SuperCall, super or
|
||||
this, return false.
|
||||
2. If ArrowParameters Contains symbol is true, return true.
|
||||
3. Return ConciseBody Contains symbol.
|
||||
|
||||
NOTE Normally, Contains does not look inside most function forms. However,
|
||||
Contains is used to detect new.target, this, and super usage within an
|
||||
ArrowFunction.
|
||||
features: [arrow-function]
|
||||
negative: SyntaxError
|
||||
---*/
|
||||
|
||||
() => {
|
||||
new.target;
|
||||
};
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
/*---
|
||||
esid: sec-scripts-static-semantics-early-errors
|
||||
es6id: 15.1.1
|
||||
description: Global code may not contain `new.target`
|
||||
info: |
|
||||
- It is a Syntax Error if StatementList Contains NewTarget unless the source
|
||||
code containing NewTarget is eval code that is being processed by a direct
|
||||
eval that is contained in function code that is not the function code of an
|
||||
ArrowFunction.
|
||||
negative: SyntaxError
|
||||
---*/
|
||||
|
||||
new.target;
|
Loading…
Reference in New Issue