ページ表示設定

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 コンストラクターは:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持ちます。
  • 次のプロパティを持ちます。

26.1.2.1 WeakRef.prototype

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

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

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

WeakRef prototype オブジェクトは:

  • %WeakRef.prototype% です。
  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
  • 通常オブジェクトです。
  • [[WeakRefTarget]] 内部スロットを持ちません。
規定の任意機能

26.1.3.1 WeakRef.prototype.constructor

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

26.1.3.2 WeakRef.prototype.deref ( )

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

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

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

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

// ... 後で ...

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 )

抽象操作 WeakRefDeref。引数 weakRef (WeakRef)。戻り値:ECMAScript 言語値。 呼び出されると、次の手順を実行する。

  1. target を weakRef.[[WeakRefTarget]] とする。
  2. target が empty でない場合、
    1. AddToKeptObjects(target) を実行する。
    2. target を返す。
  3. undefined を返す。
注

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

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

WeakRef インスタンスは WeakRef prototype オブジェクトからプロパティを継承する通常オブジェクトです。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. activeFunc をアクティブな関数オブジェクトとする。
  5. finalizationRegistry.[[Realm]] を activeFunc.[[Realm]] に設定する。
  6. finalizationRegistry.[[CleanupCallback]] を HostMakeJobCallback(cleanupCallback) に設定する。
  7. finalizationRegistry.[[Cells]] を新しい空の List に設定する。
  8. finalizationRegistry を返す。

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

FinalizationRegistry コンストラクターは:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持ちます。
  • 次のプロパティを持ちます。

26.2.2.1 FinalizationRegistry.prototype

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

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

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

FinalizationRegistry prototype オブジェクトは:

  • %FinalizationRegistry.prototype% です。
  • 値が %Object.prototype% である [[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. finalizationRegistry を this 値とする。
  2. ? RequireInternalSlot(finalizationRegistry, [[Cells]]) を実行する。
  3. CanBeHeldWeakly(target) が false である場合、TypeError 例外をスローする。
  4. SameValue(target, heldValue) が true である場合、TypeError 例外をスローする。
  5. CanBeHeldWeakly(unregisterToken) が false である場合、
    1. unregisterToken が undefined でない場合、TypeError 例外をスローする。
    2. unregisterToken を empty に設定する。
  6. cell を Record { [[WeakRefTarget]]: target, [[HeldValue]]: heldValue, [[UnregisterToken]]: unregisterToken } とする。
  7. cell を finalizationRegistry.[[Cells]] に追加する。
  8. undefined を返す。
注

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

26.2.3.3 FinalizationRegistry.prototype.unregister ( unregisterToken )

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

  1. finalizationRegistry を this 値とする。
  2. ? RequireInternalSlot(finalizationRegistry, [[Cells]]) を実行する。
  3. CanBeHeldWeakly(unregisterToken) が false である場合、TypeError 例外をスローする。
  4. removed を false とする。
  5. finalizationRegistry.[[Cells]] の各 Record { [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] } cell について、次を行う。
    1. cell.[[UnregisterToken]] が empty でなく、SameValue(cell.[[UnregisterToken]], unregisterToken) が true である場合、
      1. cell を finalizationRegistry.[[Cells]] から削除する。
      2. removed を true に設定する。
  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 prototype オブジェクトからプロパティを継承する通常オブジェクトです。FinalizationRegistry インスタンスは [[Cells]] および [[CleanupCallback]] 内部スロットも持ちます。