26 メモリ管理

26.1 WeakRefオブジェクト

WeakRefは、ターゲットオブジェクトまたはシンボルをガーベジコレクションから保護することなく参照するために使用されるオブジェクトです。WeakRefは、ターゲットがガーベジコレクションによって回収されていなければ、ターゲット値へのアクセスを可能にするために逆参照できます。

26.1.1 WeakRefコンストラクター

WeakRefコンストラクターは:

  • %WeakRef%である。
  • グローバルオブジェクト"WeakRef"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいWeakRefを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたWeakRefの振る舞いを継承しようとするサブクラスコンストラクターは、WeakRef.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、WeakRefコンストラクターへのsuper呼び出しを含めなければならない。

26.1.1.1 WeakRef ( target )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. CanBeHeldWeakly(target) が false の場合、TypeError 例外をスローする。
  3. weakRef を ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRef.prototype%", « [[WeakRefTarget]] ») とする。
  4. AddToKeptObjects(target) を実行する。
  5. weakRef.[[WeakRefTarget]]target に設定する。
  6. weakRef を返す。

26.1.2 WeakRefコンストラクターのプロパティ

WeakRefコンストラクターは:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 次のプロパティを持つ:

26.1.2.1 WeakRef.prototype

WeakRef.prototypeの初期値はWeakRefプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

26.1.3 WeakRefプロトタイプオブジェクトのプロパティ

WeakRefプロトタイプオブジェクトは:

  • %WeakRef.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[WeakRefTarget]]内部スロットを持たない。

26.1.3.1 WeakRef.prototype.constructor

WeakRef.prototype.constructorの初期値は %WeakRef% です。

26.1.3.2 WeakRef.prototype.deref ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakRefthis値とする。
  2. RequireInternalSlot(weakRef, [[WeakRefTarget]]) を実行する。
  3. WeakRefDeref(weakRef) を返す。
Note

WeakRefundefined でない target 値を返す場合、この target 値は、ECMAScriptコードの現在の実行が完了するまでガーベジコレクションされるべきではありません。AddToKeptObjects操作は、読み取り一貫性が維持されることを確実にします。

let target = { foo() {} };
let weakRef = new WeakRef(target);

// ... later ...

if (weakRef.deref()) {
  weakRef.deref().foo();
}

上記の例では、最初のderefが undefined に評価されない場合、2回目のderefも undefined にはなり得ません。

26.1.3.3 WeakRef.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "WeakRef" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

26.1.4 WeakRef抽象操作

26.1.4.1 WeakRefDeref ( weakRef )

The abstract operation WeakRefDeref takes argument weakRef (WeakRef) and returns ECMAScript言語値. It performs the following steps when called:

  1. targetweakRef.[[WeakRefTarget]] とする。
  2. targetempty でない場合、
    1. AddToKeptObjects(target) を実行する。
    2. target を返す。
  3. undefined を返す。
Note

この抽象操作は、livenessを簡潔に定義できるようにするためだけに、WeakRef.prototype.derefとは別に定義されています。

26.1.5 WeakRefインスタンスのプロパティ

WeakRefインスタンスは、WeakRefプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。WeakRefインスタンスは、[[WeakRefTarget]]内部スロットも持ちます。

26.2 FinalizationRegistryオブジェクト

FinalizationRegistryは、ターゲットオブジェクトおよびシンボルがガーベジコレクションされたときに実行されるクリーンアップ操作の登録および登録解除を管理するオブジェクトです。

26.2.1 FinalizationRegistryコンストラクター

FinalizationRegistryコンストラクターは:

  • %FinalizationRegistry%である。
  • グローバルオブジェクト"FinalizationRegistry"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいFinalizationRegistryを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたFinalizationRegistryの振る舞いを継承しようとするサブクラスコンストラクターは、FinalizationRegistry.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、FinalizationRegistryコンストラクターへのsuper呼び出しを含めなければならない。

26.2.1.1 FinalizationRegistry ( cleanupCallback )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. IsCallable(cleanupCallback) が false の場合、TypeError 例外をスローする。
  3. finalizationRegistry を ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationRegistry.prototype%", « [[Realm]], [[CleanupCallback]], [[Cells]] ») とする。
  4. fn をアクティブな関数オブジェクトとする。
  5. finalizationRegistry.[[Realm]]fn.[[Realm]] に設定する。
  6. finalizationRegistry.[[CleanupCallback]]HostMakeJobCallback(cleanupCallback) に設定する。
  7. finalizationRegistry.[[Cells]] を新しい空のListに設定する。
  8. finalizationRegistry を返す。

26.2.2 FinalizationRegistryコンストラクターのプロパティ

FinalizationRegistryコンストラクターは:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 次のプロパティを持つ:

26.2.2.1 FinalizationRegistry.prototype

FinalizationRegistry.prototypeの初期値はFinalizationRegistryプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

26.2.3 FinalizationRegistryプロトタイプオブジェクトのプロパティ

FinalizationRegistryプロトタイプオブジェクトは:

  • %FinalizationRegistry.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[Cells]]および[[CleanupCallback]]内部スロットを持たない。

26.2.3.1 FinalizationRegistry.prototype.constructor

FinalizationRegistry.prototype.constructorの初期値は %FinalizationRegistry% です。

26.2.3.2 FinalizationRegistry.prototype.register ( target, heldValue [ , unregisterToken ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. finalizationRegistrythis値とする。
  2. RequireInternalSlot(finalizationRegistry, [[Cells]]) を実行する。
  3. CanBeHeldWeakly(target) が false の場合、TypeError 例外をスローする。
  4. SameValue(target, heldValue) が true の場合、TypeError 例外をスローする。
  5. CanBeHeldWeakly(unregisterToken) が false の場合、
    1. unregisterTokenundefined でない場合、TypeError 例外をスローする。
    2. unregisterTokenempty に設定する。
  6. cellRecord { [[WeakRefTarget]]: target, [[HeldValue]]: heldValue, [[UnregisterToken]]: unregisterToken } とする。
  7. cellfinalizationRegistry.[[Cells]] に追加する。
  8. undefined を返す。
Note

この仕様のアルゴリズムおよび定義に基づくと、finalizationRegistry.[[Cells]]cell を含む場合、cell.[[HeldValue]]liveです。しかし、これは必ずしも cell.[[UnregisterToken]] または cell.[[Target]]liveであることを意味しません。例えば、オブジェクト自身をそのunregister tokenとして登録しても、そのオブジェクトを永遠に生かし続けることにはなりません。

26.2.3.3 FinalizationRegistry.prototype.unregister ( unregisterToken )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. finalizationRegistrythis値とする。
  2. RequireInternalSlot(finalizationRegistry, [[Cells]]) を実行する。
  3. CanBeHeldWeakly(unregisterToken) が false の場合、TypeError 例外をスローする。
  4. removedfalse とする。
  5. finalizationRegistry.[[Cells]] の各Record { [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] } cell について、次を行う:
    1. cell.[[UnregisterToken]]empty でなく、SameValue(cell.[[UnregisterToken]], unregisterToken) が true である場合、
      1. cellfinalizationRegistry.[[Cells]] から削除する。
      2. removedtrue に設定する。
  6. removed を返す。

26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "FinalizationRegistry" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

26.2.4 FinalizationRegistryインスタンスのプロパティ

FinalizationRegistryインスタンスは、FinalizationRegistryプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。FinalizationRegistryインスタンスは、[[Cells]]および[[CleanupCallback]]内部スロットも持ちます。