Skip to content
This repository has been archived by the owner on Sep 8, 2021. It is now read-only.

Add restrictions for arguments and SuperCall #15

Merged
merged 3 commits into from Nov 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
25 changes: 16 additions & 9 deletions README.md
Expand Up @@ -194,17 +194,24 @@ class C {
<!--#region:semantics-->
# Semantics

- A `static {}` block creates a new lexical scope (e.g. `var`, `function`, and block-scoped
declarations are local to the `static {}` block. This lexical scope is nested within the lexical
scope of the class body (granting privileged access to instance private state for the class).
- A class may have at most one `static {}` block in its class body.
- A `static {}` block is evaluated immediately after all public static field initializers have been
evaluated as part of class declaration evaluation, regardless of its order within the class body
- A `static {}` initialization block creates a new lexical scope (e.g. `var`, `function`, and block-scoped
declarations are local to the `static {}` initialization block. This lexical scope is nested within the lexical
scope of the class body (granting privileged access to instance private state for the class).
- A class may have at most one `static {}` initialization block in its class body.
- A `static {}` initialization block is evaluated immediately after all static field initializers have been
evaluated as part of class declaration evaluation, regardless of its order within the class body
(this aligns with `constructor() {}`).
- A `static {}` block may not have decorators (instead you would decorate the class itself).
- A `static {}` initialization block may not have decorators (instead you would decorate the class itself).
Decorators can always add a class finisher to add their own static initialization.
- When evaluated, a `static {}` block's `this` receiver is the constructor object of the class
- When evaluated, a `static {}` initialization block's `this` receiver is the constructor object of the class
(as with static field initializers).
- It is a **Syntax Error** to reference `arguments` from within a `static {}` initialization block.
- It is a **Syntax Error** to include a _SuperCall_ (i.e., `super()`) from within a `static {}` initialization block.
- A `static {}` initialization block may contain _SuperProperty_ references as a means to access or invoke static
members on a base class that may have been overridden by the derived class containing the `static {}`
initialization block.
- A `static {}` initialization block should be represented as an independent stack frame in debuggers and exception
traces.

<!--#endregion:semantics-->

Expand Down Expand Up @@ -313,7 +320,7 @@ The following is a high-level list of tasks to progress through each stage of th
[Prose]: #motivations
[Examples]: #examples
[API]: #api
[Specification]: https://rbuckton.github.io/proposal-class-static-block
[Specification]: https://tc39.es/proposal-class-static-block
[Transpiler]: #todo
[Stage3ReviewerSignOff]: #todo
[Stage3EditorSignOff]: #todo
Expand Down
227 changes: 137 additions & 90 deletions docs/index.html

Large diffs are not rendered by default.

38 changes: 23 additions & 15 deletions spec/index.html
Expand Up @@ -9,28 +9,36 @@
</pre>

<emu-intro id="sec-intro">
<h1>Introduction</h1>
<emu-import href="sec-introduction.html"></emu-import>
<h1>Introduction</h1>
<emu-import href="sec-introduction.html"></emu-import>
</emu-intro>

<emu-clause id="sec-executable-code-and-execution-contexts">
<h1>Executable Code and Execution Contexts</h1>
<emu-import href="sec-executable-code-and-execution-contexts-patch.html"></emu-import>
<h1>Executable Code and Execution Contexts</h1>
<emu-import href="sec-executable-code-and-execution-contexts-patch.html"></emu-import>
</emu-clause>

<emu-clause id="sec-ecmascript-language-expressions">
<h1>ECMAScript Language: Expressions</h1>
<emu-clause id="sec-identifiers">
<h1>Identifiers</h1>
<emu-import href="sec-identifiers-static-semantics-early-errors-patch.html"></emu-import>
</emu-clause>
</emu-clause>

<emu-clause id="sec-ecmascript-language-statements-and-declarations">
<h1>ECMAScript Language: Statements and Declarations</h1>
<emu-clause id="sec-continue-statement">
<h1>The `continue` Statement</h1>
<emu-import href="sec-continue-statement-static-semantics-early-errors-patch.html"></emu-import>
</emu-clause>
<emu-clause id="sec-break-statement">
<h1>The `break` Statement</h1>
<emu-import href="sec-break-statement-static-semantics-early-errors-patch.html"></emu-import>
</emu-clause>
<h1>ECMAScript Language: Statements and Declarations</h1>
<emu-clause id="sec-continue-statement">
<h1>The `continue` Statement</h1>
<emu-import href="sec-continue-statement-static-semantics-early-errors-patch.html"></emu-import>
</emu-clause>
<emu-clause id="sec-break-statement">
<h1>The `break` Statement</h1>
<emu-import href="sec-break-statement-static-semantics-early-errors-patch.html"></emu-import>
</emu-clause>
</emu-clause>

<emu-clause id="sec-ecmascript-language-functions-and-classes">
<h1>ECMAScript Language: Functions and Classes</h1>
<emu-import href="sec-class-definitions-patch.html"></emu-import>
<h1>ECMAScript Language: Functions and Classes</h1>
<emu-import href="sec-class-definitions-patch.html"></emu-import>
</emu-clause>
65 changes: 46 additions & 19 deletions spec/sec-class-definitions-patch.html
Expand Up @@ -10,7 +10,7 @@ <h2>Syntax</h2>

<ins>
ClassStaticBlock :
`static` `{` StaticBlockBody `}`
`static` `{` ClassStaticBlockBody `}`

ClassStaticBlockBody :
ClassStaticBlockStatementList
Expand All @@ -28,6 +28,33 @@ <h1>Static Semantics: Early Errors</h1>
<p><ins>It is a Syntax Error if ClassStaticBlockList of |ClassElementList| contains more than one element.</ins></p>
</li>
</ul>
<emu-grammar collapsed><ins>ClassStaticBlock: `static` `{` ClassStaticBlockBody `}`</ins></emu-grammar>
<ul>
<li>
<p><ins>It is a Syntax Error if HasDirectSuper of |ClassStaticBlock| is *true*.</ins></p>
</li>
</ul>
</emu-clause>

<emu-clause id="sec-class-definitions-static-semantics-contains">
<h1>Static Semantics: Contains</h1>
<emu-grammar collapsed><ins>ClassStaticBlock: `static` `{` ClassStaticBlockBody `}`</ins></emu-grammar>
<emu-alg>
1. <ins>Return *false*.</ins>
</emu-alg>
<emu-note>
<ins>
Static semantic rules that depend upon substructure generally do not look into `static` initialization blocks.
</ins>
</emu-note>
</emu-clause>

<emu-clause id="sec-class-definitions-static-semantics-hasdirectsuper">
<h1><ins>Static Semantics: HasDirectSuper</ins></h1>
<emu-grammar collapsed><ins>ClassStaticBlock: `static` `{` ClassStaticBlockBody `}`</ins></emu-grammar>
<emu-alg>
1. <ins>Return |ClassStaticBlockBody| Contains |SuperCall|.</ins>
</emu-alg>
</emu-clause>

<emu-clause id="sec-static-semantics-isstatic">
Expand Down Expand Up @@ -81,46 +108,46 @@ <h1>Static Semantics: PropName</h1>
</emu-clause>

<emu-clause id="sec-class-definitions-static-semantics-LexicallyDeclaredNames">
<h1>Static Semantics: VarDeclaredNames</h1>
<emu-grammar collapsed>ClassBlockStatementList: [empty]</emu-grammar>
<h1>Static Semantics: LexicallyDeclaredNames</h1>
<emu-grammar collapsed><ins>ClassBlockStatementList: [empty]</ins></emu-grammar>
<emu-alg>
1. Return a new empty List.
1. <ins>Return a new empty List.</ins>
</emu-alg>
<emu-grammar collapsed>ClassBlockStatementList: StatementList</emu-grammar>
<emu-grammar collapsed><ins>ClassBlockStatementList: StatementList</ins></emu-grammar>
<emu-alg>
1. Return the TopLevelLexicallyDeclaredNames of |StatementList|.
1. <ins>Return the TopLevelLexicallyDeclaredNames of |StatementList|.</ins>
</emu-alg>
</emu-clause>

<emu-clause id="sec-class-definitions-static-semantics-vardeclarednames">
<h1>Static Semantics: VarDeclaredNames</h1>
<emu-grammar collapsed>ClassBlockStatementList: [empty]</emu-grammar>
<emu-grammar collapsed><ins>ClassBlockStatementList: [empty]</ins></emu-grammar>
<emu-alg>
1. Return a new empty List.
1. <ins>Return a new empty List.</ins>
</emu-alg>
<emu-grammar collapsed>ClassBlockStatementList: StatementList</emu-grammar>
<emu-grammar collapsed><ins>ClassBlockStatementList: StatementList</ins></emu-grammar>
<emu-alg>
1. Return the TopLevelVarDeclaredNames of |StatementList|.
1. <ins>Return the TopLevelVarDeclaredNames of |StatementList|.</ins>
</emu-alg>
</emu-clause>

<emu-clause id="sec-class-definitions-static-semantics-varscopeddeclarations">
<h1>Static Semantics: VarScopedDeclarations</h1>
<emu-grammar collapsed>ClassBlockStatementList: [empty]</emu-grammar>
<emu-grammar collapsed><ins>ClassBlockStatementList: [empty]</ins></emu-grammar>
<emu-alg>
1. Return a new empty List.
1. <ins>Return a new empty List.</ins>
</emu-alg>
<emu-grammar collapsed>ClassBlockStatementList: StatementList</emu-grammar>
<emu-grammar collapsed><ins>ClassBlockStatementList: StatementList</ins></emu-grammar>
<emu-alg>
1. Return the TopLevelVarScopedDeclarations of |StatementList|.
1. <ins>Return the TopLevelVarScopedDeclarations of |StatementList|.</ins>
</emu-alg>
</emu-clause>

<emu-clause id="sec-runtime-semantics-classdefinitionevaluation">
<h1>Runtime Semantics: ClassDefinitionEvaluation</h1>
<emu-note>This algorithm is a delta from the <a href="https://tc39.github.io/proposal-class-fields/#runtime-semantics-class-definition-evaluation">Class Fields proposal</a>.</emu-note>
<p>With parameter _className_.</p>
<emu-grammar>ClassTail : ClassHeritage? `{` ClassBody? `}`</emu-grammar>
<emu-grammar collapsed>ClassTail : ClassHeritage? `{` ClassBody? `}`</emu-grammar>
<emu-alg>
1. Let _lex_ be the LexicalEnvironment of the running execution context.
1. Let _classScope_ be NewDeclarativeEnvironment(_lex_).
Expand Down Expand Up @@ -223,7 +250,7 @@ <h1><ins>Runtime Semantics: ClassStaticBlockEvaluation</ins></h1>
</emu-alg>

<emu-clause id="sec-prepareforclassstaticblockevaluation" aoid="PrepareForClassStaticBlockEvaluation">
<h1>PrepareForClassStaticBlockEvaluation ( _F_ )</h1>
<h1><ins>PrepareForClassStaticBlockEvaluation ( _F_ )</ins></h1>
<p>When the abstract operation PrepareForClassStaticBlockEvaluation is called with function object _F_, the following steps are taken:</p>
<emu-alg>
1. Let _outerContext_ be the running execution context.
Expand All @@ -245,7 +272,7 @@ <h1>PrepareForClassStaticBlockEvaluation ( _F_ )</h1>
</emu-clause>

<emu-clause id="sec-classstaticblockbindthis" aoid="ClassStaticBlockBindThis">
<h1>ClassStaticBlockBindThis ( _F_, _innerContext_ )</h1>
<h1><ins>ClassStaticBlockBindThis ( _F_, _innerContext_ )</ins></h1>
<p>When the abstract operation ClassStaticBlockBindThis is called with function object _F_ and execution context _innerContext_, the following steps are taken:</p>
<emu-alg>
1. Let _innerRealm_ be _F_.[[Realm]].
Expand All @@ -258,15 +285,15 @@ <h1>ClassStaticBlockBindThis ( _F_, _innerContext_ )</h1>
</emu-clause>

<emu-clause id="sec-classstaticblockevaluatebody" aoid="ClassStaticBlockEvaluateBody">
<h1>ClassStaticBlockEvaluateBody ( _block_ )</h1>
<h1><ins>ClassStaticBlockEvaluateBody ( _block_ )</ins></h1>
<emu-alg>
1. Perform ? ClassStaticBlockDeclarationInstantiation(_block_).
1. Return the result of evaluating _block_.
</emu-alg>
</emu-clause>

<emu-clause id="classstaticblockdeclarationinstantiation" aoid="ClassStaticBlockDeclarationInstantiation">
<h1>ClassStaticBlockDeclarationInstantiation ( _block_ )</h1>
<h1><ins>ClassStaticBlockDeclarationInstantiation ( _block_ )</ins></h1>
<emu-alg>
1. Let _env_ be the LexicalEnvironment of the running execution context.
1. Let _envRec_ be _env_'s EnvironmentRecord.
Expand Down
@@ -1,14 +1,14 @@
<emu-clause id="sec-continue-statement-static-semantics-early-errors">
<h1>Static Semantics: Early Errors</h1>
<emu-grammar>
ContinueStatement : `continue` `;`
<emu-clause id="sec-continue-statement-static-semantics-early-errors">
<h1>Static Semantics: Early Errors</h1>
<emu-grammar>
ContinueStatement : `continue` `;`

ContinueStatement : `continue` LabelIdentifier `;`
</emu-grammar>
<ul>
<li>
It is a Syntax Error if this |ContinueStatement| is not nested, directly or indirectly (but not crossing function<ins> or `static` initialization block</ins> boundaries), within an |IterationStatement|.
</li>
</ul>
</emu-clause>
ContinueStatement : `continue` LabelIdentifier `;`
</emu-grammar>
<ul>
<li>
It is a Syntax Error if this |ContinueStatement| is not nested, directly or indirectly (but not crossing function<ins> or `static` initialization block</ins> boundaries), within an |IterationStatement|.
</li>
</ul>
</emu-clause>

9 changes: 9 additions & 0 deletions spec/sec-identifiers-static-semantics-early-errors-patch.html
@@ -0,0 +1,9 @@
<emu-clause id="sec-identifiers-static-semantics-early-errors">
<h1>Static Semantics: Early Errors</h1>
<emu-grammar><ins>IdentifierReference : Identifier</ins></emu-grammar>
<ul>
<li>
It is a Syntax Error if the code matched by this production is nested, directly or indirectly (but not crossing function or `static` initialization block boundaries, excluding arrow function boundaries), within a |ClassStaticBlock| and the StringValue of |Identifier| is *"arguments"*.
</li>
</ul>
</emu-clause>