9 実行可能コードと実行コンテキスト

9.1 Environment Record

Environment Record は、ECMAScript コードのレキシカルな入れ子構造に基づいて、Identifier と特定の変数および関数との対応付けを定義するために用いられる仕様型である。通常、Environment Record は、FunctionDeclarationBlockStatement、または TryStatementCatch 節のような ECMAScript コードの特定の構文構造に関連付けられる。そのようなコードが評価されるたびに、そのコードによって生成される識別子束縛を記録するために、新しい Environment Record が作成される。

すべての Environment Record は [[OuterEnv]] フィールドを持ち、その値は null または外側の Environment Record への参照である。これは Environment Record 値の論理的な入れ子をモデル化するために用いられる。(内側の)Environment Record の外側参照は、その内側の Environment Record を論理的に取り囲む Environment Record への参照である。もちろん、外側の Environment Record 自身もさらに外側の Environment Record を持ち得る。1 つの Environment Record は、複数の内側の Environment Record にとって外側環境として機能し得る。例えば、ある FunctionDeclaration が 2 つの入れ子の FunctionDeclaration を含む場合、それぞれの入れ子関数の Environment Record は、周囲の関数の現在の評価における Environment Record を外側の Environment Record として持つ。

Environment Record は純粋に仕様上の仕組みであり、ECMAScript 実装のいかなる特定の実体にも対応する必要はない。ECMAScript プログラムがそのような値に直接アクセスしたり操作したりすることは不可能である。

9.1.1 Environment Record 型階層

Environment Record は、Environment Record を抽象クラスとし、Declarative Environment RecordObject Environment RecordGlobal Environment Record という 3 つの具象サブクラスを持つ単純なオブジェクト指向階層に存在すると考えることができる。Function Environment RecordModule Environment RecordDeclarative Environment Record のサブクラスである。

Environment Record 抽象クラスには、Table 14 で定義される抽象仕様メソッドが含まれる。これらの抽象メソッドは、それぞれの具象サブクラスごとに異なる具象アルゴリズムを持つ。

Table 14: Abstract Methods of Environment Records
メソッド 目的 定義
HasBinding ( name )

The abstract method HasBinding takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion.

これは Environment Recordname に対する束縛を持つかどうかを判定する。
これは次の型に具象定義を持つ:
CreateMutableBinding ( name, deletable )

The abstract method CreateMutableBinding takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion.

これは Environment Record に新しい未初期化の可変束縛を作成する。name は束縛される名前のテキストである。deletabletrue なら、その束縛は後で削除され得る。
これは次の型に具象定義を持つ:
CreateImmutableBinding ( name, strict )

The abstract method CreateImmutableBinding takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.

これは Environment Record に新しい未初期化の不変束縛を作成する。name は束縛される名前のテキストである。stricttrue なら、それが初期化された後に値を設定しようとする試みは、その束縛を参照する操作の strict mode 設定に関わらず常に例外を送出する。
これは次の型に具象定義を持つ:
InitializeBinding ( name, value )

The abstract method InitializeBinding takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion.

これは Environment Record 内の、既に存在するが未初期化の束縛に値を設定する。name は束縛される名前のテキストである。value はその束縛に対する値である。
これは次の型に具象定義を持つ:
SetMutableBinding ( name, value, strict )

The abstract method SetMutableBinding takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.

これは Environment Record 内の、既に存在する可変束縛に値を設定する。name は束縛される名前のテキストである。value はその束縛に対する値である。stricttrue で、その束縛に設定できない場合、TypeError 例外を送出する。
これは次の型に具象定義を持つ:
GetBindingValue ( name, strict )

The abstract method GetBindingValue takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion.

これは Environment Record から既に存在する束縛の値を返す。name は束縛される名前のテキストである。strict は、その参照が strict mode コードに由来するか、その他 strict mode の参照意味論を必要とするかを識別するために用いられる。stricttrue で束縛が存在しない場合、ReferenceError 例外を送出する。束縛が存在しても未初期化なら、strict の値に関わらず ReferenceError が送出される。
これは次の型に具象定義を持つ:
DeleteBinding ( name )

The abstract method DeleteBinding takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion.

これは Environment Record から束縛を削除する。name は束縛される名前のテキストである。name の束縛が存在する場合、その束縛を除去して true を返す。束縛が存在しても除去できない場合、false を返す。束縛が存在しない場合、true を返す。
これは次の型に具象定義を持つ:
HasThisBinding ( )

The abstract method HasThisBinding takes no arguments and returns a Boolean.

これは Environment Recordthis 束縛を確立するかを判定する。確立するなら true を、しないなら false を返す。
これは次の型に具象定義を持つ:
GetThisBinding ( )

The abstract method GetThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion.

これはこの Environment Recordthis 束縛の値を返す。this 束縛が初期化されていなければ ReferenceError を送出する。
これは次の型に具象定義を持つ:
HasSuperBinding ( )

The abstract method HasSuperBinding takes no arguments and returns a Boolean.

これは Environment Recordsuper メソッド束縛を確立するかを判定する。確立するなら true を、しないなら false を返す。true を返す場合、それはその Environment RecordFunction Environment Record であることを含意するが、その逆は成り立たない。
これは次の型に具象定義を持つ:
WithBaseObject ( )

The abstract method WithBaseObject takes no arguments and returns an Object or undefined.

この Environment Recordwith 文に関連付けられているなら、with オブジェクトを返す。そうでなければ undefined を返す。
これは次の型に具象定義を持つ:

9.1.1.1 Declarative Environment Record

Declarative Environment Record は、変数、定数、let、class、module、import、および/または function 宣言を含む ECMAScript プログラムスコープに関連付けられる。Declarative Environment Record は、そのスコープ内に含まれる宣言によって定義される識別子の集合を束縛する。

9.1.1.1.1 HasBinding ( name )

The HasBinding concrete method of a Declarative Environment Record envRec takes argument name (a String) and returns a normal completion containing a Boolean. これは引数の識別子が、そのレコードによって束縛される識別子の 1 つであるかを判定する。 It performs the following steps when called:

  1. envRecname に対する束縛を持つなら、true を返す。
  2. false を返す。

9.1.1.1.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String) and deletable (a Boolean) and returns a normal completion containing unused. これは name という名前に対する新しい可変束縛を未初期化の状態で作成する。この Environment Record 内に name に対する束縛が既に存在してはならない。deletabletrue なら、新しい束縛は削除可能として記録される。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛をまだ持っていない。
  2. envRec 内に name に対する可変束縛を作成し、それが未初期化であることを記録する。deletabletrue なら、新たに作成された束縛が後続の DeleteBinding 呼出しによって削除され得ることを記録する。
  3. unused を返す。

9.1.1.1.3 CreateImmutableBinding ( name, strict )

The CreateImmutableBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns a normal completion containing unused. これは name という名前に対する新しい不変束縛を未初期化の状態で作成する。この Environment Record 内に name に対する束縛が既に存在してはならない。stricttrue なら、新しい束縛は strict 束縛として記録される。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛をまだ持っていない。
  2. envRec 内に name に対する不変束縛を作成し、それが未初期化であることを記録する。stricttrue なら、新たに作成された束縛が strict 束縛であることを記録する。
  3. unused を返す。

9.1.1.1.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String) and value (an ECMAScript language value) and returns a normal completion containing unused. これは、名前が name である識別子の現在の束縛の束縛値を value に設定するために用いられる。name に対する未初期化束縛が既に存在していなければならない。 It performs the following steps when called:

  1. Assert: envRecname に対する未初期化束縛を持っていなければならない。
  2. envRec 内の name に対する束縛値を value に設定する。
  3. envRec 内の name に対する束縛が初期化済みになったことを 記録する
  4. unused を返す。

9.1.1.1.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、名前が name である識別子の現在の束縛の束縛値を value に変更しようとする。通常 name に対する束縛は既に存在するが、稀な場合には存在しないこともある。その束縛が不変束縛である場合、stricttrue なら TypeError が送出される。 It performs the following steps when called:

  1. envRecname に対する束縛を持たないなら、
    1. stricttrue なら、ReferenceError 例外を送出する。
    2. !envRec.CreateMutableBinding(name, true) を実行する。
    3. !envRec.InitializeBinding(name, value) を実行する。
    4. unused を返す。
  2. envRec 内の name に対する束縛が strict 束縛であるなら、stricttrue に設定する。
  3. envRec 内の name に対する束縛がまだ初期化されていないなら、
    1. ReferenceError 例外を送出する。
  4. Else if envRec 内の name に対する束縛が可変束縛であるなら、
    1. その束縛値を value に変更する。
  5. Else,
    1. Assert: これは不変束縛の値を変更しようとする試みである。
    2. stricttrue なら、TypeError 例外を送出する。
  6. unused を返す。
Note

手順 1 において束縛欠如を生じさせる ECMAScript コードの例は次のとおりである:

function f() { eval("var x; x = (delete x, 0);"); }

9.1.1.1.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Declarative Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは名前が name である束縛識別子の値を返す。束縛が存在しても未初期化なら、strict の値に関わらず ReferenceError が送出される。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛を持つ。
  2. envRec 内の name に対する束縛が未初期化束縛であるなら、ReferenceError 例外を送出する。
  3. envRec 内で現在 name に束縛されている値を返す。

9.1.1.1.7 DeleteBinding ( name )

The DeleteBinding concrete method of a Declarative Environment Record envRec takes argument name (a String) and returns a normal completion containing a Boolean. これは、明示的に削除対象として指定された束縛だけを削除できる。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛を持つ。
  2. envRec 内の name に対する束縛が削除できないなら、false を返す。
  3. envRec から name に対する束縛を除去する。
  4. true を返す。

9.1.1.1.8 HasThisBinding ( )

The HasThisBinding concrete method of a Declarative Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

通常の Declarative Environment Record(すなわち、Function Environment Record でも Module Environment Record でもないもの)は this 束縛を提供しない。

9.1.1.1.9 GetThisBinding ( )

Declarative Environment RecordGetThisBinding 具象メソッドは、この仕様内では決して使用されない。

9.1.1.1.10 HasSuperBinding ( )

The HasSuperBinding concrete method of a Declarative Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

通常の Declarative Environment Record(すなわち、Function Environment Record でも Module Environment Record でもないもの)は super 束縛を提供しない。

9.1.1.1.11 WithBaseObject ( )

The WithBaseObject concrete method of a Declarative Environment Record envRec takes no arguments and returns undefined. It performs the following steps when called:

  1. undefined を返す。

9.1.1.2 Object Environment Record

Object Environment Record は、その束縛オブジェクトと呼ばれるオブジェクトに関連付けられる。Object Environment Record は、その束縛オブジェクトのプロパティ名に直接対応する文字列識別子名の集合を束縛する。IdentifierName の形式を取らない文字列以外の property key は、束縛された識別子の集合には含まれない。own プロパティと継承プロパティの両方が、その [[Enumerable]] 属性の設定に関わらず集合に含まれる。オブジェクトにはプロパティを動的に追加・削除できるため、Object Environment Record によって束縛される識別子の集合は、プロパティを追加または削除する任意の操作の副作用として変化し得る。そのような副作用の結果として作成されるあらゆる束縛は、対応するプロパティの Writable 属性が false であっても可変束縛とみなされる。不変束縛は Object Environment Record には存在しない。

with 文(14.11)のために作成される Object Environment Record は、関数呼び出しで使用する暗黙の this 値としてその束縛オブジェクトを提供できる。この能力は Boolean の [[IsWithEnvironment]] フィールドによって制御される。

Object Environment Record は、Table 15 に列挙された追加状態フィールドを持つ。

Table 15: Additional Fields of Object Environment Records
フィールド名 意味
[[BindingObject]] an Object この Environment Record の束縛オブジェクト。
[[IsWithEnvironment]] a Boolean この Environment Recordwith 文のために作成されたかどうかを示す。

9.1.1.2.1 HasBinding ( name )

The HasBinding concrete method of an Object Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、その関連付けられた束縛オブジェクトが name という名前のプロパティを持つかどうかを判定する。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. foundBinding を ? HasProperty(bindingObject, name) とする。
  3. foundBindingfalse なら、false を返す。
  4. envRec.[[IsWithEnvironment]]false なら、true を返す。
  5. unscopables を ? Get(bindingObject, %Symbol.unscopables%) とする。
  6. unscopables が Object なら、
    1. blockedToBoolean(? Get(unscopables, name)) とする。
    2. blockedtrue なら、false を返す。
  7. true を返す。

9.1.1.2.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of an Object Environment Record envRec takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、Environment Record に関連付けられた束縛オブジェクトに、名前が name で値が undefined に初期化されたプロパティを作成する。deletabletrue なら、新しいプロパティの [[Configurable]] 属性は true に設定され、そうでなければ false に設定される。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. DefinePropertyOrThrow(bindingObject, name, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable }) を実行する。
  3. unused を返す。
Note

通常、envRecname に対する束縛を持たないが、もし持っている場合、DefinePropertyOrThrow の意味論により既存の束縛が置き換えられたりシャドウされたり、あるいは abrupt completion が返される可能性がある。

9.1.1.2.3 CreateImmutableBinding ( name, strict )

Object Environment RecordCreateImmutableBinding 具象メソッドは、この仕様内では決して使用されない。

9.1.1.2.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of an Object Environment Record envRec takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは、名前が name である識別子の現在の束縛の束縛値を value に設定するために用いられる。 It performs the following steps when called:

  1. envRec.SetMutableBinding(name, value, false) を実行する。
  2. unused を返す。
Note

この仕様では、Object Environment Record に対する CreateMutableBinding のすべての使用は、同じ名前に対する InitializeBinding 呼出しが直後に続く。したがって、この仕様では Object Environment Record 内の束縛の初期化状態を明示的には追跡しない。

9.1.1.2.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of an Object Environment Record envRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、Environment Record に関連付けられた束縛オブジェクトの、名前が name であるプロパティの値を value に設定しようとする。通常 name という名前のプロパティは既に存在するが、存在しないか現在書き込み可能でない場合、エラー処理は strict によって決定される。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. stillExists を ? HasProperty(bindingObject, name) とする。
  3. stillExistsfalse かつ stricttrue なら、ReferenceError 例外を送出する。
  4. Set(bindingObject, name, value, strict) を実行する。
  5. unused を返す。

9.1.1.2.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of an Object Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは、その関連付けられた束縛オブジェクトの、名前が name であるプロパティの値を返す。そのプロパティは既に存在しているべきだが、存在しない場合の結果は strict に依存する。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. value を ? HasProperty(bindingObject, name) とする。
  3. valuefalse なら、
    1. strictfalse なら、undefined を返す。
    2. ReferenceError 例外を送出する。
  4. Get(bindingObject, name) を返す。

9.1.1.2.7 DeleteBinding ( name )

The DeleteBinding concrete method of an Object Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、環境オブジェクトの [[Configurable]] 属性値が true であるプロパティに対応する束縛だけを削除できる。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. bindingObject.[[Delete]](name) を返す。

9.1.1.2.8 HasThisBinding ( )

The HasThisBinding concrete method of an Object Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

Object Environment Recordthis 束縛を提供しない。

9.1.1.2.9 GetThisBinding ( )

Object Environment RecordGetThisBinding 具象メソッドは、この仕様内では決して使用されない。

9.1.1.2.10 HasSuperBinding ( )

The HasSuperBinding concrete method of an Object Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

Object Environment Recordsuper 束縛を提供しない。

9.1.1.2.11 WithBaseObject ( )

The WithBaseObject concrete method of an Object Environment Record envRec takes no arguments and returns an Object or undefined. It performs the following steps when called:

  1. envRec.[[IsWithEnvironment]]true なら、envRec.[[BindingObject]] を返す。
  2. undefined を返す。

9.1.1.3 Function Environment Record

Function Environment Record は、関数のトップレベルスコープを表すために用いられる Declarative Environment Record であり、その関数が ArrowFunction でない場合には this 束縛を提供する。関数が ArrowFunction 関数でなく、かつ super を参照する場合、その Function Environment Record には、関数内からの super メソッド呼出しを実行するために使われる状態も含まれる。

Function Environment Record は、Table 16 に列挙された追加状態フィールドを持つ。

Table 16: Additional Fields of Function Environment Records
フィールド名 意味
[[ThisValue]] an ECMAScript language value これは、この関数呼出しに用いられる this 値である。
[[ThisBindingStatus]] lexical, initialized, or uninitialized 値が lexical の場合、これは ArrowFunction であり、ローカルな this 値を持たない。
[[FunctionObject]] an ECMAScript function object この Environment Record の作成原因となった呼出しの関数オブジェクト。
[[NewTarget]] a constructor or undefined この Environment Record[[Construct]] 内部メソッドによって作成された場合、[[NewTarget]][[Construct]]newTarget 引数の値である。そうでなければ、その値は undefined である。

Function Environment Record は、Table 14 に列挙されたすべての Declarative Environment Record メソッドをサポートし、それらのメソッドすべてについて、HasThisBindingGetThisBindingHasSuperBinding を除き同じ仕様を共有する。

9.1.1.3.1 BindThisValue ( envRec, value )

The abstract operation BindThisValue takes arguments envRec (a Function Environment Record) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは envRec.[[ThisValue]] を設定し、それが初期化済みになったことを記録する。 It performs the following steps when called:

  1. Assert: envRec.[[ThisBindingStatus]] is not lexical.
  2. envRec.[[ThisBindingStatus]]initialized なら、ReferenceError 例外を送出する。
  3. envRec.[[ThisValue]]value に設定する。
  4. envRec.[[ThisBindingStatus]]initialized に設定する。
  5. unused を返す。

9.1.1.3.2 HasThisBinding ( )

The HasThisBinding concrete method of a Function Environment Record envRec takes no arguments and returns a Boolean. It performs the following steps when called:

  1. envRec.[[ThisBindingStatus]]lexical なら、false を返す。
  2. true を返す。

9.1.1.3.3 GetThisBinding ( )

The GetThisBinding concrete method of a Function Environment Record envRec takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. Assert: envRec.[[ThisBindingStatus]] is not lexical.
  2. envRec.[[ThisBindingStatus]]uninitialized なら、ReferenceError 例外を送出する。
  3. envRec.[[ThisValue]] を返す。

9.1.1.3.4 HasSuperBinding ( )

The HasSuperBinding concrete method of a Function Environment Record envRec takes no arguments and returns a Boolean. It performs the following steps when called:

  1. envRec.[[ThisBindingStatus]]lexical なら、false を返す。
  2. envRec.[[FunctionObject]].[[HomeObject]]undefined なら、false を返す。
  3. true を返す。

9.1.1.3.5 GetSuperBase ( envRec )

The abstract operation GetSuperBase takes argument envRec (a Function Environment Record) and returns an Object, null, or undefined. これは envRec 内で束縛された super プロパティアクセスの基底となるオブジェクトを返す。値 undefined は、そのようなアクセスが実行時エラーを生じることを示す。 It performs the following steps when called:

  1. homeenvRec.[[FunctionObject]].[[HomeObject]] とする。
  2. homeundefined なら、undefined を返す。
  3. Assert: homeordinary object である。
  4. home.[[GetPrototypeOf]]() を返す。

9.1.1.4 Global Environment Record

Global Environment Record は、共通の realm 内で処理されるすべての ECMAScript Script 要素によって共有される最外スコープを表すために用いられる。Global Environment Record は、組込みグローバル(節 19)、グローバルオブジェクトのプロパティ、および Script 内に現れるすべてのトップレベル宣言(8.2.9, 8.2.11)に対する束縛を提供する。

Global Environment Record は論理的には単一のレコードだが、Object Environment RecordDeclarative Environment Record をカプセル化する複合体として仕様化される。Object Environment Record は、関連付けられた Realm Recordグローバルオブジェクトを基底オブジェクトとして持つ。このグローバルオブジェクトは、Global Environment Record の GetThisBinding 具象メソッドが返す値である。Global Environment Record の Object Environment Record 部分は、すべての組込みグローバル(節 19)と、グローバルコード内に含まれる FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、または VariableStatement によって導入されるすべての束縛を含む。グローバルコード内のその他すべての ECMAScript 宣言に対する束縛は、Global Environment Record の Declarative Environment Record 部分に含まれる。

プロパティはグローバルオブジェクト上に直接作成され得る。したがって、Global Environment Record の Object Environment Record 部分は、FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、または VariableDeclaration 宣言によって明示的に作成された束縛と、グローバルオブジェクトのプロパティとして暗黙に作成された束縛の両方を含み得る。

Global Environment Record は、Table 17 に列挙された追加フィールドを持つ。

Table 17: Additional Fields of Global Environment Records
フィールド名 意味
[[ObjectRecord]] an Object Environment Record 束縛オブジェクトはグローバルオブジェクトである。これは、関連する realmグローバルコード内におけるグローバル組込み束縛に加えて、FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、および VariableDeclaration の束縛を含む。
[[GlobalThisValue]] an Object グローバルスコープにおいて this が返す値。ホストは任意の ECMAScript Object 値を提供できる。
[[DeclarativeRecord]] a Declarative Environment Record 関連する realm code の global code における、FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、および VariableDeclaration の束縛を除くすべての宣言に対する束縛を 含む

9.1.1.4.1 HasBinding ( name )

The HasBinding concrete method of a Global Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは引数の識別子が、そのレコードによって束縛されている識別子の 1 つであるかを判定する。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、true を返す。
  3. objectRecordenvRec.[[ObjectRecord]] とする。
  4. objectRecord.HasBinding(name) を返す。

9.1.1.4.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of a Global Environment Record envRec takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは name という名前に対する新しい可変束縛を未初期化で作成する。束縛は関連付けられた DeclarativeRecord 内に作成される。name に対する束縛は DeclarativeRecord 内に既に存在してはならない。deletabletrue なら、新しい束縛は削除対象として記録される。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、TypeError 例外を送出する。
  3. !declarativeRecord.CreateMutableBinding(name, deletable) を返す。

9.1.1.4.3 CreateImmutableBinding ( name, strict )

The CreateImmutableBinding concrete method of a Global Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは name という名前に対する新しい不変束縛を未初期化で作成する。この Environment Record 内に name に対する束縛が既に存在してはならない。stricttrue なら、新しい束縛は strict 束縛として記録される。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、TypeError 例外を送出する。
  3. !declarativeRecord.CreateImmutableBinding(name, strict) を返す。

9.1.1.4.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of a Global Environment Record envRec takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは、名前が name である識別子の現在の束縛の束縛値を value に設定するために用いられる。name に対する未初期化束縛が既に存在していなければならない。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、
    1. !declarativeRecord.InitializeBinding(name, value) を返す。
  3. Assert: 束縛が存在するなら、それは Object Environment Record 内になければならない。
  4. objectRecordenvRec.[[ObjectRecord]] とする。
  5. objectRecord.InitializeBinding(name, value) を返す。

9.1.1.4.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of a Global Environment Record envRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、名前が name である識別子の現在の束縛の束縛値を value に変更しようとする。束縛が不変束縛であり、かつ stricttrue なら、TypeError が送出される。通常 name という名前の束縛は既に存在するが、存在しないか現在書込み可能でない場合、エラー処理は strict によって決定される。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、
    1. declarativeRecord.SetMutableBinding(name, value, strict) を返す。
  3. objectRecordenvRec.[[ObjectRecord]] とする。
  4. objectRecord.SetMutableBinding(name, value, strict) を返す。

9.1.1.4.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Global Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは名前が name である束縛識別子の値を返す。束縛が未初期化束縛なら、ReferenceError 例外を送出する。通常 name という名前の束縛は既に存在するが、存在しないか現在書込み可能でない場合、エラー処理は strict によって決定される。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、
    1. declarativeRecord.GetBindingValue(name, strict) を返す。
  3. objectRecordenvRec.[[ObjectRecord]] とする。
  4. objectRecord.GetBindingValue(name, strict) を返す。

9.1.1.4.7 DeleteBinding ( name )

The DeleteBinding concrete method of a Global Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、明示的に削除対象として指定された束縛のみを削除できる。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、
    1. !declarativeRecord.DeleteBinding(name) を返す。
  3. objectRecordenvRec.[[ObjectRecord]] とする。
  4. globalObjectobjectRecord.[[BindingObject]] とする。
  5. existingProp を ? HasOwnProperty(globalObject, name) とする。
  6. existingProptrue なら、
    1. objectRecord.DeleteBinding(name) を返す。
  7. true を返す。

9.1.1.4.8 HasThisBinding ( )

The HasThisBinding concrete method of a Global Environment Record envRec takes no arguments and returns true. It performs the following steps when called:

  1. true を返す。
Note

Global Environment Record は常に this 束縛を提供する。

9.1.1.4.9 GetThisBinding ( )

The GetThisBinding concrete method of a Global Environment Record envRec takes no arguments and returns a normal completion containing an Object. It performs the following steps when called:

  1. envRec.[[GlobalThisValue]] を返す。

9.1.1.4.10 HasSuperBinding ( )

The HasSuperBinding concrete method of a Global Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

Global Environment Recordsuper 束縛を提供しない。

9.1.1.4.11 WithBaseObject ( )

The WithBaseObject concrete method of a Global Environment Record envRec takes no arguments and returns undefined. It performs the following steps when called:

  1. undefined を返す。

9.1.1.4.12 HasLexicalDeclaration ( envRec, name )

The abstract operation HasLexicalDeclaration takes arguments envRec (a Global Environment Record) and name (a String) and returns a Boolean. これは引数識別子が、LexicalDeclarationClassDeclaration のようなレキシカル宣言を用いて envRec に作成された束縛を持つかどうかを判定する。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) を返す。

9.1.1.4.13 HasRestrictedGlobalProperty ( envRec, name )

The abstract operation HasRestrictedGlobalProperty takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは引数識別子が、グローバルレキシカル束縛によってシャドウされてはならないグローバルオブジェクトのプロパティ名であるかを判定する。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](name) とする。
  4. existingPropundefined なら、false を返す。
  5. existingProp.[[Configurable]]true なら、false を返す。
  6. true を返す。
Note

グローバルオブジェクト上には、var 宣言や function 宣言を用いて宣言されたのではなく、直接作成されたプロパティが存在し得る。グローバルオブジェクトの non-configurable なプロパティと同名のグローバルレキシカル束縛は作成されてはならない。グローバルプロパティ "undefined" はそのようなプロパティの一例である。

9.1.1.4.14 CanDeclareGlobalVar ( envRec, name )

The abstract operation CanDeclareGlobalVar takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、同じ引数 name に対して CreateGlobalVarBinding 呼出しを行った場合に成功するかどうかを判定する。冗長な var 宣言および既存のグローバルオブジェクトプロパティに対する var 宣言は許可される。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObject, name) とする。
  4. hasPropertytrue なら、true を返す。
  5. IsExtensible(globalObject) を返す。

9.1.1.4.15 CanDeclareGlobalFunction ( envRec, name )

The abstract operation CanDeclareGlobalFunction takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、同じ引数 name に対して CreateGlobalFunctionBinding 呼出しを行った場合に成功するかどうかを判定する。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](name) とする。
  4. existingPropundefined なら、? IsExtensible(globalObject) を返す。
  5. existingProp.[[Configurable]]true なら、true を返す。
  6. IsDataDescriptor(existingProp) が true で、かつ existingProp が属性値 { [[Writable]]: true, [[Enumerable]]: true } を持つなら、true を返す。
  7. false を返す。

9.1.1.4.16 CreateGlobalVarBinding ( envRec, name, deletable )

The abstract operation CreateGlobalVarBinding takes arguments envRec (a Global Environment Record), name (a String), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、関連付けられた Object Environment Record 内に可変束縛を作成し初期化する。束縛が既に存在する場合は、それを再利用し、初期化済みであるとみなす。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObject, name) とする。
  4. extensible を ? IsExtensible(globalObject) とする。
  5. hasPropertyfalse かつ extensibletrue なら、
    1. objectRecord.CreateMutableBinding(name, deletable) を実行する。
    2. objectRecord.InitializeBinding(name, undefined) を実行する。
  6. unused を返す。

9.1.1.4.17 CreateGlobalFunctionBinding ( envRec, name, value, deletable )

The abstract operation CreateGlobalFunctionBinding takes arguments envRec (a Global Environment Record), name (a String), value (an ECMAScript function object), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、関連付けられた Object Environment Record 内に可変束縛を作成し初期化する。束縛が既に存在する場合は、それを置き換える。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](name) とする。
  4. existingPropundefined または existingProp.[[Configurable]]true なら、
    1. desc を PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable } とする。
  5. Else,
    1. desc を PropertyDescriptor { [[Value]]: value } とする。
  6. DefinePropertyOrThrow(globalObject, name, desc) を実行する。
  7. Set(globalObject, name, value, false) を実行する。
  8. unused を返す。
Note

グローバル関数宣言は常にグローバルオブジェクトの own プロパティとして表現される。可能であれば、既存の own プロパティは標準的な属性値の集合を持つように再構成される。手順 7 は、InitializeBinding 具象メソッドを呼び出した場合と等価であり、globalObject が Proxy である場合には同じ順序の Proxy trap 呼出しを生成する。

9.1.1.5 Module Environment Record

Module Environment Record は、ECMAScript Module の外側スコープを表すために用いられる Declarative Environment Record である。通常の可変束縛および不変束縛に加えて、Module Environment Record は不変 import 束縛も提供する。これは、別の Environment Record に存在するターゲット束縛への間接アクセスを提供する束縛である。

Module Environment Record は、Table 14 に列挙されたすべての Declarative Environment Record メソッドをサポートし、GetBindingValueDeleteBindingHasThisBindingGetThisBinding を除くそれらのメソッドすべてについて同じ仕様を共有する。

9.1.1.5.1 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Module Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは名前が name である束縛識別子の値を返す。ただし、その束縛が間接束縛である場合にはターゲット束縛の値が返される。束縛が存在しても未初期化であるなら ReferenceError が送出される。 It performs the following steps when called:

  1. Assert: strict is true.
  2. Assert: envRec has a binding for name.
  3. name に対する束縛が間接束縛であるなら、
    1. moduletargetName を、この name に対する束縛が作成されたときに与えられた間接参照値とする。
    2. targetEnvmodule.[[Environment]] とする。
    3. targetEnvempty なら、ReferenceError 例外を送出する。
    4. targetEnv.GetBindingValue(targetName, true) を返す。
  4. envRec 内の name に対する束縛が未初期化束縛であるなら、ReferenceError 例外を送出する。
  5. envRec 内で現在 name に束縛されている値を返す。
Note

Module は常に strict mode code であるため、strict は常に true である。

9.1.1.5.2 DeleteBinding ( name )

Module Environment RecordDeleteBinding 具象メソッドは、この仕様内では決して使用されない。

Note

Module Environment Record は strict code 内でのみ使用され、strict code において Module Environment Record 束縛に解決される Reference Record へ delete 演算子を適用することは early error 規則によって防止される。13.5.1.1 を参照。

9.1.1.5.3 HasThisBinding ( )

The HasThisBinding concrete method of a Module Environment Record envRec takes no arguments and returns true. It performs the following steps when called:

  1. true を返す。
Note

Module Environment Record は常に this 束縛を提供する。

9.1.1.5.4 GetThisBinding ( )

The GetThisBinding concrete method of a Module Environment Record envRec takes no arguments and returns a normal completion containing undefined. It performs the following steps when called:

  1. undefined を返す。

9.1.1.5.5 CreateImportBinding ( envRec, name, targetModule, targetName )

The abstract operation CreateImportBinding takes arguments envRec (a Module Environment Record), name (a String), targetModule (a Module Record), and targetName (a String) and returns unused. これは name に対する新しい初期化済みの不変間接束縛を作成する。envRec 内に name に対する束縛が既に存在してはならない。targetNametargetModuleModule Environment Record 内に存在する束縛の名前である。新しい束縛の値へのアクセスは、ターゲット束縛の束縛値へ間接的にアクセスすることになる。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛をまだ持っていない。
  2. Assert: targetModule.[[Environment]] がインスタンス化されるとき、それは targetName に対する直接束縛を持つことになる。
  3. envRec 内に name に対する不変間接束縛を作成し、そのターゲット束縛として targetModule および targetName を参照し、その束縛が初期化済みであることを記録する。
  4. unused を返す。

9.1.2 Environment Record 操作

以下の抽象操作は、この仕様において Environment Record を操作するために用いられる:

9.1.2.1 GetIdentifierReference ( env, name, strict )

The abstract operation GetIdentifierReference takes arguments env (an Environment Record or null), name (a String), and strict (a Boolean) and returns either a normal completion containing a Reference Record or a throw completion. It performs the following steps when called:

  1. envnull なら、
    1. Reference Record { [[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  2. exists を ? env.HasBinding(name) とする。
  3. existstrue なら、
    1. Reference Record { [[Base]]: env, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  4. outerenv.[[OuterEnv]] とする。
  5. GetIdentifierReference(outer, name, strict) を返す。

9.1.2.2 NewDeclarativeEnvironment ( outerEnv )

The abstract operation NewDeclarativeEnvironment takes argument outerEnv (an Environment Record or null) and returns a Declarative Environment Record. It performs the following steps when called:

  1. env を、束縛を含まない新しい Declarative Environment Record とする。
  2. env.[[OuterEnv]]outerEnv に設定する。
  3. env を返す。

9.1.2.3 NewObjectEnvironment ( obj, isWithEnvironment, outerEnv )

The abstract operation NewObjectEnvironment takes arguments obj (an Object), isWithEnvironment (a Boolean), and outerEnv (an Environment Record or null) and returns an Object Environment Record. It performs the following steps when called:

  1. env を新しい Object Environment Record とする。
  2. env.[[BindingObject]]obj に設定する。
  3. env.[[IsWithEnvironment]]isWithEnvironment に設定する。
  4. env.[[OuterEnv]]outerEnv に設定する。
  5. env を返す。

9.1.2.4 NewFunctionEnvironment ( func, newTarget )

The abstract operation NewFunctionEnvironment takes arguments func (an ECMAScript function object) and newTarget (an Object or undefined) and returns a Function Environment Record. It performs the following steps when called:

  1. env を、束縛を含まない新しい Function Environment Record とする。
  2. env.[[FunctionObject]]func に設定する。
  3. func.[[ThisMode]]lexical なら、env.[[ThisBindingStatus]]lexical に設定する。
  4. Else, env.[[ThisBindingStatus]]uninitialized に設定する。
  5. env.[[NewTarget]]newTarget に設定する。
  6. env.[[OuterEnv]]func.[[Environment]] に設定する。
  7. env を返す。

9.1.2.5 NewGlobalEnvironment ( obj, thisValue )

The abstract operation NewGlobalEnvironment takes arguments obj (an Object) and thisValue (an Object) and returns a Global Environment Record. It performs the following steps when called:

  1. objRecNewObjectEnvironment(obj, false, null) とする。
  2. dclRecNewDeclarativeEnvironment(null) とする。
  3. env を新しい Global Environment Record とする。
  4. env.[[ObjectRecord]]objRec に設定する。
  5. env.[[GlobalThisValue]]thisValue に設定する。
  6. env.[[DeclarativeRecord]]dclRec に設定する。
  7. env.[[OuterEnv]]null に設定する。
  8. env を返す。

9.1.2.6 NewModuleEnvironment ( outerEnv )

The abstract operation NewModuleEnvironment takes argument outerEnv (a Global Environment Record) and returns a Module Environment Record. It performs the following steps when called:

  1. env を、束縛を含まない新しい Module Environment Record とする。
  2. env.[[OuterEnv]]outerEnv に設定する。
  3. env を返す。

9.2 PrivateEnvironment Record

PrivateEnvironment Record は、ECMAScript コード内の ClassDeclaration および ClassExpression のレキシカルな入れ子構造に基づいて Private Name を追跡するために用いられる仕様上の仕組みである。これは Environment Record に似ているが、別物である。各 PrivateEnvironment RecordClassDeclaration または ClassExpression に関連付けられる。そのような class が評価されるたびに、その class によって宣言される Private Name を記録するために新しい PrivateEnvironment Record が作成される。

PrivateEnvironment Record は、Table 18 で定義されるフィールドを持つ。

Table 18: PrivateEnvironment Record Fields
フィールド名 値型 意味
[[OuterPrivateEnvironment]] a PrivateEnvironment Record or null 最も近い外側の class の PrivateEnvironment Record。この PrivateEnvironment Record に関連付けられた class が他の class の中に含まれていない場合は null
[[Names]] a List of Private Names この class によって宣言された Private Name

9.2.1 PrivateEnvironment Record 操作

以下の抽象操作は、この仕様において PrivateEnvironment Record を操作するために用いられる:

9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )

The abstract operation NewPrivateEnvironment takes argument outerPrivateEnv (a PrivateEnvironment Record or null) and returns a PrivateEnvironment Record. It performs the following steps when called:

  1. names を新しい空の List とする。
  2. PrivateEnvironment Record { [[OuterPrivateEnvironment]]: outerPrivateEnv, [[Names]]: names } を返す。

9.2.1.2 ResolvePrivateIdentifier ( privateEnv, identifier )

The abstract operation ResolvePrivateIdentifier takes arguments privateEnv (a PrivateEnvironment Record) and identifier (a String) and returns a Private Name. It performs the following steps when called:

  1. namesprivateEnv.[[Names]] とする。
  2. names の各 Private Name pn について、次を行う
    1. pn.[[Description]]identifier であるなら、
      1. pn を返す。
  3. outerPrivateEnvprivateEnv.[[OuterPrivateEnvironment]] とする。
  4. Assert: outerPrivateEnv is not null.
  5. ResolvePrivateIdentifier(outerPrivateEnv, identifier) を返す。

9.3 Realm

評価される前に、すべての ECMAScript コードは realm に関連付けられていなければならない。概念的には、realm は一組の intrinsic object、ECMAScript のグローバル環境、そのグローバル環境のスコープ内にロードされたすべての ECMAScript コード、およびその他の関連状態と資源から構成される。

realm は、この仕様では Table 19 に指定されたフィールドを持つ Realm Record として表現される:

Table 19: Realm Record Fields
フィールド名 意味
[[AgentSignifier]] an agent signifier この realm を所有する agent
[[Intrinsics]] a Record whose field names are intrinsic keys and whose values are objects この realm に関連付けられたコードが使用する intrinsic 値
[[GlobalObject]] an Object この realmグローバルオブジェクト
[[GlobalEnv]] a Global Environment Record この realm のグローバル環境
[[TemplateMap]] a List of Records with fields [[Site]] (a TemplateLiteral Parse Node) and [[Array]] (an Array)

テンプレートオブジェクトは、それぞれの realm ごとに、その Realm Record[[TemplateMap]] を用いて個別に正準化される。各 [[Site]] 値は TemplateLiteral である Parse Node である。関連する [[Array]] 値は、tag 関数に渡される対応するテンプレートオブジェクトである。

Note 1
Parse Node が到達不能になると、それに対応する [[Array]] も到達不能になるため、実装がその組を [[TemplateMap]] リストから削除しても観測不能である。
[[LoadedModules]] a List of LoadedModuleRequest Records

この realm が import した specifier 文字列から解決済み Module Record への写像。このリストには、ModuleRequestsEqual(r1, r2) が true となるような異なる 2 つの Record r1r2 は含まれない。

Note 2
HostLoadImportedModule16.2.1.10 Note 1)で述べられているように、Realm Record 内の [[LoadedModules]] は、アクティブな script も module も存在しない文脈で import() 式を実行するときにのみ使用される。
[[HostDefined]] anything (default value is undefined) Realm Record に追加情報を関連付ける必要のあるホストのために予約されたフィールド。

9.3.1 InitializeHostDefinedRealm ( )

The abstract operation InitializeHostDefinedRealm takes no arguments and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. realm を新しい Realm Record とする。
  2. CreateIntrinsics(realm) を実行する。
  3. realm.[[AgentSignifier]]AgentSignifier() に設定する。
  4. realm.[[TemplateMap]] を新しい空の List に設定する。
  5. newContext を新しい execution context とする。
  6. newContext の Function を null に設定する。
  7. newContextRealmrealm に設定する。
  8. newContext の ScriptOrModule を null に設定する。
  9. newContextexecution context stack に push する; newContext はいま running execution context である。
  10. ホストが realm の global object として機能する特定の object の使用を要求するなら、
    1. global を、そのような object でホスト定義の方法で作成されたものとする。
  11. Else,
    1. globalOrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]]) とする。
  12. ホストが realm の global scope における this 束縛として global object 以外の object を返すことを要求するなら、
    1. thisValue を、そのような object でホスト定義の方法で作成されたものとする。
  13. Else,
    1. thisValueglobal とする。
  14. realm.[[GlobalObject]]global に設定する。
  15. realm.[[GlobalEnv]]NewGlobalEnvironment(global, thisValue) に設定する。
  16. SetDefaultGlobalBindings(realm) を実行する。
  17. global 上に任意の host-defined global object property を作成する。
  18. unused を返す。

9.3.2 CreateIntrinsics ( realmRec )

The abstract operation CreateIntrinsics takes argument realmRec (a Realm Record) and returns unused. It performs the following steps when called:

  1. realmRec.[[Intrinsics]] を新しい Record に設定する。
  2. realmRec.[[Intrinsics]] の各フィールドに、Table 6 に列挙された値を設定する。フィールド名は表の “Intrinsic Name” 列に列挙された名前である。各フィールドの値は、19 から 28 までの各節で定義される各 object の仕様に従って、プロパティ値で完全かつ再帰的に充填された新しい object 値である。すべての object property 値は新しく作成された object 値である。built-in function object であるすべての値は、CreateBuiltinFunction(steps, length, name, slots, realmRec, prototype, async) を実行することで作成される。ここで steps はこの仕様が提供するその関数の定義、name は関数の "name" プロパティの初期値、length は関数の "length" プロパティの初期値、slots はその関数に指定された内部スロット名の list(存在する場合)、prototype は関数の [[Prototype]] 内部スロットの指定値、そして async はその関数が “async” と記述されている場合は true、そうでなければ false である。intrinsics とそれらのプロパティの作成順序は、まだ作成されていない object への依存を避けるように定められなければならない。
  3. AddRestrictedFunctionProperties(realmRec.[[Intrinsics]].[[%Function.prototype%]], realmRec) を実行する。
  4. unused を返す。

9.3.3 SetDefaultGlobalBindings ( realmRec )

The abstract operation SetDefaultGlobalBindings takes argument realmRec (a Realm Record) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. globalrealmRec.[[GlobalObject]] とする。
  2. 19 節で指定される Global Object の各 property について、次を行う
    1. name をその property 名の String 値とする。
    2. desc を、その property に指定された属性を含む、完全に充填された data Property Descriptor とする。19.219.3、または 19.4 に列挙された property については、[[Value]] 属性の値は realmRec に対応する intrinsic object である。
    3. DefinePropertyOrThrow(global, name, desc) を実行する。
  3. unused を返す。

9.4 実行コンテキスト

execution context は、ECMAScript 実装によるコードの実行時評価を追跡するために用いられる仕様上の仕組みである。任意の時点において、実際にコードを実行している execution context は agent ごとに高々 1 つである。これはその agentrunning execution context として知られる。この仕様における running execution context へのすべての参照は、周囲の agentrunning execution context を指す。

execution context stack は execution context を追跡するために用いられる。running execution context は常にこの stack の最上位要素である。新しい execution context は、現在の running execution context に関連付けられた実行可能コードから、その execution context に関連付けられていない実行可能コードへ制御が移るたびに作成される。新たに作成された execution context は stack に push され、running execution context になる。

execution context は、関連付けられたコードの実行進行を追跡するために必要な、実装固有のあらゆる状態を含む。各 execution context は、少なくとも Table 20 に列挙された状態コンポーネントを持つ。

Table 20: State Components for All Execution Contexts
コンポーネント 目的
code evaluation state この execution context に関連付けられたコードの評価を実行、一時停止、および再開するために必要な任意の状態。
Function この execution context が関数オブジェクトのコードを評価しているなら、このコンポーネントの値はその関数オブジェクトである。context が Script または Module のコードを評価しているなら、その値は null である。
Realm 関連付けられたコードが ECMAScript 資源へアクセスする元となる Realm Record
ScriptOrModule 関連付けられたコードの出所である Module Record または Script Record。元となる script または module が存在しない場合、たとえば InitializeHostDefinedRealm で作成される最初の execution context の場合、その値は null である。

running execution context によるコード評価は、この仕様で定義されたさまざまな点で一時停止され得る。running execution context が一時停止されると、別の execution context が running execution context となってそのコードの評価を開始し得る。その後のある時点で、一時停止されていた execution context が再び running execution context となり、以前に一時停止された地点からそのコードの評価を続行し得る。execution context 間での running execution context 状態の遷移は、通常、stack 的な後入れ先出しの方式で起こる。しかし、一部の ECMAScript 機能では、running execution context の非 LIFO な遷移が必要となる。

running execution contextRealm コンポーネントの値は、current Realm Record とも呼ばれる。running execution context の Function コンポーネントの値は、active function object とも呼ばれる。

ECMAScript code execution contexts は、Table 21 に列挙された追加の状態コンポーネントを持つ。

Table 21: Additional State Components for ECMAScript Code Execution Contexts
コンポーネント 目的
LexicalEnvironment この execution context 内のコードによって行われる識別子参照を解決するために使われる Environment Record を識別する。
VariableEnvironment この execution context 内の VariableStatement によって作成された束縛を保持する Environment Record を識別する。
PrivateEnvironment 最も近い包含 class における ClassElement によって作成された Private Name を保持する PrivateEnvironment Record を識別する。包含 class が存在しない場合は null

execution context の LexicalEnvironment および VariableEnvironment コンポーネントは、常に Environment Record である。

Generator の評価を表す execution context は、Table 22 に列挙された追加の状態コンポーネントを持つ。

Table 22: Additional State Components for Generator Execution Contexts
コンポーネント 目的
Generator この execution context が評価している Generator。

ほとんどの状況では、running execution contextexecution context stack の先頭)だけが、この仕様内のアルゴリズムによって直接操作される。したがって、“LexicalEnvironment” および “VariableEnvironment” という用語が修飾なしに使われるとき、それらは running execution context のそれらのコンポーネントを指している。

execution context は純粋に仕様上の仕組みであり、ECMAScript 実装のいかなる特定の実体にも対応する必要はない。ECMAScript コードが execution context に直接アクセスしたり観測したりすることは不可能である。

9.4.1 GetActiveScriptOrModule ( )

The abstract operation GetActiveScriptOrModule takes no arguments and returns a Script Record, a Module Record, or null. これは、running execution context に基づいて、実行中の script または module を決定するために用いられる。 It performs the following steps when called:

  1. execution context stack が空なら、null を返す。
  2. ec を、execution context stack 上で ScriptOrModule コンポーネントが null でない最上位の execution context とする。
  3. そのような execution context が存在しないなら、null を返す。
  4. ec の ScriptOrModule を返す。

9.4.2 ResolveBinding ( name [ , env ] )

The abstract operation ResolveBinding takes argument name (a String) and optional argument env (an Environment Record or undefined) and returns either a normal completion containing a Reference Record or a throw completion. これは name の束縛を決定するために用いられる。env は、その束縛を探索すべき Environment Record を明示的に与えるために使える。 It performs the following steps when called:

  1. env が存在しないか、または envundefined なら、
    1. envrunning execution context の LexicalEnvironment に設定する。
  2. Assert: envEnvironment Record である。
  3. strict を、評価中の構文生成規則に対する IsStrict とする。
  4. GetIdentifierReference(env, name, strict) を返す。
Note

ResolveBinding の結果は常に、[[ReferencedName]] フィールドが name である Reference Record である。

9.4.3 GetThisEnvironment ( )

The abstract operation GetThisEnvironment takes no arguments and returns an Environment Record. これは、現在キーワード this の束縛を提供している Environment Record を見つける。 It performs the following steps when called:

  1. envrunning execution context の LexicalEnvironment とする。
  2. 繰り返す
    1. existsenv.HasThisBinding() とする。
    2. existstrue なら、env を返す。
    3. outerenv.[[OuterEnv]] とする。
    4. Assert: outer is not null.
    5. envouter に設定する。
Note

手順 2 の loop は常に終了する。なぜなら、環境の列は常に this 束縛を持つ global environment で終わるからである。

9.4.4 ResolveThisBinding ( )

The abstract operation ResolveThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. これは、running execution context の LexicalEnvironment を用いてキーワード this の束縛を決定する。 It performs the following steps when called:

  1. envRecGetThisEnvironment() とする。
  2. envRec.GetThisBinding() を返す。

9.4.5 GetNewTarget ( )

The abstract operation GetNewTarget takes no arguments and returns an Object or undefined. これは、running execution context の LexicalEnvironment を用いて NewTarget 値を決定する。 It performs the following steps when called:

  1. envRecGetThisEnvironment() とする。
  2. Assert: envRec[[NewTarget]] フィールドを持つ。
  3. envRec.[[NewTarget]] を返す。

9.4.6 GetGlobalObject ( )

The abstract operation GetGlobalObject takes no arguments and returns an Object. これは、現在の running execution context によって使用される global object を返す。 It performs the following steps when called:

  1. currentRealmcurrent Realm Record とする。
  2. currentRealm.[[GlobalObject]] を返す。

9.4.7 RunSuspendedContext ( context, completionRecord )

The abstract operation RunSuspendedContext takes arguments context (実行コンテキスト) and completionRecord (完了レコード) and returns ECMAScript 言語値または unused のいずれかを含む正常完了、または中途完了. これは context を再開し(再開値として completionRecord を送信し)、結果を待つ。 It performs the following steps when called:

  1. callerContext を実行中の実行コンテキストとする。
  2. callerContext を中断する。
  3. context を実行コンテキストスタックにプッシュする;context は今や実行中の実行コンテキストである。
  4. context の中断された評価を再開する。その際、それを中断させた操作の結果として completionRecord を用いる。再開された計算により返された完了レコードを result とする。
  5. Assert: このステップに到達した時点で、context はすでに実行コンテキストスタックから取り除かれており、callerContext が再び実行中の実行コンテキストである。
  6. Return Completion(result).

9.5 Job と Job を enqueue する Host Operation

Job は、他の ECMAScript 計算が現在進行中でないときに ECMAScript 計算を開始する、引数を持たない Abstract Closure である。

Job は、特定の agent において ECMAScript host environment によって実行のためにスケジュールされる。この仕様は、job をスケジュールするための host hook として HostEnqueueGenericJobHostEnqueueFinalizationRegistryCleanupJobHostEnqueuePromiseJob、および HostEnqueueTimeoutJob を記述する。この仕様における host hook は、job のスケジューリングに課される追加制約ごとに整理されている。host は job をスケジュールする追加の抽象操作を定義してよい。そのような操作は、Job Abstract ClosurerealmRealm Record または null)を引数として受け取る。Realm Record が与えられた場合、これらの操作は、その realm を所有する agent において、与えられた realm 内で、その job が将来のある時点で実行されるようスケジュールする。代わりに realmnull が与えられた場合、その job は ECMAScript コードを評価しない。それらの実装は次の要件に適合しなければならない:

  • 将来のある時点で、その job がスケジュールされた agent に running context が存在せず、かつその agentexecution context stack が空であるとき、実装は次を行わなければならない:
    1. 任意の host-defined preparation step を実行する。
    2. その Job Abstract Closure呼び出す
    3. 任意の host-defined cleanup step を実行し、その後 execution context stack は空でなければならない。
  • ある agent において、任意の時点で、評価中であり得る Job は 1 つだけである。
  • Job の評価が開始されたなら、その agent において他のいかなる Job の評価が開始される前にも、その Job は完了まで実行されなければならない。
  • その Abstract Closurenormal completion を返さなければならず、エラー処理は自身で実装しなければならない。
Note 1
Host environment は、スケジューリングに関して Job を一様に扱うことを要求されない。たとえば、web browser と Node.js は Promise 処理 Job を他の仕事より高い優先度で扱う; 将来の機能では、そのような高い優先度で扱われない Job が追加されるかもしれない。

任意の特定の時点で、scriptOrModule(Script Record、Module Record、または null)が active script or module であるのは、次のすべての条件が真である場合である:

任意の特定の時点で、ある execution が ECMAScript code を評価する準備ができている のは、次のすべての条件が真である場合である:

Note 2

host environment は、execution contextexecution context stack に push することで、code を評価する準備ができた execution を用意してよい。具体的な手順は implementation-defined である。

Realm の具体的な選択は host environment に委ねられる。この初期 execution contextRealm は、いかなる callback function も呼び出される前にのみ使用中である。Promise handler のように Job に関連する callback function が呼び出されるとき、その呼出しは自身の execution contextRealm を push する。

特定種別の Job には追加の適合要件がある。

9.5.1 JobCallback Record

JobCallback Record は、function objecthost-defined 値を格納するために用いられる Record 値である。host によって enqueue された Job を通じて呼び出される function object には、追加の host-defined context が存在する場合がある。その状態を伝播するため、Job Abstract Closurefunction object を直接 capture して呼び出すべきではない。代わりに HostMakeJobCallbackHostCallJobCallback を用いる。

Note

たとえば WHATWG HTML 仕様(https://html.spec.whatwg.org/)は、Promise callback に対する incumbent settings object を伝播するために host-defined 値を用いる。

JobCallback Record は、Table 23 に列挙されたフィールドを持つ。

Table 23: JobCallback Record Fields
フィールド名 意味
[[Callback]] a function object その Job が呼び出されるときに呼び出す関数。
[[HostDefined]] anything (default value is empty) host 用に予約されたフィールド。

9.5.2 HostMakeJobCallback ( callback )

The host-defined abstract operation HostMakeJobCallback takes argument callback (a function object) and returns a JobCallback Record.

HostMakeJobCallback の実装は次の要件に適合しなければならない:

  • [[Callback]] フィールドが callback である JobCallback Record を返さなければならない。

HostMakeJobCallback の既定実装は、呼び出されたとき次の手順を実行する:

  1. JobCallback Record { [[Callback]]: callback, [[HostDefined]]: empty } を返す。

web browser でない ECMAScript host は、HostMakeJobCallback の既定実装を使用しなければならない。

Note

これは、その callback が、最終的にスケジュールされ実行される責任を持つ関数へ渡される時点で呼び出される。たとえば promise.then(thenAction) は、reaction Job をスケジュールする時点ではなく、Promise.prototype.then を呼び出す時点で thenAction に対して MakeJobCallback を呼び出す。

9.5.3 HostCallJobCallback ( jobCallback, value, argumentsList )

The host-defined abstract operation HostCallJobCallback takes arguments jobCallback (a JobCallback Record), value (an ECMAScript language value), and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion.

HostCallJobCallback の実装は次の要件に適合しなければならない:

  • Call(jobCallback.[[Callback]], value, argumentsList) の結果を実行し、その結果を返さなければならない。
Note

この要件は、host がこの仕様で定義された function object[[Call]] 振る舞いを変更できないことを意味する。

HostCallJobCallback の既定実装は、呼び出されたとき次の手順を実行する:

  1. Assert: IsCallable(jobCallback.[[Callback]]) is true.
  2. Call(jobCallback.[[Callback]], value, argumentsList) を返す。

web browser でない ECMAScript host は、HostCallJobCallback の既定実装を使用しなければならない。

9.5.4 HostEnqueueGenericJob ( job, realm )

The host-defined abstract operation HostEnqueueGenericJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record) and returns unused. これは realm.[[AgentSignifier]] によって示される agent において、realm realm 内で job が将来のある時点で実行されるようスケジュールする。このアルゴリズムで用いられる Abstract Closure は、優先度や順序のような追加制約なしでスケジュールされることを意図している。

HostEnqueueGenericJob の実装は 9.5 の要件に適合しなければならない。

9.5.5 HostEnqueuePromiseJob ( job, realm )

The host-defined abstract operation HostEnqueuePromiseJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record or null) and returns unused. これは job が将来のある時点で実行されるようスケジュールする。このアルゴリズムで用いられる Abstract Closure は、Promise の処理に関連するもの、またはその他、Promise 処理操作と同等の優先度でスケジュールされるものとして意図されている。

HostEnqueuePromiseJob の実装は 9.5 の要件に加えて、次の要件にも適合しなければならない:

  • realmnull でない場合、job が呼び出されるたびに、実装は job 呼出し時に execution が ECMAScript code を評価する準備ができているようにする implementation-defined な手順を実行しなければならない。
  • scriptOrModule を HostEnqueuePromiseJob が呼び出された時点の GetActiveScriptOrModule() とする。realmnull でない場合、job が呼び出されるたびに、実装は job 呼出し時に scriptOrModuleactive script or module であるようにする implementation-defined な手順を実行しなければならない。
  • Job は、それらをスケジュールした HostEnqueuePromiseJob 呼出しと同じ順序で実行されなければならない。
Note

NewPromiseResolveThenableJob が返す Job に対する realm は通常、then function object に対して GetFunctionRealm を呼び出した結果である。NewPromiseReactionJob が返す Job に対する realm は通常、handler が undefined でない場合、その handler に対して GetFunctionRealm を呼び出した結果である。handler が undefined の場合、realmnull である。どちらの種別の Job でも、GetFunctionRealm が異常完了した場合(すなわち revoked Proxy に対して呼び出された場合)、realmGetFunctionRealm 呼出し時点の current Realm Record である。realmnull のとき、ユーザ ECMAScript code は一切評価されず、新しい ECMAScript object(たとえば Error object)も一切作成されない。たとえば WHATWG HTML 仕様(https://html.spec.whatwg.org/)は、script を実行できるかどうかの確認や entry 概念のために realm を用いる。

9.5.6 HostEnqueueTimeoutJob ( timeoutJob, realm, milliseconds )

The host-defined abstract operation HostEnqueueTimeoutJob takes arguments timeoutJob (a Job Abstract Closure), realm (a Realm Record), and milliseconds (a non-negative finite Number) and returns unused. これは realm.[[AgentSignifier]] によって示される agent において、realm realm 内で timeoutJob が少なくとも milliseconds ミリ秒後に実行されるようスケジュールする。

HostEnqueueTimeoutJob の実装は 9.5 の要件に適合しなければならない。

9.6 Agent

agent は、一組の ECMAScript execution contextexecution context stackrunning execution contextAgent Record、および executing thread から構成される。executing thread を除き、agent の構成要素はその agent に専属する。

agentexecuting thread は、他の agent とは独立に、その agentexecution context 上でアルゴリズム的手順を実行する。ただし、その thread を共有するどの agent[[CanBlock]] フィールドが trueAgent Record を持たない場合に限り、1 つの executing thread が複数の agentexecuting thread として用いられてよい。

Note 1

たとえば一部の web browser では、browser window の無関係な複数の tab 間で単一の executing thread を共有する。

agentexecuting thread がアルゴリズム的手順を実行している間、その手順にとってその agentsurrounding agent である。その手順は、specification-level の実行オブジェクト、すなわち running execution contextexecution context stack、および Agent Record のフィールドにアクセスするために surrounding agent を用いる。

agent signifier は、Agent を識別するために用いられる、グローバルに一意な不透明値である。

Table 24: Agent Record Fields
フィールド名 意味
[[LittleEndian]] a Boolean アルゴリズム GetValueFromBuffer および SetValueInBufferisLittleEndian 引数が必要となったときに計算される既定値。選択は implementation-defined であり、実装にとって最も効率的な方であるべきである。
[[CanBlock]] a Boolean その agent が block できるかどうかを決定する。
[[Signifier]] an agent signifier その agentagent cluster 内で一意に識別する。
[[IsLockFree1]] a Boolean 1-byte 値に対する atomic operation が lock-free なら true、そうでなければ false
[[IsLockFree2]] a Boolean 2-byte 値に対する atomic operation が lock-free なら true、そうでなければ false
[[IsLockFree8]] a Boolean 8-byte 値に対する atomic operation が lock-free なら true、そうでなければ false
[[CandidateExecution]] a candidate execution Record memory model を参照。
[[KeptAlive]] a List of either Objects or Symbols 初期値は新しい空の List であり、現在の Job の終了まで生存維持される object および/または symbol の list を表す
[[ModuleAsyncEvaluationCount]] an integer 初期値は 0 であり、非同期である module または非同期依存を持つ module の [[AsyncEvaluationOrder]] フィールドに、一意な増加値を割り当てるために用いられる。

[[LittleEndian]][[Signifier]][[IsLockFree1]][[IsLockFree2]]、および [[IsLockFree8]] の値は変更できない。

Note 2

[[IsLockFree1]][[IsLockFree2]]、および [[IsLockFree8]] の値は、必ずしも hardware のみによって決まるわけではなく、時間の経過や ECMAScript 実装間で変化し得る実装上の選択も反映し得る。

[[IsLockFree4]] フィールドは存在しない: 4-byte atomic operation は常に lock-free である。

実際には、ある atomic operation が何らかの lock を用いて実装されているなら、その operation は lock-free ではない。lock-free は wait-free を含意しない: lock-free atomic operation の完了に必要な machine step 数には上限がない。

サイズ n の atomic access が lock-free であることは、サイズ n の非 atomic access の(知覚される)原子性について何も意味しない。特に、非 atomic access は依然として複数の独立した memory access の列として実行され得る。詳細は ReadSharedMemory および WriteSharedMemory を参照。

Note 3

agent は仕様上の仕組みであり、ECMAScript 実装のいかなる特定の実体にも対応する必要はない。

9.6.1 AgentSignifier ( )

The abstract operation AgentSignifier takes no arguments and returns an agent signifier. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. agentRecord.[[Signifier]] を返す。

9.6.2 AgentCanSuspend ( )

The abstract operation AgentCanSuspend takes no arguments and returns a Boolean. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. agentRecord.[[CanBlock]] を返す。
Note

一部の環境では、与えられた agent が suspend できることが妥当でない場合がある。たとえば web browser 環境では、document の main event handling thread の suspend を禁止しつつ、worker の event handling thread については suspend を許可するのが妥当であり得る。

9.6.3 IncrementModuleAsyncEvaluationCount ( )

The abstract operation IncrementModuleAsyncEvaluationCount takes no arguments and returns a non-negative integer. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. countagentRecord.[[ModuleAsyncEvaluationCount]] とする。
  3. agentRecord.[[ModuleAsyncEvaluationCount]]count + 1 に設定する。
  4. count を返す。
Note

この値は、保留中の module 間の相対的な評価順序を追跡するためにのみ用いられる。実装は、保留中の module が存在しないときは 언제でも、観測不能な形で [[ModuleAsyncEvaluationCount]] を 0 に戻してよい。

9.7 Agent Cluster

agent cluster は、shared memory 上で操作することにより通信できる agent の極大集合である。

Note 1

異なる agent 内の program は、未規定の手段によって memory を共有し得る。少なくとも、SharedArrayBuffer の backing memory は cluster 内の agent 間で共有され得る。

message passing により通信できても memory を共有できない agent が存在し得る; それらが同じ agent cluster に属することは決してない。

すべての agent は、ちょうど 1 つの agent cluster に属する。

Note 2

cluster 内の agent が、ある特定時点ですべて生存している必要はない。agent A が別の agent B を生成し、その後 A が終了し、Bagent C を生成した場合、AB とある memory を共有でき、かつ BC とある memory を共有できるなら、その 3 つの agent は同じ cluster に属する。

cluster 内のすべての agent は、それぞれの Agent Record における [[LittleEndian]] フィールドについて同じ値を持たなければならない。

Note 3

agent cluster 内の異なる agent[[LittleEndian]] の異なる値を持つと、複数 byte データに shared memory を使うことが困難になる。

cluster 内のすべての agent は、それぞれの Agent Record における [[IsLockFree1]] フィールドについて同じ値を持たなければならない; [[IsLockFree2]] および [[IsLockFree8]] フィールドについても同様である。

cluster 内のすべての agent は、それぞれの Agent Record における [[Signifier]] フィールドについて異なる値を持たなければならない。

embedding は、agent の知識や協力なしに、agent を deactivate(前進を停止)または activate(前進を再開)してよい。embedding がそうする場合、cluster 内の一部の agent を active のままにして、他の agent を無期限に deactivated のままにしてはならない。

Note 4

前述の制約の目的は、別の agent が deactivate されたために agent が deadlock または starvation を起こす状況を避けることである。たとえば、任意の window の document から独立した寿命を持つ HTML shared worker が、そのような独立 document の dedicated worker と memory を共有することを許され、document とその dedicated worker が deactivate されている間に dedicated worker が lock を保持しており(たとえば document がその window の history に押し込まれたとする)、その後 shared worker がその lock を獲得しようとしたなら、shared worker は dedicated worker が再び activate されるまで、されるとしても、block される。その一方で、他の window から shared worker へアクセスしようとする他の worker は starvation を起こす。

この制約が意味するのは、embedding 内で同じ suspend/wake collective に属さない agent 間では memory を共有できないということである。

embedding は、その agent の cluster の他の agent の事前知識や協力なしに agent を terminate してよい。agent が、それ自身または cluster 内の別 agent の programmatic action によってではなく、cluster 外部の力によって terminate される場合、embedding は 2 つの戦略のいずれかを選ばなければならない。すなわち、cluster 内のすべての agent を terminate するか、または、cluster 内の agent が協調できる信頼性ある API を提供して、cluster に残る少なくとも 1 つの member が terminate を検出でき、その terminate data に terminate された agent を識別するのに十分な情報が含まれるようにするかである。

Note 5

この種の terminate の例としては、別 process で実行中の agent を operating system または user が terminate する場合; embedding 自身が、per-agent 資源 accounting により暴走していると示された agent を、他の agent と同一 process 内で実行中に terminate する場合がある。

次の仕様値およびそこから推移的に到達可能な値は、それぞれちょうど 1 つの agent cluster に属する。

cluster 内のいずれの agent によるいかなる ECMAScript code の評価より前にも、cluster 内のすべての agentAgent Record における [[CandidateExecution]] フィールドは、初期 candidate execution に設定される。初期 candidate execution空の candidate execution であり、その [[EventsRecords]] フィールドは、各 agent について、その agentagent signifier[[AgentSignifier]] フィールドに持ち、かつ [[EventList]][[AgentSynchronizesWith]] フィールドが空の List である Agent Events Record を含む List である。

Note 6

agent cluster 内のすべての agent は、その Agent Record[[CandidateExecution]] フィールドにおいて同じ candidate execution を共有する。candidate execution は memory model によって使用される仕様上の仕組みである。

Note 7

agent cluster は仕様上の仕組みであり、ECMAScript 実装のいかなる特定の実体にも対応する必要はない。

9.8 Forward Progress

agentforward progress を行う とは、この仕様に従って評価ステップを実行することである。

agent は、その running execution context が外部イベントを同期的かつ無期限に待つとき blocked になる。この意味で blocked になれるのは、その Agent Record[[CanBlock]] フィールドが true である agent だけである。unblockedagent とは、blocked でない agent である。

実装は次を保証しなければならない:

  • 専用の executing thread を持つすべての unblocked な agent は、最終的に forward progress を行う
  • 1 つの executing thread を共有する agent の集合においては、いずれか 1 つの agent が最終的に forward progress を行う
  • agent は、blocking を提供する明示的 API を通じる場合を除き、他の agent が blocked になる原因となってはならない。
Note

これは、memory model における liveness 保証とともに、すべての seq-cst write が最終的にすべての agent から観測可能になることを保証する。

9.9 WeakRef および FinalizationRegistry Target の Processing Model

9.9.1 目的

この仕様は、いかなる object や symbol も garbage collected されることを保証しない。live でない object や symbol は、長い時間の後に解放されることもあれば、まったく解放されないこともある。この理由により、この仕様では、garbage collection によって引き起こされる挙動を記述する際に "may" という語を用いる。

WeakRef および FinalizationRegistry の意味論は、特定の時点で起こる 2 つの操作に基づいている:

  • WeakRef.prototype.deref が呼び出されると、referent は(undefined が返されない場合)その後の同期的アクセスも同じ値を返すように生存維持される。この list は、ClearKeptObjects 抽象操作を用いた同期 work の完了時に reset される。
  • FinalizationRegistry に登録された object または symbol が到達不能になると、その FinalizationRegistry の cleanup callback の呼出しが、同期的 ECMAScript 実行の完了後、最終的に行われる場合がある。FinalizationRegistry cleanup は CleanupFinalizationRegistry 抽象操作によって実行される。

これら 2 つの action(ClearKeptObjects または CleanupFinalizationRegistry)のいずれも、同期的 ECMAScript 実行を中断してはならない。host はより長い同期的 ECMAScript 実行列を組み立て得るため、この仕様は ClearKeptObjects および CleanupFinalizationRegistry のスケジューリングを host environment に委ねる。

一部の ECMAScript 実装には、ECMAScript が idle のときも含めて background で動作する garbage collector 実装が含まれる。host environmentCleanupFinalizationRegistry のスケジューリングを許すことで、finalizer work を実行するために ECMAScript 実行を再開でき、それにより held value を解放して、全体の memory 使用量を削減できる。

9.9.2 Liveness

ある object および/または symbol の集合 objectSet に対して、objectSet に関する 仮想的 WeakRef-oblivious execution とは、referent が objectSet の要素である WeakRef に対する抽象操作 WeakRefDeref が常に undefined を返す execution のことである。

Note 1
WeakRef-obliviousness は、liveness とともに、2 つの概念を捉える。1 つは WeakRef 自身がその referent を生存維持しないということ。もう 1 つは、liveness における cycle が値の live 性を含意しないということである。具体的に言えば、v の liveness の決定が WeakRef referent r の liveness の決定に依存する場合、r の liveness は v の liveness を仮定してはならず、それは循環論法になる。
Note 2
WeakRef-obliviousness が個々の値ではなく object または symbol の集合に対して定義されるのは、cycle を考慮するためである。もし個々の値に対して定義されたなら、cycle 内の WeakRef referent は、その identity が cycle 内の他の WeakRef referent を通じてのみ観測されるにもかかわらず、live とみなされてしまう。
Note 3
慣用的には、ある個々の object または symbol は、それを含むすべての集合が live であるなら live であると言う。

評価中の任意の時点で、ある object および/または symbol の集合 objectSet は、次のいずれかの条件を満たすなら live とみなされる:

  • objectSet のいずれかの要素が、いずれかの agent[[KeptAlive]] List に含まれている。
  • objectSet に関する有効な将来の仮想的 WeakRef-oblivious execution が存在し、その execution が objectSet 内のいずれかの値の identity を観測する。
Note 4
上記 2 番目の条件は、値の identity が非 WeakRef の手段により観測可能であるならその値は live である、という直観を捉えることを意図している。値の identity は、strict equality 比較を観測すること、またはその値が Map の key として用いられていることを観測することで観測され得る。
Note 5

field、internal slot、または property の中に object または symbol が存在することは、その値が live であることを含意しない。たとえば、その値が program に一度も返されないなら、それは観測できない。

これは WeakMap の key、WeakSet の member、ならびに FinalizationRegistry Cell record の [[WeakRefTarget]] および [[UnregisterToken]] フィールドについて該当する。

上記の定義は、WeakMap 内の key が live でない場合、その対応する value も必ずしも live ではないことを含意する。

Note 6
Liveness は、engine が empty にしてはならない WeakRef を保証するための下限である。ここで定義される liveness は決定不能である。実際には、engine は reachability のような保守的近似を用いる。実装にはかなりの裁量があると期待される。

9.9.3 Execution

任意の時点で、ある object および/または symbol の集合 objectSetlive でないなら、ECMAScript 実装は次の手順を原子的に実行してよい:

  1. objectSet の各要素 value について、次を行う
    1. ref.[[WeakRefTarget]]value である各 WeakRef ref について、次を行う
      1. ref.[[WeakRefTarget]]empty に設定する。
    2. fg.[[Cells]]cell.[[WeakRefTarget]]value である Record cell を含む各 FinalizationRegistry fg について、次を行う
      1. cell.[[WeakRefTarget]]empty に設定する。
      2. 任意で、HostEnqueueFinalizationRegistryCleanupJob(fg) を実行する。
    3. map.[[WeakMapData]]r.[[Key]]value である Record r を含む各 WeakMap map について、次を行う
      1. r.[[Key]]empty に設定する。
      2. r.[[Value]]empty に設定する。
    4. set.[[WeakSetData]]value を含む各 WeakSet set について、次を行う
      1. set.[[WeakSetData]] において値が value である要素を、値が empty である要素で置き換える。
Note 1

liveness の定義とあわせて、この節は、WeakRef に関して実装が適用してよい最適化を規定する。

object の identity を観測せずにその object にアクセスすることは可能である。identity が観測されない非 escape object の property に対する dead variable elimination や scalar replacement のような最適化は許される。したがって、これらの最適化は、そのような object を指す WeakRef を観測可能に empty にしてよい。

一方で、object の identity が観測可能であり、かつその object が WeakRef[[WeakRefTarget]] internal slot に入っている場合、その WeakRef を観測可能に empty にする rematerialization のような最適化は禁止される。

HostEnqueueFinalizationRegistryCleanupJob の呼出しは optional であるため、FinalizationRegistry に登録された object がその FinalizationRegistry 自体を必ずしも live に保つわけではない。実装は、たとえば FinalizationRegistry 自体が dead になった場合や、application が shutdown 中である場合など、どのような理由でも FinalizationRegistry callback を省略してよい。

Note 2

実装は、非 live な object または symbol の極大集合に対して WeakRef を empty にする義務を負わない。

実装が WeakRef を empty にする対象として非 live 集合 objectSet を選んだ場合、この定義は、その objectSet に含まれるすべての値に対する WeakRef を同時に empty にすることを要求する。言い換えると、値 v を指す WeakRef を empty にする一方で、empty にしない場合に v の値を観測する execution が成立し得る他の WeakRef を empty にしないままにすることは、適合しない。

9.9.4 Host Hook

9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )

The host-defined abstract operation HostEnqueueFinalizationRegistryCleanupJob takes argument finalizationRegistry (a FinalizationRegistry) and returns unused.

cleanupJob を、引数を持たない新しい Job Abstract Closure であり、finalizationRegistry を capture し、呼び出されたとき次の手順を実行するものとする:

  1. cleanupResultCompletion(CleanupFinalizationRegistry(finalizationRegistry)) とする。
  2. cleanupResultabrupt completion なら、エラー報告のための任意の host-defined 手順を実行する。
  3. unused を返す。

HostEnqueueFinalizationRegistryCleanupJob の実装は、可能であれば cleanupJob が将来のある時点で実行されるようスケジュールする。また、9.5 の要件にも適合しなければならない。

9.10 ClearKeptObjects ( )

The abstract operation ClearKeptObjects takes no arguments and returns unused. ECMAScript 実装は、同期的な ECMAScript 実行列が完了したときに ClearKeptObjects を呼び出すことが期待される。 It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. agentRecord.[[KeptAlive]] を新しい空の List に設定する。
  3. unused を返す。

9.11 AddToKeptObjects ( value )

The abstract operation AddToKeptObjects takes argument value (an Object or a Symbol) and returns unused. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. valueagentRecord.[[KeptAlive]] に append する。
  3. unused を返す。
Note
抽象操作 AddToKeptObjects が target object または symbol とともに呼び出されると、その target は、ClearKeptObjects が呼び出されるまでその target を強く参照する list に追加される。

9.12 CleanupFinalizationRegistry ( finalizationRegistry )

The abstract operation CleanupFinalizationRegistry takes argument finalizationRegistry (a FinalizationRegistry) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. Assert: finalizationRegistry[[Cells]] および [[CleanupCallback]] internal slot を持つ。
  2. callbackfinalizationRegistry.[[CleanupCallback]] とする。
  3. finalizationRegistry.[[Cells]]cell.[[WeakRefTarget]]empty である Record cell を含む間、実装は次の手順を実行してよい:
    1. そのような cell を任意に選ぶ。
    2. cellfinalizationRegistry.[[Cells]] から除去する。
    3. HostCallJobCallback(callback, undefined, « cell.[[HeldValue]] ») を実行する。
  4. unused を返す。

9.13 CanBeHeldWeakly ( v )

The abstract operation CanBeHeldWeakly takes argument v (an ECMAScript language value) and returns a Boolean. これは、v が weak reference として使うのに適している場合に限り true を返す。weak reference として使うのに適した値だけが、WeakMap の key、WeakSet の element、WeakRef の target、または FinalizationRegistry の target の 1 つになり得る。 It performs the following steps when called:

  1. v が Object なら、true を返す。
  2. v が Symbol であり、かつ KeyForSymbol(v) が undefined なら、true を返す。
  3. false を返す。
Note

language identity を持たない language value は、事前参照なしに出現し得るため、weak reference として使うには不適切である。Symbol.for によって生成された Symbol 値は、他の Symbol 値と異なり、language identity を持たず、weak reference として使うには不適切である。well-known symbol はおそらく決して collected されないが、数が限られており、したがって多様な実装手法で扱いやすいため、それでも weak reference として使うのに適しているものとして扱われる。しかし、live な WeakMap において well-known symbol に関連付けられた値は collected されにくく、実装において memory resource を “leak” し得る。