24.1 ArrayBufferオブジェクト(ArrayBuffer Objects)
24.1.1 ArrayBufferオブジェクトの抽象演算(Abstract Operations For ArrayBuffer Objects)
24.1.1.1 AllocateArrayBuffer ( constructor, byteLength )
引数constructorとbyteLengthを使用した抽象操作AllocateArrayBufferは、ArrayBufferオブジェクトを作成します。 次の手順を実行します。
- ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] ») を obj とする
- Assert: ! IsNonNegativeInteger(byteLength) は true
- ? CreateByteDataBlock(byteLength) を block とする
- block を obj.[[ArrayBufferData]] にセットする
- byteLength を obj.[[ArrayBufferByteLength]] にセットする
- obj を返す
24.1.1.2 IsDetachedBuffer ( arrayBuffer )
引数arrayBufferを使用した抽象操作IsDetachedBuffer は、次の手順を実行します。
24.1.1.3 DetachArrayBuffer ( arrayBuffer [ , key ] )
引数arrayBuffer と オプション keyを使用した抽象操作DetachArrayBuffer は、次の手順を実行します。
- Assert: Type(arrayBuffer) は Object型で 内部スロット [[ArrayBufferData]]、 [[ArrayBufferByteLength]]、 [[ArrayBufferDetachKey]] がある
- Assert: IsSharedArrayBuffer(arrayBuffer) は false
- key が 存在しないなら、 undefined を key にセットする
- SameValue(arrayBuffer.[[ArrayBufferDetachKey]], key) が false なら、TypeError例外をスローする
- null を arrayBuffer.[[ArrayBufferData]] にセットする
- 0 を arrayBuffer.[[ArrayBufferByteLength]] にセットする
- NormalCompletion(null) を返す
24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength, cloneConstructor )
抽象操作CloneArrayBufferは、ArrayBuffer srcBuffer、整数オフセットsrcByteOffset、整数長srcLength、およびコンストラクター関数cloneConstructorの4つの引数を取ります。 srcBufferのsrcByteOffsetから、srcLengthバイトのデータをコピーし新しいArrayBufferを作成します。 この操作は、次の手順を実行します。
- Assert: Type(srcBuffer) は Object型で [[ArrayBufferData]] 内部スロットがある
- Assert: IsConstructor(cloneConstructor) は true
- ? AllocateArrayBuffer(cloneConstructor, srcLength) を targetBuffer とする
- IsDetachedBuffer(srcBuffer) が true なら、TypeError例外をスローする
- srcBuffer.[[ArrayBufferData]] を srcBlock とする
- targetBuffer.[[ArrayBufferData]] を targetBlock とする
- CopyDataBlockBytes(targetBlock, 0, srcBlock, srcByteOffset, srcLength) を実行する
- targetBuffer を返す
24.1.1.5 IsUnsignedElementType ( type )
抽象演算IsUnsignedElementTypeは、引数のtypeが符号なしのTypedArray要素型であるかどうかを確認します。 この操作は、次の手順を実行します。
- type が Uint8、 Uint8C、 Uint16、 Uint32、 BigUint64 のどれかなら、 true を返す
- false を返す
24.1.1.6 IsUnclampedIntegerElementType ( type )
抽象演算IsUnclampedIntegerElementTypeは、引数typeがUint8C以外の整数TypedArray要素タイプであるかどうかを確認します。 この操作は、次の手順を実行します。
- type が Int8、Uint8、Int16、 Uint16、 Int32、 Uint32 のどれかなら、 true を返す
- false を返す
24.1.1.7 IsBigIntElementType ( type )
抽象操作IsBigIntElementTypeは、引数のtypeがBigInt TypedArray要素型であるかどうかを確認します。 この操作は、次の手順を実行します。
- type が BigUint64 または BigInt64 なら、 true を返す
- false を返す
24.1.1.8 IsNoTearConfiguration ( type, order )
引数type、orderを指定した抽象操作IsNoTearConfigurationは、次の手順を実行します。
- ! IsUnclampedIntegerElementType(type) が true なら、 true を返す
- ! IsBigIntElementType(type) が true で order が Init または Unordered でないなら、 true を返す
- false を返す
24.1.1.9 RawBytesToNumeric ( type, rawBytes, isLittleEndian )
抽象操作RawBytesToNumericは、TypedArray要素タイプtype、リストrawBytes、およびブールisLittleEndianの3つのパラメーターを取ります。 この操作は、次の手順を実行します。
- 表61で、typeに対応する要素サイズを elementSize とする
- isLittleEndian が false なら rawBytes の要素の順序を逆にする
- type が Float32 なら、
- IEEE 754-2019 binary32値のリトルエンディアンビット文字列エンコーディングとして解釈し連結した rawBytesのバイト要素を value とする
- value が IEEE 754-2019 binary32 NaN値 なら、 NaN 数値 を返す
- value に対応する数値を返す
- type が Float64 なら、
- IEEE 754-2019 binary64値のリトルエンディアンビット文字列エンコーディングとして解釈し連結した rawBytesのバイト要素を value とする
- value が IEEE 754-2019 binary64 NaN値 なら、 NaN 数値 を返す
- value に対応する数値を返す
- ! IsUnsignedElementType(type) が true なら、
- 符号なしリトルエンディアン2進数のビット文字列エンコーディングとして解釈し連結したrawBytesのバイト要素を intValue とする
- 5. と異なるなら、
- ビット長elementSize×8のバイナリリトルエンディアン2の補数のビット文字列エンコーディングとして解釈し連結したrawBytesのバイト要素を intValue とする
- ! IsBigIntElementType(type) が true なら、intValue に対応するBigInt値を返す
- intValue に対応する 数値 を返す
24.1.1.10 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] )
抽象演算GetValueFromBufferは、ArrayBufferまたはSharedArrayBuffer arrayBuffer、整数byteIndex、TypedArray要素タイプtype、ブールisTypedArray、(SeqCst、Unordered)のいずれかであるorder、およびオプションでブールisLittleEndianの6つのパラメーターを取ります。 この操作は、次の手順を実行します。
- Assert: IsDetachedBuffer(arrayBuffer) は false
- Assert: typeの値を格納するのに十分なバイトがbyteIndexで始まるarrayBufferにある
- Assert: ! IsNonNegativeInteger(byteIndex) は true
- arrayBuffer.[[ArrayBufferData]] を block とする
- 表61で、typeに対応する要素サイズを elementSize とする
- IsSharedArrayBuffer(arrayBuffer) が true なら、
- 周囲のエージェント の エージェントレコード の [[CandidateExecution]] フィールドを execution とする
- [[AgentSignifier]] と AgentSignifier() が同値であるexecution.[[EventsRecords]]の要素の[[EventList]]フィールドを eventList とする
- isTypedArray が true で IsNoTearConfiguration(type, order) が true なら true を、異なるなら false を noTear とする
- 非決定論的に選択されたバイト値の長さelementSizeのリストを rawValue とする
- NOTE: 実装では、rawValueは、基盤となるハードウェアでの非アトミックまたはアトミック読み取り命令の結果です。 非決定性は、一貫性の弱いハードウェアの観察可能な動作を記述するためのメモリモデルのセマンティックです。
- ReadSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize } を readEvent とする
- eventList に readEvent を追加する
- execution.[[ChosenValues]] に Chosen Value Records { [[Event]]: readEvent, [[ChosenValue]]: rawValue } を追加する
- 6. と異なるなら、block[byteIndex]で始まるバイトのelementSizeシーケンスを順番に含むelementSizeのリストを rawValue とする
- isLittleEndian が 存在しないなら、 周囲のエージェント の エージェントレコード の[[LittleEndian]] フィールドの値を isLittleEndian にセットする
- RawBytesToNumeric(type, rawValue, isLittleEndian) を返す
24.1.1.11 NumericToRawBytes ( type, value, isLittleEndian )
抽象演算NumericToRawBytesは、TypedArray要素タイプtype、BigIntまたはNumbervalue、およびブールisLittleEndianの3つのパラメーターを取ります。 この操作は、次の手順を実行します。
- type が Float32 なら、
- roundTiesToEvenモードを使用してvalueをIEEE 754-2019 binary32形式に変換した結果である4バイトを含むリストを rawBytes とする。 isLittleEndianがfalseなら、バイトはビッグエンディアンの順序で、 それ以外なら、リトルエンディアンの順序で配置する。 valueがNaNなら、rawBytesは、IEEE 754-2019 binary32形式のNot-a-Numberエンコーディングで選択された任意の実装に設定できる。 実装は、実装ごとに識別可能なNaN値に対して常に同じエンコーディングを選択する必要がある
- 1. と異なり、 type が Float64 なら、
- valueのIEEE 754-2019 binary64形式のエンコーディングである8バイトを含むリストを rawBytes とする。 isLittleEndianがfalseなら、バイトはビッグエンディアンの順序で、 それ以外ならバイトはリトルエンディアンの順序で配置される。 valueがNaNなら、rawBytesは、IEEE 754-2019 binary64形式のNot-a-Numberエンコーディングで選択された任意の実装に設定できる。 実装は、実装ごとに識別可能なNaN値に対して常に同じエンコーディングを選択する必要がある。
- 2. と異なるなら、
- 表61で、typeに対応する要素サイズを n とする
- 表61で、typeに対応する変換操作の抽象操作を convOp とする
- 結果がBigIntであるか数値であるかに関係なく、数学的数値として扱われるconvOp(value) を intValueとする
- intValue ≧ 0 なら、
- intValueのnバイトのバイナリエンコーディングを含むリストをrawBytesとする。 isLittleEndianがfalseなら、バイトはビッグエンディアンの順序で、 それ以外なら、バイトはリトルエンディアンの順序で並べる
- d. と異なるなら、
- intValueのnバイトのバイナリ2の補数エンコーディングを含むリストをrawBytesとする。 isLittleEndianがfalseなら、バイトはビッグエンディアンの順序で、 それ以外なら、バイトはリトルエンディアンの順序で並べる
- rawBytes を返す
24.1.1.12 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] )
抽象演算SetValueInBufferは、7つの引数、ArrayBufferまたはSharedArrayBuffer arrayBuffer、整数byteIndex、TypedArray要素タイプtype、NumberまたはBigInt value、ブールisTypedArray、(SeqCst、Unordered、Init)のいずれかであるorder、およびオプション ブールisLittleEndian をとります。 この操作は、次の手順を実行します。
- Assert: IsDetachedBuffer(arrayBuffer) は false
- Assert: typeの値を格納するのに十分なバイトがbyteIndexで始まるarrayBufferにある
- Assert: ! IsNonNegativeInteger(byteIndex) は true
- Assert: ! IsBigIntElementType(type) が true なら、Type(value) は BigInt型 。 異なるなら Type(value) は Number型
- arrayBuffer.[[ArrayBufferData]] を block とする
- 表61で、typeに対応する要素サイズを elementSize とする
- isLittleEndian が 存在しないなら、 周囲のエージェント の エージェントレコード の [[LittleEndian]] フィールド の値を isLittleEndian にセットする
- NumericToRawBytes(type, value, isLittleEndian) を rawBytes とする
- IsSharedArrayBuffer(arrayBuffer) が true なら、
- 周囲のエージェント の エージェントレコード の [[CandidateExecution]] フィールドを execution とする
- [[AgentSignifier]] と AgentSignifier() が同値である execution.[[EventsRecords]] の要素の [[EventList]] フィールドを eventList とする
- isTypedArray が true で IsNoTearConfiguration(type, order) が true なら、 true を、異なるなら false を noTear とする
- eventList に WriteSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes } を追加する
- 9. と異なるなら、 rawBytesの個々のバイトをblock [byteIndex]から順番にblockに格納します。
- NormalCompletion(undefined) を返す
24.1.1.13 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op [ , isLittleEndian ] )
抽象演算GetModifySetValueInBufferは、SharedArrayBuffer arrayBuffer、非負の整数byteIndex、TypedArray要素タイプtype、NumberまたはBigIntvalue、セマンティック関数op、およびオプション ブールisLittleEndianの6つのパラメーターを取ります。 この操作は、次の手順を実行します。
- Assert: IsSharedArrayBuffer(arrayBuffer) は true
- Assert: typeの値を格納するのに十分なバイトがbyteIndexで始まるarrayBufferにある
- Assert: ! IsNonNegativeInteger(byteIndex) は true
- Assert: ! IsBigIntElementType(type) が true なら Type(value) は BigInt型。 異なるなら Type(value) は Number型
- arrayBuffer.[[ArrayBufferData]] を block とする
- 表61で、typeに対応する要素サイズを elementSize とする
- isLittleEndian が 存在しないなら、 周囲のエージェント の エージェントレコード の [[LittleEndian]] フィールドを isLittleEndian にセットする
- NumericToRawBytes(type, value, isLittleEndian) を rawBytes とする
- 周囲のエージェント の エージェントレコード の [[CandidateExecution]] フィールドを execution とする
- [[AgentSignifier]] と AgentSignifier() が同値である execution.[[EventsRecords]] の要素の [[EventList]] フィールドを eventList とする
- 非決定論的に選択されたバイト値の長さelementSizeのリストを rawBytesRead とする
- NOTE: 実装では、rawBytesReadは、ロードリンク、ロード排他、または基盤となるハードウェアの読み取り-変更-書き込み命令のオペランドの結果です。 非決定性は、一貫性の弱いハードウェアの観察可能な動作を記述するためのメモリモデルのセマンティックです。
- ReadModifyWriteSharedMemory { [[Order]]: SeqCst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes, [[ModifyOp]]: op } を rmwEvent とする
- eventList に rmwEvent を追加する
- execution にChosen Value Record { [[Event]]: rmwEvent, [[ChosenValue]]: rawBytesRead } を追加する[[ChosenValues]]
- RawBytesToNumeric(type, rawBytesRead, isLittleEndian) を返す
24.1.2 ArrayBufferコンストラクター(The ArrayBuffer Constructor)
ArrayBufferコンストラクターは、次の特徴があります。
- 組み込みオブジェクト%ArrayBuffer%です。
- グローバルオブジェクトの"ArrayBuffer"プロパティの初期値です。
- コンストラクターとして呼び出されると、新しいArrayBufferオブジェクトを作成して初期化します。
- 関数として呼び出されると例外がスローされます。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターは、ArrayBuffer.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化するためにsuperコールを含める必要があります。
24.1.2.1 ArrayBuffer ( length )
ArrayBuffer 関数が引数 length で呼び出されると、次の手順が実行されます。
24.1.3 ArrayBufferコンストラクターのプロパティ(Properties of the ArrayBuffer Constructor)
ArrayBufferコンストラクターは、次の特徴があります。
- [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
- 以下のプロパティがあります。
24.1.3.1 ArrayBuffer.isView ( arg )
isView関数は1つの引数argを取り、次の手順を実行します。
- Type(arg) が Object型 でないなら、 false を返す
- arg が[[ViewedArrayBuffer]] 内部スロットを持っているなら true を返す
- false を返す
24.1.3.2 ArrayBuffer.prototype
ArrayBuffer.prototypeの初期値は%ArrayBuffer.prototype%です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。
24.1.3.3 get ArrayBuffer [ @@species ]
ArrayBuffer[@@species]はsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を返す
この関数の"name"プロパティの値は"get [Symbol.species]"です。
24.1.4 ArrayBufferプロトタイプオブジェクトのプロパティ(Properties of the ArrayBuffer Prototype Object)
ArrayBufferプロトタイプオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%ArrayBufferPrototype%です。
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
- 通常のオブジェクトです。
- 内部スロット[[ArrayBufferData]]または[[ArrayBufferByteLength]]がありません。
24.1.4.1 get ArrayBuffer.prototype.byteLength
ArrayBuffer.prototype.byteLengthはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を O とする
- ? RequireInternalSlot(O, [[ArrayBufferData]]) を実行する
- IsSharedArrayBuffer(O) が true なら、TypeError例外をスローする
- IsDetachedBuffer(O) が true なら、TypeError例外をスローする
- O.[[ArrayBufferByteLength]] を length とする
- length を返す
24.1.4.2 ArrayBuffer.prototype.constructor
ArrayBuffer.prototype.constructorの初期値は%ArrayBuffer%です。
24.1.4.3 ArrayBuffer.prototype.slice ( start, end )
次の手順が実行されます。
- this値 を O とする
- ? RequireInternalSlot(O, [[ArrayBufferData]]) を実行する
- IsSharedArrayBuffer(O) が true なら、TypeError例外をスローする
- IsDetachedBuffer(O) が true なら、TypeError例外をスローする
- O.[[ArrayBufferByteLength]] を len とする
- ? ToInteger(start) を relativeStart とする
- IrelativeStart < 0 なら max((len + relativeStart), 0) を、異なるなら min(relativeStart, len) を first とする
- end が undefined なら、 len を、異なるなら ? ToInteger(end) を relativeEnd とする
- relativeEnd < 0 なら max((len + relativeEnd), 0) を、異なるなら min(relativeEnd, len) を final とする
- max(final - first, 0) を newLen とする
- ? SpeciesConstructor(O, %ArrayBuffer%) を ctor とする
- ? Construct(ctor, « newLen ») を new とする
- ? RequireInternalSlot(new, [[ArrayBufferData]]) を実行する
- IsSharedArrayBuffer(new) が true なら、TypeError例外をスローする
- IsDetachedBuffer(new) が true なら、TypeError例外をスローする
- SameValue(new, O) が true なら、TypeError例外をスローする
- new.[[ArrayBufferByteLength]] < newLen なら TypeError例外をスローする
- NOTE: 上記の手順の副作用により、Oが切り離された可能性がある
- IsDetachedBuffer(O) が true なら、TypeError例外をスローする
- O.[[ArrayBufferData]] を fromBuf とする
- new.[[ArrayBufferData]] を toBuf とする
- CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLen) を実行する
- new を返す
24.1.4.4 ArrayBuffer.prototype [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"ArrayBuffer"です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
24.1.5 ArrayBufferインスタンスのプロパティ(Properties of ArrayBuffer Instances)
ArrayBufferインスタンスは、ArrayBufferプロトタイプオブジェクトからプロパティを継承します。 ArrayBufferインスタンスには、それぞれ[[ArrayBufferData]]内部スロット、[[ArrayBufferByteLength]]内部スロット、および[[ArrayBufferDetachKey]]内部スロットがあります。
[[ArrayBufferData]]がnullのArrayBufferインスタンスは切り離されていると見なされます。このときArrayBufferインスタンスに含まれるデータにアクセスまたは変更するすべての演算子は失敗します。
[[ArrayBufferDetachKey]]がundefined以外の値に設定されているArrayBufferインスタンスでは、すべてのDetachArrayBuffer呼び出しで、同じ「デタッチキー」を引数として渡す必要があります。そうしないと、TypeErrorが発生します。 この内部スロットは、この仕様のアルゴリズムではなく、特定の埋め込み環境によってのみ設定されます。
24.2 SharedArrayBufferオブジェクト(SharedArrayBuffer Objects)
24.2.1 SharedArrayBufferオブジェクトの抽象演算(Abstract Operations for SharedArrayBuffer Objects)
24.2.1.1 AllocateSharedArrayBuffer ( constructor, byteLength )
引数constructorとbyteLengthを使用した抽象操作AllocateSharedArrayBufferは、をSharedArrayBufferオブジェクトを作成します。 次の手順を実行します。
- ? OrdinaryCreateFromConstructor(constructor, "%SharedArrayBuffer.prototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]] ») を obj とする
- Assert: ! IsNonNegativeInteger(byteLength) は true
- ? CreateSharedByteDataBlock(byteLength) を block とする
- block を obj.[[ArrayBufferData]] にセットする
- byteLength を obj.[[ArrayBufferByteLength]] にセットする
- obj を返す
24.2.1.2 IsSharedArrayBuffer ( obj )
IsSharedArrayBufferは、オブジェクトがArrayBuffer、SharedArrayBuffer、またはいずれかのサブタイプであるかどうかをテストします。 次の手順を実行します。
24.2.2 SharedArrayBufferコンストラクター(The SharedArrayBuffer Constructor)
SharedArrayBufferコンストラクターは、次の特徴があります。
- 組み込みオブジェクト%SharedArrayBuffer%です。
- グローバルオブジェクトの"SharedArrayBuffer"プロパティの初期値です。
- コンストラクターとして呼び出されると、新しいSharedArrayBufferオブジェクトを作成して初期化します。
- 関数として呼び出されると例外がスローされます。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、SharedArrayBuffer.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化するためにsuperコールを含める必要があります。
24.2.2.1 SharedArrayBuffer ( [ length ] )
SharedArrayBuffer関数がオプションの引数lengthで呼び出されると、次の手順が実行されます。
24.2.3 SharedArrayBufferコンストラクターのプロパティ(Properties of the SharedArrayBuffer Constructor)
SharedArrayBufferコンストラクターは、次の特徴があります。
- [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
- 以下のプロパティがあります。
24.2.3.1 SharedArrayBuffer.prototype
SharedArrayBuffer.prototypeの初期値は%SharedArrayBuffer.prototype%です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。
24.2.3.2 get SharedArrayBuffer [ @@species ]
SharedArrayBuffer[@@species]はsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を返す
この関数の"name"プロパティの値は"get [Symbol.species]"です。
24.2.4 SharedArrayBufferプロトタイプオブジェクトのプロパティ(Properties of the SharedArrayBuffer Prototype Object)
SharedArrayBufferプロトタイプオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%SharedArrayBufferPrototype%です。
- [[Prototype]]内部スロットがあり、値が%Object.prototype%です。
- 通常のオブジェクトです。
- [[ArrayBufferData]]または[[ArrayBufferByteLength]]内部スロットがありません。
24.2.4.1 get SharedArrayBuffer.prototype.byteLength
SharedArrayBuffer.prototype.byteLengthはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を O とする
- ? RequireInternalSlot(O, [[ArrayBufferData]]) を実行する
- IsSharedArrayBuffer(O) が false なら、TypeError例外をスローする
- O.[[ArrayBufferByteLength]] を length とする
- length を返す
24.2.4.2 SharedArrayBuffer.prototype.constructor
SharedArrayBuffer.prototype.constructorの初期値は%SharedArrayBuffer%です。
24.2.4.3 SharedArrayBuffer.prototype.slice ( start, end )
次の手順が実行されます。
- this値 を O とする
- ? RequireInternalSlot(O, [[ArrayBufferData]]) を実行する
- IsSharedArrayBuffer(O) が false なら、TypeError例外をスローする
- O.[[ArrayBufferByteLength]] を len とする
- ? ToInteger(start) を relativeStart とする
- relativeStart < 0 なら max((len + relativeStart), 0) を、異なるなら min(relativeStart, len) を first とする
- end が undefined なら、 len を、異なるなら ? ToInteger(end) を relativeEnd とする
- relativeEnd < 0 なら max((len + relativeEnd), 0) を、異なるなら min(relativeEnd, len) を final とする
- max(final - first, 0) を newLen とする
- ? SpeciesConstructor(O, %SharedArrayBuffer%) を ctor とする
- ? Construct(ctor, « newLen ») を new とする
- ? RequireInternalSlot(new, [[ArrayBufferData]]) を実行する
- IsSharedArrayBuffer(new) が false なら、TypeError例外をスローする
- new.[[ArrayBufferData]] と O.[[ArrayBufferData]] が同じ 共有データブロック 値なら TypeError例外をスローする
- new.[[ArrayBufferByteLength]] < newLen なら TypeError例外をスローする
- O.[[ArrayBufferData]] を fromBuf とする
- new.[[ArrayBufferData]] を toBuf とする
- CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLen) を実行する
- new を返す
24.2.4.4 SharedArrayBuffer.prototype [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"SharedArrayBuffer"です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
24.2.5 SharedArrayBufferインスタンスのプロパティ(Properties of SharedArrayBuffer Instances)
SharedArrayBufferインスタンスは、SharedArrayBufferプロトタイプオブジェクトからプロパティを継承します。 SharedArrayBufferインスタンスには、それぞれ[[ArrayBufferData]]内部スロットと[[ArrayBufferByteLength]]内部スロットがあります。
24.3 DataViewオブジェクト(DataView Objects)
24.3.1 DataViewオブジェクトの抽象操作(Abstract Operations For DataView Objects)
24.3.1.1 GetViewValue ( view, requestIndex, isLittleEndian, type )
引数view、requestIndex、isLittleEndian、およびtypeを指定した抽象操作GetViewValueは、ビューバッファーから値を取得するためにDataViewインスタンスの関数によって使用されます。 次の手順を実行します。
す。
- ? RequireInternalSlot(view, [[DataView]]) を実行する
- Assert: view は [[ViewedArrayBuffer]] 内部スロットがある
- ? ToIndex(requestIndex) を getIndex とする
- ! ToBoolean(isLittleEndian) を isLittleEndian にセットする
- view.[[ViewedArrayBuffer]] を buffer とする
- IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
- view.[[ByteOffset]] を viewOffset とする
- view.[[ByteLength]] を viewSize とする
- 表61で、typeに対応する要素サイズを elementSize とする
- getIndex + elementSize > viewSize なら RangeError例外をスローする
- getIndex + viewOffset を bufferIndex とする
- GetValueFromBuffer(buffer, bufferIndex, type, false, Unordered, isLittleEndian) を返す
24.3.1.2 SetViewValue ( view, requestIndex, isLittleEndian, type, value )
引数view、requestIndex、isLittleEndian、type、およびvalueを持つ抽象操作SetViewValueは、値をビューバッファーに格納するためにDataViewインスタンスの関数によって使用されます。 次の手順を実行します。
- ? RequireInternalSlot(view, [[DataView]]) を実行する
- Assert: view は [[ViewedArrayBuffer]] 内部スロットがある
- ? ToIndex(requestIndex) を getIndex とする
- ! IsBigIntElementType(type) が true なら、 ? ToBigInt(value) を numberValue とする
- 上と異なるなら ? ToNumber(value) を numberValue とする
- ! ToBoolean(isLittleEndian) を isLittleEndian にセットする
- view.[[ViewedArrayBuffer]] を buffer とする
- IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
- view.[[ByteOffset]] を viewOffset とする
- view.[[ByteLength]] を viewSize とする
- 表61で、typeに対応する要素サイズを elementSize とする
- getIndex + elementSize > viewSize なら RangeError例外をスローする
- getIndex + viewOffset を bufferIndex とする
- SetValueInBuffer(buffer, bufferIndex, type, numberValue, false, Unordered, isLittleEndian) を返す
24.3.2 DataViewコンストラクター(The DataView Constructor)
DataViewコンストラクターは、次の特徴があります。
- 組み込みオブジェクト%DataView%です。
- グローバルオブジェクトの"DataView"プロパティの初期値です。
- コンストラクターとして呼び出されると、新しいDataViewオブジェクトを作成して初期化します。
- 関数として呼び出されると例外がスローされます。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターは、DataView.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化するためにsuperコールを含める必要があります。
24.3.2.1 DataView ( buffer [ , byteOffset [ , byteLength ] ] )
DataView関数が1つ以上の引数バッファーを使用して呼び出されると、以下のステップが実行されます。
- NewTarget が undefined なら、TypeError例外をスローする
- ? RequireInternalSlot(buffer, [[ArrayBufferData]]) を実行する
- ? ToIndex(byteOffset) を offset とする
- IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
- buffer.[[ArrayBufferByteLength]] を bufferByteLength とする
- offset > bufferByteLength なら RangeError例外をスローする
- byteLength が undefined なら、
- bufferByteLength - offset を viewByteLength とする
- 7. と異なるなら、
- ? OrdinaryCreateFromConstructor(NewTarget, "%DataView.prototype%", « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] ») を O とする
- IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
- buffer を O.[[ViewedArrayBuffer]] にセットする
- viewByteLength を O.[[ByteLength]] にセットする
- offset を O.[[ByteOffset]] にセットする
- O を返す
24.3.3 DataViewコンストラクターのプロパティ(Properties of the DataView Constructor)
DataViewコンストラクターは、次の特徴があります。
- [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
- 以下のプロパティがあります。
24.3.3.1 DataView.prototype
DataView.prototypeの初期値は%DataView.prototype%です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。
24.3.4 DataViewプロトタイプオブジェクトのプロパティ(Properties of the DataView Prototype Object)
DataViewプロトタイプオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%DataViewPrototype%です。
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
- 通常のオブジェクトです。
- [[DataView]]、[[ViewedArrayBuffer]]、[[ByteLength]]、または[[ByteOffset]]の内部スロットがありません。
24.3.4.1 get DataView.prototype.buffer
DataView.prototype.bufferはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を O とする
- ? RequireInternalSlot(O, [[DataView]]) を実行する
- Assert: O は [[ViewedArrayBuffer]] 内部スロットがある
- O.[[ViewedArrayBuffer]] を buffer とする
- buffer を返す
24.3.4.2 get DataView.prototype.byteLength
DataView.prototype.byteLengthはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を O とする
- ? RequireInternalSlot(O, [[DataView]]) を実行する
- Assert: O は [[ViewedArrayBuffer]] 内部スロットがある
- O.[[ViewedArrayBuffer]] を buffer とする
- IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
- O.[[ByteLength]] を size とする
- size を返す
24.3.4.3 get DataView.prototype.byteOffset
DataView.prototype.byteOffsetはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を O とする
- ? RequireInternalSlot(O, [[DataView]]) を実行する
- Assert: O は [[ViewedArrayBuffer]] 内部スロットがある
- O.[[ViewedArrayBuffer]] を buffer とする
- IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
- O.[[ByteOffset]] を offset とする
- offset を返す
24.3.4.4 DataView.prototype.constructor
DataView.prototype.constructorの初期値は%DataView%です。
24.3.4.5 DataView.prototype.getBigInt64 ( byteOffset [ , littleEndian ] )
getBigInt64 が引数 byteOffset と optional argument littleEndian で呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 undefined を littleEndian にセットする
- ? GetViewValue(v, byteOffset, littleEndian, BigInt64) を返す
24.3.4.6 DataView.prototype.getBigUint64 ( byteOffset [ , littleEndian ] )
the getBigUint64 method が引数 byteOffset と optional argument littleEndian で呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 undefined を littleEndian にセットする
- ? GetViewValue(v, byteOffset, littleEndian, BigUint64) を返す
24.3.4.7 DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] )
getFloat32 が引数 byteOffset と オプション littleEndian で呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? GetViewValue(v, byteOffset, littleEndian, Float32) を返す
24.3.4.8 DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] )
getFloat64 が引数 byteOffset と オプション littleEndian で呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? GetViewValue(v, byteOffset, littleEndian, Float64) を返す
24.3.4.9 DataView.prototype.getInt8 ( byteOffset )
getInt8 が引数 byteOffset で呼び出されると、次の手順が実行されます。
- this値 を v とする
- ? GetViewValue(v, byteOffset, true, Int8) を返す
24.3.4.10 DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] )
getInt16 が引数 byteOffset と オプション littleEndian で呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? GetViewValue(v, byteOffset, littleEndian, Int16) を返す
24.3.4.11 DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] )
getInt32 が引数 byteOffset と オプション littleEndian で呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? GetViewValue(v, byteOffset, littleEndian, Int32) を返す
24.3.4.12 DataView.prototype.getUint8 ( byteOffset )
getUint8 が引数 byteOffset で呼び出されると、次の手順が実行されます。
- this値 を v とする
- ? GetViewValue(v, byteOffset, true, Uint8) を返す
24.3.4.13 DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] )
getUint16 が引数 byteOffset とオプション littleEndian で呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? GetViewValue(v, byteOffset, littleEndian, Uint16) を返す
24.3.4.14 DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] )
getUint32 が引数 byteOffset とオプション littleEndian で呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? GetViewValue(v, byteOffset, littleEndian, Uint32) を返す
24.3.4.15 DataView.prototype.setBigInt64 ( byteOffset, value [ , littleEndian ] )
setBigInt64メソッドが引数byteOffsetとvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 undefined を littleEndian にセットする
- ? SetViewValue(v, byteOffset, littleEndian, BigInt64, value) を返す
24.3.4.16 DataView.prototype.setBigUint64 ( byteOffset, value [ , littleEndian ] )
setBigUint64メソッドが引数byteOffsetとvalue、およびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 undefined を littleEndian にセットする
- ? SetViewValue(v, byteOffset, littleEndian, BigUint64, value) を返す
24.3.4.17 DataView.prototype.setFloat32 ( byteOffset, value [ , littleEndian ] )
setFloat32メソッドが引数byteOffsetとvalue、およびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? SetViewValue(v, byteOffset, littleEndian, Float32, value) を返す
24.3.4.18 DataView.prototype.setFloat64 ( byteOffset, value [ , littleEndian ] )
setFloat64メソッドが引数byteOffsetとvalue、およびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? SetViewValue(v, byteOffset, littleEndian, Float64, value) を返す
24.3.4.19 DataView.prototype.setInt8 ( byteOffset, value )
setInt8メソッドが引数byteOffsetおよびvalueを指定して呼び出されると、次の手順が実行されます。
- this値 を v とする
- ? SetViewValue(v, byteOffset, true, Int8, value) を返す
24.3.4.20 DataView.prototype.setInt16 ( byteOffset, value [ , littleEndian ] )
setInt16メソッドが引数byteOffsetとvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? SetViewValue(v, byteOffset, littleEndian, Int16, value) を返す
24.3.4.21 DataView.prototype.setInt32 ( byteOffset, value [ , littleEndian ] )
setInt32メソッドが引数byteOffsetとvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? SetViewValue(v, byteOffset, littleEndian, Int32, value) を返す
24.3.4.22 DataView.prototype.setUint8 ( byteOffset, value )
setUint8メソッドが引数byteOffsetおよびvalueを指定して呼び出されると、次の手順が実行されます。
- this値 を v とする
- ? SetViewValue(v, byteOffset, true, Uint8, value) を返す
24.3.4.23 DataView.prototype.setUint16 ( byteOffset, value [ , littleEndian ] )
setUint16メソッドが引数byteOffsetとvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? SetViewValue(v, byteOffset, littleEndian, Uint16, value) を返す
24.3.4.24 DataView.prototype.setUint32 ( byteOffset, value [ , littleEndian ] )
setUint32メソッドが引数byteOffsetとvalueおよびオプションの引数littleEndianを使用して呼び出されると、次の手順が実行されます。
- this値 を v とする
- littleEndian が 存在しないなら、 false を littleEndian にセットする
- ? SetViewValue(v, byteOffset, littleEndian, Uint32, value) を返す
24.3.4.25 DataView.prototype [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"DataView"です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
24.3.5 DataViewインスタンスのプロパティ(Properties of DataView Instances)
DataViewインスタンスは、DataViewプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。 DataViewインスタンスには、それぞれ[[DataView]]、[[ViewedArrayBuffer]]、[[ByteLength]]、および[[ByteOffset]]の内部スロットがあります。
24.4 Atomicsオブジェクト(The Atomics Object)
Atomicsオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%Atomics%です。
- グローバルオブジェクトの"Atomics"プロパティの初期値です。
- 普通の物です。
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
- [[Construct]]内部メソッドはありません。 new演算子のコンストラクターとして使用することはできません。
- [[Call]]内部メソッドはありません。 関数として呼び出すことはできません。
Atomicsオブジェクトは、共有メモリ配列セル上で分割不可能に(原子的に)動作する関数と、エージェントがプリミティブイベントを待機してディスパッチできるようにする関数を提供します。 Atomics関数を規律とともに使用すると、共有メモリを介して通信するマルチエージェントプログラムを、並列CPUでも十分に理解した順序で実行できます。 共有メモリ通信の管理ルールは、以下に定義されているメモリモデルによって提供されます。
24.4.1 Atomicsの抽象演算(Abstract Operations for Atomics)
24.4.1.1 ValidateSharedIntegerTypedArray ( typedArray [ , waitable ] )
抽象操作ValidateSharedIntegerTypedArrayは、1つの引数typedArrayとオプションのブール waitableを取ります。 次の手順を実行します。
- waitable が 存在しないなら、 false を waitable にセットする
- ? RequireInternalSlot(typedArray, [[TypedArrayName]]) を実行する
- typedArray.[[TypedArrayName]] を typeName とする
- 表61で、 typeNameに対応する要素タイプを type とする
- waitable が true なら、
- typeName が "Int32Array" または "BigInt64Array" でないなら、TypeError例外をスローする
- 5. と異なるなら、
- ! IsUnclampedIntegerElementType(type) が false で ! IsBigIntElementType(type) が false なら、TypeError例外をスローする
- Assert: typedArray は [[ViewedArrayBuffer]] 内部スロットがある
- typedArray.[[ViewedArrayBuffer]] を buffer とする
- IsSharedArrayBuffer(buffer) が false なら、TypeError例外をスローする
- buffer を返す
24.4.1.2 ValidateAtomicAccess ( typedArray, requestIndex )
抽象操作ValidateAtomicAccessは、typedArrayとrequestIndexの2つの引数を取ります。 次の手順を実行します。
24.4.1.3 GetWaiterList ( block, i )
WaiterList
WaiterListは、共有メモリ内の場所(block、i)で待機しているエージェントの順序付きリストを含むセマンティックオブジェクトです。blockは共有データブロックです。iはblockのメモリへのバイトオフセットです。 WaiterListオブジェクトには、オプションで、クリティカルセクションの前の終了を示すSynchronizeイベントも含まれます。
初期状態のWaiterListオブジェクトには空のリストを所持し、Synchronizeイベントがありません。
エージェントクラスタには、WaiterListオブジェクトのストアがあります。ストアは(block、i)でインデックス付けされます。 WaiterListsはエージェントに依存しません。(block、i)によるWaiterListsのストアのルックアップは、エージェントクラスタ内の任意のエージェントで同じWaiterListオブジェクトになります。
クリティカルセクション
各WaiterListには、評価中にそのWaiterListへの排他的アクセスを制御するクリティカルセクションがあります。一度に一つのエージェントだけがWaiterListのクリティカルセクションに入ることができます。 WaiterListのクリティカルセクションへの出入りは、抽象演算EnterCriticalSectionおよびLeaveCriticalSectionによって制御されます。 WaiterListの操作(待機中のエージェントの追加と削除、エージェントのリストのトラバース、リスト上のエージェントの一時停止と通知、Synchronizeイベントの設定と取得)は、WaiterListのクリティカルセクションに入ったエージェントのみが実行できます。
抽象操作GetWaiterListは、 引数 共有データブロック block と 非負の整数 i をとります。次の手順を実行します。
- Assert: block は 共有データブロック
- Assert: i で i + 3 はblockのメモリ内で有効なバイトオフセット
- Assert: i は4で割り切れる
- (block, i) で参照される WaiterList を返す
24.4.1.4 EnterCriticalSection ( WL )
抽象操作EnterCriticalSection は引数 WaiterList WL をとります。次の手順を実行します。
- Assert: 呼び出し元のエージェントは、WaiterListのクリティカルセクションにない
- WLのクリティカルセクションにエージェントがなくなるまで待っち、WLのクリティカルセクションに入る(他のエージェントが入ることを許可しない)
- WL が Synchronizeイベント を持っているなら、
- NOTE: クリティカルセクションに少なくとも1回入ったWLには、LeaveCriticalSectionによって設定されたSynchronizeイベントがある
- 周囲のエージェント の エージェントレコード の [[CandidateExecution]] フィールド を execution とする
- [[AgentSignifier]] と AgentSignifier() が同値である execution.[[EventsRecords]] の エージェントイベントレコード を eventsRecord とする
- eventsRecord.[[EventList]] を entererEventList とする
- 新規 Synchronizeイベント を enterEvent とする
- entererEventList に enterEvent を追加する
- WL の Synchronizeイベント を leaveEvent とする
- eventsRecord に (leaveEvent, enterEvent) を追加する[[AgentSynchronizesWith]]
EnterCriticalSectionは、クリティカルセクションに入ろうとしているエージェントが、別のエージェントがクリティカルセクションから離れるのを待たなければならないときに競合が発生します。 競合がない場合、EnterCriticalSection呼び出しのFIFO順序を監視できます。 競合がある場合、実装は任意の順序を選択できます。ただしエージェントが無期限に待機することはありません。
24.4.1.5 LeaveCriticalSection ( WL )
抽象操作LeaveCriticalSection は引数 WaiterList WL をとります。次の手順を実行します。
- Assert: 呼び出し元の エージェント は、WL の クリティカルセクション にある
- 呼び出し元の周囲の エージェントレコード の [[CandidateExecution]] フィールドを execution とする
- [[AgentSignifier]] と AgentSignifier() が同値である execution.[[EventsRecords]] の エージェントイベントレコード を eventsRecord とする
- eventsRecord.[[EventList]] を leaverEventList とする
- 新規 Synchronizeイベント を leaveEvent とする
- leaverEventList に leaveEvent を追加する
- leaveEvent を WL の Synchronizeイベント にセットする
- WLのクリティカルセクションはそのままにしておく
24.4.1.6 AddWaiter ( WL, W )
抽象操作AddWaiterは引数 WaiterList WL と エージェント を指し示す W をとります。次の手順を実行します。
- Assert: 呼び出し元の エージェント は、WL の クリティカルセクション にある
- Assert: W は どのWaiterListのウェイターのリストにも含まれていない
- WL のウェイターのリストの最後に W を追加する
24.4.1.7 RemoveWaiter ( WL, W )
抽象操作RemoveWaiterは引数 WaiterList WL と エージェント を指し示す W をとります。次の手順を実行します。
- Assert: 呼び出し元の エージェント は、WL の the クリティカルセクション にある
- Assert: W は WL のウェイターのリストにある
- WLW を削除する
24.4.1.8 RemoveWaiters ( WL, c )
抽象操作RemoveWaitersは引数 WaiterList WL と非負の整数 c をとります。次の手順を実行します。
- Assert: 呼び出し元の エージェント は、WL の クリティカルセクション にある
- 空の新規List を L とする
- WL のウェイターのリストへの参照を S とする
- c > 0 で S が empty リストでない間繰り返し
- S の最初のウェイターを W とする
- L の最後に W を追加する
- SW を削除する
- c - 1 を c にセットする
- L を返す
24.4.1.9 Suspend ( WL, W, timeout )
抽象操作Suspendは引数 WaiterList WL、 エージェント を指し示す W、非負でNaNではないNumber timeout をとります。次の手順を実行します。
- Assert: 呼び出し元の エージェント は、WL の the クリティカルセクション にある
- Assert: W と AgentSignifier() は等しい
- Assert: W は WL のウェイターのリストにある
- Assert: AgentCanSuspend() は true
- LeaveCriticalSection(WL)を実行する。span class="t">timeoutミリ秒までWを一時停止する。クリティカルセクションが終了した後、一時停止が有効になる前に受け取った通知が失われない方法で、結合された操作を実行する。 Wは、タイムアウトが期限切れになったか、NotifyWaiter(WL, W)を呼び出す別のエージェントによって明示的に通知されたために、それ以外の理由で通知を行う必要はない
- EnterCriticalSection(WL) を実行する
- NotifyWaiter(WL, W) を呼び出す別のエージェントから W に明示的に通知されたなら true を返す
- false を返す
24.4.1.10 NotifyWaiter ( WL, W )
抽象操作NotifyWaiterは引数 WaiterList WL と エージェント を指し示す W をとります。次の手順を実行します。
- Assert: 呼び出し元の エージェント は、WL の クリティカルセクション にある
- エージェント W に通知する
24.4.1.11 AtomicReadModifyWrite ( typedArray, index, value, op )
抽象演算AtomicReadModifyWriteは、typedArray、index、value、および純粋な結合演算opの4つの引数を取ります。 純粋な結合操作opは、2つのバイト値のリスト引数を取り、バイト値のリストを返します。 この操作は値をアトミックにロードし、それを別の値と組み合わせて、組み合わせの結果を格納します。 ロードされた値を返します。 次の手順を実行します。
- ? ValidateSharedIntegerTypedArray(typedArray) を buffer とする
- ? ValidateAtomicAccess(typedArray, index) を i とする
- typedArray.[[TypedArrayName]] を arrayTypeName とする
- typedArray.[[ContentType]] が BigInt なら、 ? ToBigInt(value) を v とする
- 異なるなら ? ToInteger(value) を v とする
- 表61で、arrayTypeName に対応する要素サイズを elementSize とする
- 表61で、arrayTypeName に対応する要素タイプを elementType とする
- typedArray.[[ByteOffset]] を offset とする
- (i × elementSize) + offset を indexedPosition とする
- GetModifySetValueInBuffer(buffer, indexedPosition, elementType, v, op) を返す
24.4.1.12 AtomicLoad ( typedArray, index )
抽象操作AtomicLoadは、typedArray、indexの2つの引数を取ります。 この操作は、値をアトミックにロードし、ロードされた値を返します。 次の手順を実行します。
- ? ValidateSharedIntegerTypedArray(typedArray) を buffer とする
- ? ValidateAtomicAccess(typedArray, index) を i とする
- typedArray.[[TypedArrayName]] を arrayTypeName とする
- 表61で、arrayTypeName に対応する要素サイズを elementSize とする
- 表61で、arrayTypeName に対応する要素タイプを elementType とする
- typedArray.[[ByteOffset]] を offset とする
- (i × elementSize) + offset を indexedPosition とする
- GetValueFromBuffer(buffer, indexedPosition, elementType, true, SeqCst) を返す
24.4.2 Atomics.add ( typedArray, index, value )
addは、バイト値のリスト引数に対応する数値に加算演算を適用し、その演算の結果に対応するバイト値のリストを返す2つのバイト値リスト引数のセマンティック関数を示します。
次の手順が実行されます。
- ? AtomicReadModifyWrite(typedArray, index, value, add) を返す
24.4.3 Atomics.and ( typedArray, index, value )
ビット単位および演算を2つの引数に適用し、その演算の結果に対応するバイト値のリストを返す、2つのバイト値リスト引数のセマンティック関数を示します。
次の手順が実行されます。
- ? AtomicReadModifyWrite(typedArray, index, value, and) を返す
24.4.4 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue )
次の手順が実行されます。
- ? ValidateSharedIntegerTypedArray(typedArray) を buffer とする
- ? ValidateAtomicAccess(typedArray, index) を i とする
- typedArray.[[TypedArrayName]] を arrayTypeName とする
- typedArray.[[ContentType]] が BigInt なら、
- 4. と異なるなら、
- 表61で、arrayTypeName に対応する要タイプを elementType とする
- 周囲のエージェント の エージェントレコード の [[LittleEndian]] フィールドの値を isLittleEndian とする
- NumericToRawBytes(elementType, expected, isLittleEndian) を expectedBytes とする
- arrayTypeName に対応する要素サイズを elementSize とする
- typedArray.[[ByteOffset]] を offset とする
- (i × elementSize) + offset を indexedPosition とする
- 最初の引数が要素ごとにexpectedBytesと等しいなら、2番目の引数を返す2つのバイト値リスト引数のセマンティック関数を compareExchange とする
- GetModifySetValueInBuffer(buffer, indexedPosition, elementType, replacement, compareExchange) を返す
24.4.5 Atomics.exchange ( typedArray, index, value )
secondは、2番目の引数を返す2つのバイト値リスト引数のセマンティック関数を示します。
次の手順が実行されます。
- ? AtomicReadModifyWrite(typedArray, index, value, second) を返す
24.4.6 Atomics.isLockFree ( size )
次の手順が実行されます。
- ? ToInteger(size) を n とする
- 周囲のエージェント の エージェントレコード を AR とする
- n イコール 1 なら AR.[[IsLockFree1]] を返す
- If n イコール 2 なら AR.[[IsLockFree2]] を返す
- If n イコール 4 なら true を返す
- If n イコール 8 なら AR.[[IsLockFree8]] を返す
- false を返す
Atomics.isLockFree(4)は、関連するすべての既知のハードウェアでサポートできるため、常にtrueを返します。 これを想定できると、一般的にプログラムが簡素化されます。
Atomics.isLockFreeの値に関係なく、すべてのアトミック操作はアトミックであることが保証されています。 たとえば、操作の途中で目に見える操作が行われることはありません("tearing"など)。
24.4.7 Atomics.load ( typedArray, index )
次の手順が実行されます。
- ? AtomicLoad(typedArray, index) を返す
24.4.8 Atomics.or ( typedArray, index, value )
orは、ビット単位または演算要素単位で2つの引数に適用され、その演算の結果に対応するバイト値のリストを返す2つのバイト値リスト引数のセマンティック関数を表します。
次の手順が実行されます。
- ? AtomicReadModifyWrite(typedArray, index, value, or) を返す
24.4.9 Atomics.store ( typedArray, index, value )
次の手順が実行されます。
- ? ValidateSharedIntegerTypedArray(typedArray) を buffer とする
- ? ValidateAtomicAccess(typedArray, index) を i とする
- typedArray.[[TypedArrayName]] を arrayTypeName とする
- arrayTypeName が "BigUint64Array" または "BigInt64Array" なら、 ? ToBigInt(value) を v とする
- 異なるなら ? ToInteger(value) を v とする
- 表61で、arrayTypeName に対応する要素サイズを elementSize とする
- 表61で、arrayTypeName に対応する要素タイプを elementType とする
- typedArray.[[ByteOffset]] を offset とする
- (i × elementSize) + offset を indexedPosition とする
- SetValueInBuffer(buffer, indexedPosition, elementType, v, true, SeqCst) を実行する
- v を返す
24.4.10 Atomics.sub ( typedArray, index, value )
subtractは、2つのバイト値リスト引数のセマンティック関数を示します。これは、バイト値リスト引数に対応する数値に減算演算を適用し、その演算の結果に対応するバイト値リストを返します。
次の手順が実行されます。
- ? AtomicReadModifyWrite(typedArray, index, value, subtract) を返す
24.4.11 Atomics.wait ( typedArray, index, value, timeout )
Atomics.waitは、呼び出し元のエージェントを待機キューに入れ、通知されるかタイムアウトするまでスリープ状態にします。
次の手順が実行されます。
- ? ValidateSharedIntegerTypedArray(typedArray, true) を buffer とする
- ? ValidateAtomicAccess(typedArray, index) を i とする
- typedArray.[[TypedArrayName]] を arrayTypeName とする
- arrayTypeName が "BigInt64Array" なら、 ? ToBigInt64(value) を v とする
- 異なるなら ? ToInt32(value) を v とする
- ? ToNumber(timeout) を q とする
- q が NaN なら、 +∞ を、異なるなら max(q, 0) を t とする
- AgentCanSuspend() を B とする
- B が false なら、TypeError例外をスローする
- buffer.[[ArrayBufferData]] を block とする
- typedArray.[[ByteOffset]] を offset とする
- 表61で、arrayTypeName に対応する要素サイズを elementSize とする
- (i × elementSize) + offset を indexedPosition とする
- GetWaiterList(block, indexedPosition) を WL とする
- EnterCriticalSection(WL) を実行する
- ! AtomicLoad(typedArray, i) を w とする
- v が equal to w でないなら、
- LeaveCriticalSection(WL) を実行する
- 文字列 "not-equal" を返す
- AgentSignifier() を W とする
- AddWaiter(WL, W) を実行する
- Suspend(WL, W, t) を notified とする
- notified が true なら、
- Assert: W は WL のウェイターのリストに含まれていない
- 21. と異なるなら、
- RemoveWaiter(WL, W) を実行する
- LeaveCriticalSection(WL) を実行する
- notified が true なら、 文字列 "ok" を返す
- 文字列 "timed-out" を返す
24.4.12 Atomics.notify ( typedArray, index, count )
Atomics.notifyは、待機キューでスリープしているエージェントに通知します。 次の手順が実行されます。
次の手順が実行されます。
- ? ValidateSharedIntegerTypedArray(typedArray, true) を buffer とする
- ? ValidateAtomicAccess(typedArray, index) を i とする
- count が undefined なら、 +∞ を c とする
- 3. と異なるなら、
- buffer.[[ArrayBufferData]] を block とする
- typedArray.[[ByteOffset]] を offset とする
- typedArray.[[TypedArrayName]] を arrayTypeName とする
- 表61で、arrayTypeName に対応する要素サイズを elementSize とする
- (i × elementSize) + offset を indexedPosition とする
- GetWaiterList(block, indexedPosition) を WL とする
- 0 を n とする
- EnterCriticalSection(WL) を実行する
- RemoveWaiters(WL, c) を S とする
- S が empty リストでない間繰り返し
- S の最初の エージェント を W とする
- SW を削除する
- NotifyWaiter(WL, W) を実行する
- n + 1 を n にセットする
- LeaveCriticalSection(WL) を実行する
- n を返す
24.4.13 Atomics.xor ( typedArray, index, value )
xorは、ビット単位のxor演算を2つの引数に要素単位で適用し、その演算の結果に対応するバイト値のリストを返す2つのバイト値リスト引数のセマンティック関数を表します。
次の手順が実行されます。
- ? AtomicReadModifyWrite(typedArray, index, value, xor) を返す
24.4.14 Atomics [ @@toStringTag ]
@@ toStringTagプロパティの初期値は、文字列値"Atomics"です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
24.5 JSONオブジェクト(The JSON Object)
JSONオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%JSON%です。
- グローバルオブジェクトの"JSON"プロパティの初期値です。
- 通常のオブジェクトです。
- JSONテキストの解析と構築に使用されるparseとstringifyの2つの関数が含まれています。
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
- [[Construct]]内部メソッドはありません。 new演算子のコンストラクターとして使用することはできません。
- [[Call]]内部メソッドはありません。 関数として呼び出すことはできません。
JSONデータ交換フォーマットはECMA-404で定義されています。 この仕様で使用されているJSON交換形式は、ECMA-404で説明されている形式とまったく同じです。 JSON.parseおよびJSON.stringifyの適合実装は、フォーマットの削除または拡張なしで、ECMA-404仕様に記述されている正確な交換フォーマットをサポートする必要があります。
24.5.1 JSON.parse ( text [ , reviver ] )
parse関数は、JSONテキスト(JSON形式の文字列)を解析し、ECMAScript値を生成します。 JSON形式は、ECMAScriptリテラル、配列イニシャライザー、およびオブジェクトイニシャライザーの構文と同様の構文で、リテラル、配列、およびオブジェクトを表します。 解析後、JSONオブジェクトはECMAScriptオブジェクトとして実現されます。 JSON配列は、ECMAScript配列インスタンスとして実現されます。 JSON文字列、数値、ブール値、およびnullは、ECMAScript文字列、数値、ブール値、およびnullとして認識されます。
オプションのreviverは、キーと値の2つのパラメーターを受け取る関数です。 これにより、結果をフィルタリングおよび変換できます。 これは、解析によって生成されたキーと値のペアのそれぞれで呼び出され、元の値の代わりにその戻り値が使用されます。 受信したものを返す場合、構造は変更されません。 undefinedが返される場合、プロパティは結果から削除されます。
- ? ToString(text) を jsonString とする
- ECMA-404で指定されているように、JSONテキストとして ! UTF16DecodeString(jsonString)を解析する。 有効なJSONテキストでないなら、SyntaxError例外をスローする
- "(" と jsonString と ");" の文字列連結を scriptString とする
- ECMAScriptスクリプトのソーステキストとして ! UTF16DecodeString(scriptString) を解析および評価した結果を completion とする。 評価中にB.3.1で定義されている拡張PropertyDefinitionEvaluationセマンティクスを、使用してはいけない
- completion.[[Value]] を unfiltered とする
- Assert: unfiltered は String、Number、Boolean、Null か、ArrayLiteral または ObjectLiteral によって定義されたオブジェクト
- IsCallable(reviver) が true なら、
- OrdinaryObjectCreate(%Object.prototype%) を root とする
- empty String を rootName とする
- ! CreateDataPropertyOrThrow(root, rootName, unfiltered) を実行する
- ? InternalizeJSONProperty(root, rootName, reviver) を返す
- 7. と異なるなら、
- unfiltered を返す
この関数は、%JSONParse%組み込みオブジェクトです。
この関数の "length"プロパティは 2 です。
24.5.1.1 ランタイムセマンティクス(Runtime Semantics): InternalizeJSONProperty ( holder, name, reviver )
抽象演算InternalizeJSONPropertyは、オブジェクト holder、そのオブジェクト内のプロパティの文字列name、およびreviver関数の3つのパラメーターを受け取る再帰的な抽象演算です。
- ? Get(holder, name) を val とする
- Type(val) が Object型 なら、
- ? IsArray(val) を isArray とする
- isArray が true なら、
- 0 を I とする
- ? LengthOfArrayLike(val) を len とする
- I < len の間繰り返し
- ? InternalizeJSONProperty(val, ! ToString(I), reviver) を newElement とする
- newElement が undefined なら、
- ? val.[[Delete]](! ToString(I)) を実行する
- 2. と異なるなら、
- ? CreateDataProperty(val, ! ToString(I), newElement) を実行する
- I + 1 を I にセットする
- b. と異なるなら、
- ? EnumerableOwnPropertyNames(val, key) を keys とする
- keys の 各 String要素を P とし、 P ごとに次を実行する
- ? InternalizeJSONProperty(val, P, reviver) を newElement とする
- newElement が undefined なら、
- ? val.[[Delete]](P) を実行する
- 2. と異なるなら、
- ? CreateDataProperty(val, P, newElement) を実行する
- ? Call(reviver, holder, « name, val ») を返す
適合実装では、JSON.parseでJSON文法を拡張してはいません。 変更または拡張されたJSON交換形式をサポートしたい場合は、別の解析関数を定義する必要があります。
24.5.2 JSON.stringify ( value [ , replacer [ , space ] ] )
stringify関数は、ECMAScript値またはundefinedを表すUTF-16エンコードされたJSON形式の文字列を返します。 3つのパラメータを取ることができます。 valueパラメーターはECMAScript値であす。通常はオブジェクトまたは配列ですが、String、Boolean、Number、またはnullの場合があります。 オプションのreplacerパラメーターは、オブジェクトと配列の文字列化の方法を変更する関数、または文字列化されるオブジェクトプロパティを選択するための包含リストとして機能する文字列と数値の配列のいずれかです。 オプションのspaceパラメータは文字列または数値です。これにより、人が読みやすいように結果に空白を挿入することができます。
- 空の新規List を stack とする
- empty String を indent とする
- undefined を PropertyList と ReplacerFunction とする
- Type(replacer) が Object型 なら、
- IsCallable(replacer) が true なら、
- replacer を ReplacerFunction にセットする
- a. と異なるなら、
- ? IsArray(replacer) を isArray とする
- isArray が true なら、
- 空の新規List を PropertyList にセットする
- ? LengthOfArrayLike(replacer) を len とする
- 0 を k とする
- k < len の間繰り返し
- IsCallable(replacer) が true なら、
- Type(space) が Object型 なら、
- Type(space) が Number型 なら、
- 6. と異なり、 Type(space) が String型 なら、
- space の長さが 10 以下なら、 space を、異なるなら space の最初の10個のコードユニットを gap とする
- 7. と異なるなら、
- empty String を gap とする
- OrdinaryObjectCreate(%Object.prototype%) を wrapper とする
- ! CreateDataPropertyOrThrow(wrapper, empty String, value) を実行する
- Record { [[ReplacerFunction]]: ReplacerFunction, [[Stack]]: stack, [[Indent]]: indent, [[Gap]]: gap, [[PropertyList]]: PropertyList } を state とする
- ? SerializeJSONProperty(state, empty String, wrapper) を返す
この関数は、%JSONStringify%組み込みオブジェクトです。
の関数の "length"プロパティは 3 です。
次の例は、文字列化できない値の例です。
a = [];
a[0] = a;
my_text = JSON.stringify(a); // This must throw a TypeError.
- null値は、文字列"null"
- The undefined値は、はレンダリングされません。
- The true値は、 文字列"true"
- The false値は、 文字列"false"
Mojiretsu-chi wa QUOTATIONMARK ( ") kōdo t
24.5.2.1 ランタイムセマンティクス(Runtime Semantics): SerializeJSONProperty ( state, key, holder )
引数state、key、holderを指定した抽象操作SerializeJSONPropertyは、次の手順を実行します。
- ? Get(holder, key) を value とする
- Type(value) が Object型 か BigInt型 なら、
- state.[[ReplacerFunction]] が undefined でないなら、
- Type(value) が Object型 なら、
- value に [[NumberData]] 内部スロットがあるなら、
- a. と異なり、 value に [[StringData]] 内部スロットがあるなら、
- b. と異なり、 value に [[BooleanData]] 内部スロットがあるなら、
- value.[[BooleanData]] を value にセットする
- c. と異なり、 value に [[BigIntData]] 内部スロットがあるなら、
- value.[[BigIntData]] を value にセットする
- value が null なら、 "null" を返す
- value が true なら、 "true" を返す
- value が false なら、 "false" を返す
- Type(value) が String型 なら、 QuoteJSONString(value) を返す
- Type(value) が Number型 なら、
- Type(value) が BigInt なら、TypeError例外をスローする
- Type(value) が Object で、 IsCallable(value) が false なら、
- ? IsArray(value) を isArray とする
- isArray が true なら、 ? SerializeJSONArray(state, value) を返す
- ? SerializeJSONObject(state, value) を返す
- undefined を返す
24.5.2.2 ランタイムセマンティクス(Runtime Semantics): QuoteJSONString ( value )
引数valueを持つ抽象演算QuoteJSONStringは、文字列値をQUOTATION MARKコードユニットでラップし、特定のコード単位をエスケープします。
この操作は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。
- コードユニット 0x0022(QUOTATION MARK)のみで構成される文字列値を product とする
- ! UTF16DecodeString(value) の 各 コードポイント要素を C とし、 C ごとに次を実行する
- C が 表64の「コードポイント」にあるなら、
- product と C に対応する「エスケープシーケンス」 の文字列連結を product にセットする
- a. と異なり、 C が 0x0020 (SPACE) 未満、または、 C の値が上位サロゲートまたは下位サロゲート なら、
- 数値がC の コードユニットを unit とする
- product と UnicodeEscape(unit) の文字列連結を product にセット
- b. と異なるなら、
- product と C の UTF16Encoding の文字列連結を product にセット
- C が 表64の「コードポイント」にあるなら、
- product と コードユニット 0x0022 (QUOTATION MARK) の文字列連結を product にセット
- product を返す
コードポイント | ユニコード文字名 | エスケープシーケンス |
---|---|---|
U+0008 | BACKSPACE | \b |
U+0009 | CHARACTER TABULATION | \t |
U+000A | LINE FEED (LF) | \n |
U+000C | FORM FEED (FF) | \f |
U+000D | CARRIAGE RETURN (CR) | \r |
U+0022 | QUOTATION MARK | \" |
U+005C | REVERSE SOLIDUS | \\ |
24.5.2.3 ランタイムセマンティクス(Runtime Semantics): UnicodeEscape ( C )
抽象演算UnicodeEscapeは、引数コードユニットCを取り、それをUnicodeエスケープシーケンスとして表します。
- C の数値を n とする
- Assert: n ≦ 0xFFFF
- 以下の文字連結を返す
- コードユニット 0x005C (REVERSE SOLIDUS)
- "u"
- 4桁の小文字の16進数(ゼロ埋め)でフォーマットしたnの文字列表現
24.5.2.4 ランタイムセマンティクス(Runtime Semantics): SerializeJSONObject ( state, value )
引数stateとvalueを持つ抽象操作SerializeJSONObjectは、オブジェクトをシリアル化します。
次の手順を実行します。
- state.[[Stack]] が value を含んでいるなら TypeError例外をスローする(構造が循環的であるため)
- state に value を追加する[[Stack]]
- state.[[Indent]] を stepback とする
- state.[[Indent]] とstate.[[Gap]] の文字列連結を state.[[Indent]] にセットする
- state.[[PropertyList]] が undefined でないなら、
- state.[[PropertyList]] を K とする
- 5. と異なるなら、
- ? EnumerableOwnPropertyNames(value, key) を K とする
- 空の新規List を partial とする
- K の 各要素を P とし、P ごとに次を実行する
- ? SerializeJSONProperty(state, P, value) を strP とする
- strP が undefined でないなら、
- QuoteJSONString(P) を member とする
- member と ":" の文字列連結を member にセットする
- state.[[Gap]] が empty String でないなら、
- member と コードユニット 0x0020 (SPACE) の文字列連結を member にセットする
- member と strP の文字列連結を member にセットする
- partial に member を追加する
- partial が empty なら、
- "{}" を final とする
- 9. と異なるなら、
- state.[[Gap]] が empty String なら、
- partial の文字列要素を コードユニット 0x002C (COMMA)で連結した文字列を properties とする。ただし、最初と最後には 0x002C を挿入しない
- "{" と properties と "}" の文字列連結を final とする
- a. と異なるなら、
- コードユニット 0x002C (COMMA) と コードユニット 0x000A (LINE FEED) と state の文字列連結を [[Indent]] を separator とする
- partial の文字列要素を separator で連結した文字列を properties とする。ただし、最初と最後には separator を挿入しない
- "{" と コードユニット 0x000A (LINE FEED) と state.[[Indent]] と properties と コードユニット 0x000A (LINE FEED) と stepback と "}" の文字連結を final とする
- state.[[Gap]] が empty String なら、
- state.[[Stack]] の最後の要素を削除する
- stepback を state.[[Indent]] にセットする
- final を返す
24.5.2.5 ランタイムセマンティクス(Runtime Semantics): SerializeJSONArray ( state, value )
引数stateとvalueを持つ抽象操作SerializeJSONArrayは、配列をシリアル化します。
次の手順を実行します。
- state.[[Stack]] が value を含むなら TypeError例外をスローする(構造が循環的であるため)
- state.[[Stack]] に value を追加する
- state.[[Indent]] を stepback とする
- state.[[Indent]] と state.[[Gap]] の文字連結を state.[[Indent]] にセットする
- 空の新規List を partial とする
- ? LengthOfArrayLike(value) を len とする
- 0 を index とする
- index < len の間繰り返し
- ? SerializeJSONProperty(state, ! ToString(index), value) を strP とする
- strP が undefined なら、
- partial に "null" を追加する
- b. と異なるなら、
- partial に strP を追加する
- index + 1 を index にセットする
- partial が empty なら、
- "[]" を final とする
- 9. と異なるなら、
- state.[[Gap]] が empty String なら、
- partial の文字列要素を コードユニット 0x002C (COMMA) で連結した文字列を properties とする。ただし 0x002Cは、最初と最後には挿入しない
- "[" と properties と "]" の文字連結を final とする
- a. と異なるなら、
- コードユニット 0x002C (COMMA) と コードユニット 0x000A (LINE FEED) と state.[[Indent]] の文字連結を separator とする
- partial の文字列要素を separator で連結した文字列を properties とする。ただし separatorは、最初と最後には挿入しない
- "[" と コードユニット 0x000A (LINE FEED) と state.[[Indent]] と properties と コードユニット 0x000A (LINE FEED) と stepback と "]" の文字連結を final とする
- state.[[Gap]] が empty String なら、
- state.[[Stack]] の最後の要素を削除する
- stepback を state.[[Indent]] にセットする
- final を返す
24.5.3 JSON [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"JSON"です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。