17 エラー処理と言語拡張
実装は、関連する ECMAScript 言語構成要素が評価される時点でほとんどのエラーを報告しなければならない。早期エラー (early error) とは、そのエラーを含む Script 内のいかなる構成要素の評価よりも前に検出・報告できるエラーである。早期エラーが存在する場合、その構成要素の評価は行われない。実装は ParseScript における Script の構文解析の一部として Script 内の早期エラーを報告しなければならない。Module 内の早期エラーは、その Module が評価される時点で報告され、その Module は決して初期化されない。eval コード内の早期エラーは eval
が呼び出された時点で報告され、eval コードの評価を阻止する。早期エラーでないすべてのエラーは実行時エラーである。
実装は、本仕様の「静的意味論: 早期エラー」小節に列挙されている条件が発生したあらゆる箇所を早期エラーとして報告しなければならない。
実装は、たとえコンパイラがある構成要素がいかなる状況でもエラーなく実行されないと証明できる場合であっても、他種のエラーを早期エラーとして扱ってはならない。そのような場合、実装は早期警告を発することは許されるが、関連する構成要素が実際に実行されるまでエラーを報告すべきではない。
実装は、以下を除き、規定どおりにすべてのエラーを報告しなければならない:
-
17.1 による制限を除き、ホストまたは実装は Script 構文、Module 構文、正規表現パターンまたはフラグの構文を拡張してよい。これを許容するため、SyntaxError を送出し得るすべての操作(
eval
の呼び出し、正規表現リテラルの使用、Function や RegExp コンストラクタの使用など)は、スクリプト構文または正規表現パターン/フラグ構文に対するホスト定義拡張に遭遇した際、SyntaxError を送出する代わりにホスト定義の挙動を示すことが許される。
-
17.1 による制限を除き、ホストまたは実装は本仕様で記述されているものを超える追加の型、値、オブジェクト、プロパティ、関数を提供してよい。これは(グローバルスコープでの変数参照などの)構成要素がエラー(たとえば ReferenceError)を送出する代わりにホスト定義の挙動を示す原因となり得る。
17.1 禁止される拡張
実装は以下の方法で本仕様を拡張してはならない:
-
厳格モードコード内の構文コンストラクタで定義された ECMAScript 関数オブジェクトは、"caller" または "arguments" という名前の独自プロパティを持つように作成されてはならない。ArrowFunction, MethodDefinition, GeneratorDeclaration, GeneratorExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression, ClassDeclaration, ClassExpression, AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncArrowFunction によって定義された関数オブジェクトについても、定義が厳格モードコード内に含まれるか否かにかかわらず、同様の独自プロパティを作成してはならない。組み込み関数、Function コンストラクタで生成された厳格関数、Generator コンストラクタで生成された generator 関数、AsyncFunction コンストラクタで生成された async 関数、
bind
メソッドで生成された関数についても、これらの独自プロパティを持ってはならない。
-
実装が任意の関数オブジェクトを "caller" という名前の独自プロパティで拡張する場合、そのプロパティ値([[Get]] または [[GetOwnProperty]] で観測される値)は厳格関数オブジェクトであってはならない。それがアクセサプロパティである場合、その [[Get]] 属性の値である関数は呼び出されたとき決して厳格関数を返してはならない。
-
対応/非対応引数オブジェクトのいずれも "caller" という名前の独自プロパティを持つように作成されてはならない。
-
ECMA-402 で規定される組み込みメソッド(
toLocaleString
など)の挙動は、ECMA-402 に規定される場合を除き拡張してはならない。
-
22.2.1 および B.1.2 にある RegExp パターン文法は、[UnicodeMode] 文法パラメータが存在する場合に、ソース文字 A-Z または a-z のいずれかを IdentityEscape[+UnicodeMode] として認識するよう拡張してはならない。
-
構文文法は、BindingIdentifier 非終端記号でマッチしたソーステキストの直後にトークン
:
が続くことを許すいかなる方法でも拡張してはならない。
-
厳格モードコードを処理する際、実装は 12.9.3.1 の早期エールールを緩和してはならない。
-
TemplateEscapeSequence を 12.9.4 で定義される LegacyOctalEscapeSequence または NonOctalDecimalEscapeSequence を含むよう拡張してはならない。
-
厳格モードコードを処理する際、B.3.1、B.3.2、B.3.3、B.3.5 で定義される拡張はサポートしてはならない。
-
Module ゴール記号に対する構文解析時、B.1.1 で定義される字句文法拡張はサポートしてはならない。
-
ImportCall は拡張してはならない。