diff --git a/spec.html b/spec.html index 50a32f527e..100e090abd 100644 --- a/spec.html +++ b/spec.html @@ -25365,7 +25365,7 @@

- +

Static Semantics: HasCallInTailPosition ( _call_: a |CallExpression| Parse Node, a |MemberExpression| Parse Node, or an |OptionalChain| Parse Node, @@ -25376,333 +25376,327 @@

_call_ is a Parse Node that represents a specific range of source text. When the following algorithms compare _call_ to another Parse Node, it is a test of whether they represent the same source text.

+ +

A potential tail position call that is immediately followed by return GetValue of the call result is also a possible tail position call. A function call cannot return a Reference Record, so such a GetValue operation will always return the same value as the actual function call result.

+
- -

Statement Rules

- StatementList : StatementList StatementListItem - - 1. Let _has_ be HasCallInTailPosition of |StatementList| with argument _call_. - 1. If _has_ is *true*, return *true*. - 1. Return HasCallInTailPosition of |StatementListItem| with argument _call_. - - - FunctionStatementList : - [empty] + StatementList : StatementList StatementListItem + + 1. Let _has_ be HasCallInTailPosition of |StatementList| with argument _call_. + 1. If _has_ is *true*, return *true*. + 1. Return HasCallInTailPosition of |StatementListItem| with argument _call_. + + + FunctionStatementList : + [empty] - StatementListItem : - Declaration + StatementListItem : + Declaration - Statement : - VariableStatement - EmptyStatement - ExpressionStatement - ContinueStatement - BreakStatement - ThrowStatement - DebuggerStatement + Statement : + VariableStatement + EmptyStatement + ExpressionStatement + ContinueStatement + BreakStatement + ThrowStatement + DebuggerStatement - Block : - `{` `}` + Block : + `{` `}` - ReturnStatement : - `return` `;` + ReturnStatement : + `return` `;` - LabelledItem : - FunctionDeclaration + LabelledItem : + FunctionDeclaration - ForInOfStatement : - `for` `(` LeftHandSideExpression `of` AssignmentExpression `)` Statement - `for` `(` `var` ForBinding `of` AssignmentExpression `)` Statement - `for` `(` ForDeclaration `of` AssignmentExpression `)` Statement + ForInOfStatement : + `for` `(` LeftHandSideExpression `of` AssignmentExpression `)` Statement + `for` `(` `var` ForBinding `of` AssignmentExpression `)` Statement + `for` `(` ForDeclaration `of` AssignmentExpression `)` Statement - CaseBlock : - `{` `}` - - - 1. Return *false*. - - IfStatement : `if` `(` Expression `)` Statement `else` Statement - - 1. Let _has_ be HasCallInTailPosition of the first |Statement| with argument _call_. - 1. If _has_ is *true*, return *true*. - 1. Return HasCallInTailPosition of the second |Statement| with argument _call_. - - - IfStatement : - `if` `(` Expression `)` Statement + CaseBlock : + `{` `}` + + + 1. Return *false*. + + IfStatement : `if` `(` Expression `)` Statement `else` Statement + + 1. Let _has_ be HasCallInTailPosition of the first |Statement| with argument _call_. + 1. If _has_ is *true*, return *true*. + 1. Return HasCallInTailPosition of the second |Statement| with argument _call_. + + + IfStatement : + `if` `(` Expression `)` Statement - DoWhileStatement : - `do` Statement `while` `(` Expression `)` `;` + DoWhileStatement : + `do` Statement `while` `(` Expression `)` `;` - WhileStatement : - `while` `(` Expression `)` Statement + WhileStatement : + `while` `(` Expression `)` Statement - ForStatement : - `for` `(` Expression? `;` Expression? `;` Expression? `)` Statement - `for` `(` `var` VariableDeclarationList `;` Expression? `;` Expression? `)` Statement - `for` `(` LexicalDeclaration Expression? `;` Expression? `)` Statement + ForStatement : + `for` `(` Expression? `;` Expression? `;` Expression? `)` Statement + `for` `(` `var` VariableDeclarationList `;` Expression? `;` Expression? `)` Statement + `for` `(` LexicalDeclaration Expression? `;` Expression? `)` Statement - ForInOfStatement : - `for` `(` LeftHandSideExpression `in` Expression `)` Statement - `for` `(` `var` ForBinding `in` Expression `)` Statement - `for` `(` ForDeclaration `in` Expression `)` Statement + ForInOfStatement : + `for` `(` LeftHandSideExpression `in` Expression `)` Statement + `for` `(` `var` ForBinding `in` Expression `)` Statement + `for` `(` ForDeclaration `in` Expression `)` Statement - WithStatement : - `with` `(` Expression `)` Statement - - - 1. Return HasCallInTailPosition of |Statement| with argument _call_. - - - LabelledStatement : - LabelIdentifier `:` LabelledItem - - - 1. Return HasCallInTailPosition of |LabelledItem| with argument _call_. - - ReturnStatement : `return` Expression `;` - - 1. Return HasCallInTailPosition of |Expression| with argument _call_. - - SwitchStatement : `switch` `(` Expression `)` CaseBlock - - 1. Return HasCallInTailPosition of |CaseBlock| with argument _call_. - - CaseBlock : `{` CaseClauses? DefaultClause CaseClauses? `}` - - 1. Let _has_ be *false*. - 1. If the first |CaseClauses| is present, let _has_ be HasCallInTailPosition of the first |CaseClauses| with argument _call_. - 1. If _has_ is *true*, return *true*. - 1. Let _has_ be HasCallInTailPosition of |DefaultClause| with argument _call_. - 1. If _has_ is *true*, return *true*. - 1. If the second |CaseClauses| is present, let _has_ be HasCallInTailPosition of the second |CaseClauses| with argument _call_. - 1. Return _has_. - - CaseClauses : CaseClauses CaseClause - - 1. Let _has_ be HasCallInTailPosition of |CaseClauses| with argument _call_. - 1. If _has_ is *true*, return *true*. - 1. Return HasCallInTailPosition of |CaseClause| with argument _call_. - - - CaseClause : `case` Expression `:` StatementList? + WithStatement : + `with` `(` Expression `)` Statement + + + 1. Return HasCallInTailPosition of |Statement| with argument _call_. + + + LabelledStatement : + LabelIdentifier `:` LabelledItem + + + 1. Return HasCallInTailPosition of |LabelledItem| with argument _call_. + + ReturnStatement : `return` Expression `;` + + 1. Return HasCallInTailPosition of |Expression| with argument _call_. + + SwitchStatement : `switch` `(` Expression `)` CaseBlock + + 1. Return HasCallInTailPosition of |CaseBlock| with argument _call_. + + CaseBlock : `{` CaseClauses? DefaultClause CaseClauses? `}` + + 1. Let _has_ be *false*. + 1. If the first |CaseClauses| is present, let _has_ be HasCallInTailPosition of the first |CaseClauses| with argument _call_. + 1. If _has_ is *true*, return *true*. + 1. Let _has_ be HasCallInTailPosition of |DefaultClause| with argument _call_. + 1. If _has_ is *true*, return *true*. + 1. If the second |CaseClauses| is present, let _has_ be HasCallInTailPosition of the second |CaseClauses| with argument _call_. + 1. Return _has_. + + CaseClauses : CaseClauses CaseClause + + 1. Let _has_ be HasCallInTailPosition of |CaseClauses| with argument _call_. + 1. If _has_ is *true*, return *true*. + 1. Return HasCallInTailPosition of |CaseClause| with argument _call_. + + + CaseClause : `case` Expression `:` StatementList? - DefaultClause : `default` `:` StatementList? - - - 1. If |StatementList| is present, return HasCallInTailPosition of |StatementList| with argument _call_. - 1. Return *false*. - - TryStatement : `try` Block Catch - - 1. Return HasCallInTailPosition of |Catch| with argument _call_. - - - TryStatement : - `try` Block Finally - `try` Block Catch Finally - - - 1. Return HasCallInTailPosition of |Finally| with argument _call_. - - Catch : `catch` `(` CatchParameter `)` Block - - 1. Return HasCallInTailPosition of |Block| with argument _call_. - -
+ DefaultClause : `default` `:` StatementList? + + + 1. If |StatementList| is present, return HasCallInTailPosition of |StatementList| with argument _call_. + 1. Return *false*. + + TryStatement : `try` Block Catch + + 1. Return HasCallInTailPosition of |Catch| with argument _call_. + + + TryStatement : + `try` Block Finally + `try` Block Catch Finally + + + 1. Return HasCallInTailPosition of |Finally| with argument _call_. + + Catch : `catch` `(` CatchParameter `)` Block + + 1. Return HasCallInTailPosition of |Block| with argument _call_. + - -

Expression Rules

- -

A potential tail position call that is immediately followed by return GetValue of the call result is also a possible tail position call. A function call cannot return a Reference Record, so such a GetValue operation will always return the same value as the actual function call result.

-
- - AssignmentExpression : - YieldExpression - ArrowFunction - AsyncArrowFunction - LeftHandSideExpression `=` AssignmentExpression - LeftHandSideExpression AssignmentOperator AssignmentExpression - LeftHandSideExpression `&&=` AssignmentExpression - LeftHandSideExpression `||=` AssignmentExpression - LeftHandSideExpression `??=` AssignmentExpression - - BitwiseANDExpression : - BitwiseANDExpression `&` EqualityExpression - - BitwiseXORExpression : - BitwiseXORExpression `^` BitwiseANDExpression - - BitwiseORExpression : - BitwiseORExpression `|` BitwiseXORExpression - - EqualityExpression : - EqualityExpression `==` RelationalExpression - EqualityExpression `!=` RelationalExpression - EqualityExpression `===` RelationalExpression - EqualityExpression `!==` RelationalExpression - - RelationalExpression : - RelationalExpression `<` ShiftExpression - RelationalExpression `>` ShiftExpression - RelationalExpression `<=` ShiftExpression - RelationalExpression `>=` ShiftExpression - RelationalExpression `instanceof` ShiftExpression - RelationalExpression `in` ShiftExpression - PrivateIdentifier `in` ShiftExpression - - ShiftExpression : - ShiftExpression `<<` AdditiveExpression - ShiftExpression `>>` AdditiveExpression - ShiftExpression `>>>` AdditiveExpression - - AdditiveExpression : - AdditiveExpression `+` MultiplicativeExpression - AdditiveExpression `-` MultiplicativeExpression - - MultiplicativeExpression : - MultiplicativeExpression MultiplicativeOperator ExponentiationExpression - - ExponentiationExpression : - UpdateExpression `**` ExponentiationExpression - - UpdateExpression : - LeftHandSideExpression `++` - LeftHandSideExpression `--` - `++` UnaryExpression - `--` UnaryExpression - - UnaryExpression : - `delete` UnaryExpression - `void` UnaryExpression - `typeof` UnaryExpression - `+` UnaryExpression - `-` UnaryExpression - `~` UnaryExpression - `!` UnaryExpression - AwaitExpression - - CallExpression : - SuperCall - CallExpression `[` Expression `]` - CallExpression `.` IdentifierName - CallExpression `.` PrivateIdentifier + + AssignmentExpression : + YieldExpression + ArrowFunction + AsyncArrowFunction + LeftHandSideExpression `=` AssignmentExpression + LeftHandSideExpression AssignmentOperator AssignmentExpression + LeftHandSideExpression `&&=` AssignmentExpression + LeftHandSideExpression `||=` AssignmentExpression + LeftHandSideExpression `??=` AssignmentExpression - NewExpression : - `new` NewExpression + BitwiseANDExpression : + BitwiseANDExpression `&` EqualityExpression - MemberExpression : - MemberExpression `[` Expression `]` - MemberExpression `.` IdentifierName - SuperProperty - MetaProperty - `new` MemberExpression Arguments - MemberExpression `.` PrivateIdentifier + BitwiseXORExpression : + BitwiseXORExpression `^` BitwiseANDExpression - PrimaryExpression : - `this` - IdentifierReference - Literal - ArrayLiteral - ObjectLiteral - FunctionExpression - ClassExpression - GeneratorExpression - AsyncFunctionExpression - AsyncGeneratorExpression - RegularExpressionLiteral - TemplateLiteral - - - 1. Return *false*. - - - Expression : - AssignmentExpression - Expression `,` AssignmentExpression - - - 1. Return HasCallInTailPosition of |AssignmentExpression| with argument _call_. - - ConditionalExpression : ShortCircuitExpression `?` AssignmentExpression `:` AssignmentExpression - - 1. Let _has_ be HasCallInTailPosition of the first |AssignmentExpression| with argument _call_. - 1. If _has_ is *true*, return *true*. - 1. Return HasCallInTailPosition of the second |AssignmentExpression| with argument _call_. - - LogicalANDExpression : LogicalANDExpression `&&` BitwiseORExpression - - 1. Return HasCallInTailPosition of |BitwiseORExpression| with argument _call_. - - LogicalORExpression : LogicalORExpression `||` LogicalANDExpression - - 1. Return HasCallInTailPosition of |LogicalANDExpression| with argument _call_. - - CoalesceExpression : CoalesceExpressionHead `??` BitwiseORExpression - - 1. Return HasCallInTailPosition of |BitwiseORExpression| with argument _call_. - - - CallExpression : - CoverCallExpressionAndAsyncArrowHead - CallExpression Arguments - CallExpression TemplateLiteral - - - 1. If this |CallExpression| is _call_, return *true*. - 1. Return *false*. - - - OptionalExpression : - MemberExpression OptionalChain - CallExpression OptionalChain - OptionalExpression OptionalChain - - - 1. Return HasCallInTailPosition of |OptionalChain| with argument _call_. - - - OptionalChain : - `?.` `[` Expression `]` - `?.` IdentifierName - `?.` PrivateIdentifier - OptionalChain `[` Expression `]` - OptionalChain `.` IdentifierName - OptionalChain `.` PrivateIdentifier - - - 1. Return *false*. - - - OptionalChain : - `?.` Arguments - OptionalChain Arguments - - - 1. If this |OptionalChain| is _call_, return *true*. - 1. Return *false*. - - - MemberExpression : - MemberExpression TemplateLiteral - - - 1. If this |MemberExpression| is _call_, return *true*. - 1. Return *false*. - - PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList - - 1. Let _expr_ be the |ParenthesizedExpression| that is covered by |CoverParenthesizedExpressionAndArrowParameterList|. - 1. Return HasCallInTailPosition of _expr_ with argument _call_. - - - ParenthesizedExpression : - `(` Expression `)` - - - 1. Return HasCallInTailPosition of |Expression| with argument _call_. - -
+ BitwiseORExpression : + BitwiseORExpression `|` BitwiseXORExpression + + EqualityExpression : + EqualityExpression `==` RelationalExpression + EqualityExpression `!=` RelationalExpression + EqualityExpression `===` RelationalExpression + EqualityExpression `!==` RelationalExpression + + RelationalExpression : + RelationalExpression `<` ShiftExpression + RelationalExpression `>` ShiftExpression + RelationalExpression `<=` ShiftExpression + RelationalExpression `>=` ShiftExpression + RelationalExpression `instanceof` ShiftExpression + RelationalExpression `in` ShiftExpression + PrivateIdentifier `in` ShiftExpression + + ShiftExpression : + ShiftExpression `<<` AdditiveExpression + ShiftExpression `>>` AdditiveExpression + ShiftExpression `>>>` AdditiveExpression + + AdditiveExpression : + AdditiveExpression `+` MultiplicativeExpression + AdditiveExpression `-` MultiplicativeExpression + + MultiplicativeExpression : + MultiplicativeExpression MultiplicativeOperator ExponentiationExpression + + ExponentiationExpression : + UpdateExpression `**` ExponentiationExpression + + UpdateExpression : + LeftHandSideExpression `++` + LeftHandSideExpression `--` + `++` UnaryExpression + `--` UnaryExpression + + UnaryExpression : + `delete` UnaryExpression + `void` UnaryExpression + `typeof` UnaryExpression + `+` UnaryExpression + `-` UnaryExpression + `~` UnaryExpression + `!` UnaryExpression + AwaitExpression + + CallExpression : + SuperCall + CallExpression `[` Expression `]` + CallExpression `.` IdentifierName + CallExpression `.` PrivateIdentifier + + NewExpression : + `new` NewExpression + + MemberExpression : + MemberExpression `[` Expression `]` + MemberExpression `.` IdentifierName + SuperProperty + MetaProperty + `new` MemberExpression Arguments + MemberExpression `.` PrivateIdentifier + + PrimaryExpression : + `this` + IdentifierReference + Literal + ArrayLiteral + ObjectLiteral + FunctionExpression + ClassExpression + GeneratorExpression + AsyncFunctionExpression + AsyncGeneratorExpression + RegularExpressionLiteral + TemplateLiteral + + + 1. Return *false*. + + + Expression : + AssignmentExpression + Expression `,` AssignmentExpression + + + 1. Return HasCallInTailPosition of |AssignmentExpression| with argument _call_. + + ConditionalExpression : ShortCircuitExpression `?` AssignmentExpression `:` AssignmentExpression + + 1. Let _has_ be HasCallInTailPosition of the first |AssignmentExpression| with argument _call_. + 1. If _has_ is *true*, return *true*. + 1. Return HasCallInTailPosition of the second |AssignmentExpression| with argument _call_. + + LogicalANDExpression : LogicalANDExpression `&&` BitwiseORExpression + + 1. Return HasCallInTailPosition of |BitwiseORExpression| with argument _call_. + + LogicalORExpression : LogicalORExpression `||` LogicalANDExpression + + 1. Return HasCallInTailPosition of |LogicalANDExpression| with argument _call_. + + CoalesceExpression : CoalesceExpressionHead `??` BitwiseORExpression + + 1. Return HasCallInTailPosition of |BitwiseORExpression| with argument _call_. + + + CallExpression : + CoverCallExpressionAndAsyncArrowHead + CallExpression Arguments + CallExpression TemplateLiteral + + + 1. If this |CallExpression| is _call_, return *true*. + 1. Return *false*. + + + OptionalExpression : + MemberExpression OptionalChain + CallExpression OptionalChain + OptionalExpression OptionalChain + + + 1. Return HasCallInTailPosition of |OptionalChain| with argument _call_. + + + OptionalChain : + `?.` `[` Expression `]` + `?.` IdentifierName + `?.` PrivateIdentifier + OptionalChain `[` Expression `]` + OptionalChain `.` IdentifierName + OptionalChain `.` PrivateIdentifier + + + 1. Return *false*. + + + OptionalChain : + `?.` Arguments + OptionalChain Arguments + + + 1. If this |OptionalChain| is _call_, return *true*. + 1. Return *false*. + + + MemberExpression : + MemberExpression TemplateLiteral + + + 1. If this |MemberExpression| is _call_, return *true*. + 1. Return *false*. + + PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList + + 1. Let _expr_ be the |ParenthesizedExpression| that is covered by |CoverParenthesizedExpressionAndArrowParameterList|. + 1. Return HasCallInTailPosition of _expr_ with argument _call_. + + + ParenthesizedExpression : + `(` Expression `)` + + + 1. Return HasCallInTailPosition of |Expression| with argument _call_. +