26 メモリ管理

26.1 WeakRefオブジェクト

WeakRefは、target objectまたはsymbolをガベージコレクションから保持することなく参照するために使用されるobjectである。WeakRefsは、targetがガベージコレクションによって回収されていない場合に、target valueへのアクセスを可能にするためにdereferenceできる。

26.1.1 WeakRefコンストラクタ

WeakRef constructorは:

  • %WeakRef%である。
  • global object"WeakRef" propertyのinitial valueである。
  • constructorとして呼び出されたときに、新しいWeakRefをcreateおよびinitializeする。
  • functionとして呼び出されることを意図しておらず、そのように呼び出された場合はexceptionをthrowする。
  • クラス定義の extends 句内の値として使用できる。指定された WeakRef の動作を継承しようとするサブクラスコンストラクターは、WeakRef.prototype の組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを作成し初期化するため、WeakRef コンストラクターへの super 呼び出しを含めなければならない。

26.1.1.1 WeakRef ( target )

このfunctionは、呼び出されたときに以下のstepsを実行する:

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

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

WeakRef constructorは:

  • valueが%Function.prototype%である[[Prototype]] internal slotを持つ。
  • 以下のpropertiesを持つ:

26.1.2.1 WeakRef.prototype

WeakRef.prototypeのinitial valueはWeakRef prototype objectである。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }を持つ。

26.1.3 WeakRef Prototype Objectのプロパティ

WeakRef prototype objectは:

  • %WeakRef.prototype%である。
  • valueが%Object.prototype%である[[Prototype]] internal slotを持つ。
  • ordinary objectである。
  • [[WeakRefTarget]] internal slotを持たない。

26.1.3.1 WeakRef.prototype.constructor

WeakRef.prototype.constructorのinitial valueは%WeakRef%である。

26.1.3.2 WeakRef.prototype.deref ( )

このmethodは、呼び出されたときに以下のstepsを実行する:

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

WeakRefundefinedでないtarget valueを返す場合、このtarget valueは、ECMAScript codeのcurrent executionがcompletedするまでガベージコレクションされるべきではない。AddToKeptObjects operationは、read consistencyがmaintainedされることを確実にする。

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

// ... later ...

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

上記の例では、first derefがundefinedにevaluateしない場合、second derefもそうなることはできない。

26.1.3.3 WeakRef.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "WeakRef"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

26.1.4 WeakRef Abstract Operations

26.1.4.1 WeakRefDeref ( weakRef )

The abstract operation WeakRefDeref takes argument weakRef (a WeakRef) and returns an ECMAScript language value. It performs the following steps when called:

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

このabstract operationは、livenessを簡潔にdefineできるようにするためだけに、WeakRef.prototype.derefからseparatelyにdefinedされている。

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

WeakRef instancesは、WeakRef prototype objectからpropertiesをinheritするordinary objectsである。WeakRef instancesはまた、[[WeakRefTarget]] internal slotを持つ。

26.2 FinalizationRegistryオブジェクト

FinalizationRegistryは、target objectsおよびsymbolsがガベージコレクションされたときに実行されるcleanup operationsのregistrationおよびunregistrationをmanageするobjectである。

26.2.1 FinalizationRegistryコンストラクタ

FinalizationRegistry constructorは:

  • %FinalizationRegistry%である。
  • global object"FinalizationRegistry" propertyのinitial valueである。
  • constructorとして呼び出されたときに、新しいFinalizationRegistryをcreateおよびinitializeする。
  • functionとして呼び出されることを意図しておらず、そのように呼び出された場合はexceptionをthrowする。
  • クラス定義の extends 句内の値として使用できる。指定された FinalizationRegistry の動作を継承しようとするサブクラスコンストラクターは、FinalizationRegistry.prototype の組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを作成し初期化するため、FinalizationRegistry コンストラクターへの super 呼び出しを含めなければならない。

26.2.1.1 FinalizationRegistry ( cleanupCallback )

このfunctionは、呼び出されたときに以下のstepsを実行する:

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

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

FinalizationRegistry constructorは:

  • valueが%Function.prototype%である[[Prototype]] internal slotを持つ。
  • 以下のpropertiesを持つ:

26.2.2.1 FinalizationRegistry.prototype

FinalizationRegistry.prototypeのinitial valueはFinalizationRegistry prototype objectである。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }を持つ。

26.2.3 FinalizationRegistry Prototype Objectのプロパティ

FinalizationRegistry prototype objectは:

  • %FinalizationRegistry.prototype%である。
  • valueが%Object.prototype%である[[Prototype]] internal slotを持つ。
  • ordinary objectである。
  • [[Cells]]および[[CleanupCallback]] internal slotsを持たない。

26.2.3.1 FinalizationRegistry.prototype.constructor

FinalizationRegistry.prototype.constructorのinitial valueは%FinalizationRegistry%である。

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

このmethodは、呼び出されたときに以下のstepsを実行する:

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

このspecificationのalgorithmsおよびdefinitionsに基づくと、finalizationRegistry.[[Cells]]cellをcontainsするとき、cell.[[HeldValue]]liveである;しかし、これは必ずしもcell.[[UnregisterToken]]またはcell.[[Target]]liveであることを意味しない。例えば、objectをそれ自身をunregister tokenとしてregisterしても、そのobjectが永久にaliveに保たれることはない。

26.2.3.3 FinalizationRegistry.prototype.unregister ( unregisterToken )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. finalizationRegistrythis valueとする。
  2. RequireInternalSlot(finalizationRegistry, [[Cells]])を実行する。
  3. CanBeHeldWeakly(unregisterToken)がfalseなら、TypeError例外をthrowする。
  4. removedfalseとする。
  5. finalizationRegistry.[[Cells]]の各Record { [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] } cellについて、
    1. cell.[[UnregisterToken]]emptyでなく、かつSameValue(cell.[[UnregisterToken]], unregisterToken)がtrueなら、
      1. finalizationRegistry.[[Cells]]からcellをremoveする。
      2. removedtrueに設定する。
  6. removedを返す。

26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "FinalizationRegistry"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

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

FinalizationRegistry instancesは、FinalizationRegistry prototype objectからpropertiesをinheritするordinary objectsである。FinalizationRegistry instancesはまた、[[Cells]]および[[CleanupCallback]] internal slotsを持つ。