25 構造化データ

25.1 ArrayBufferオブジェクト

25.1.1 表記

この節、25.4、および 29 の以下の記述では、read-modify-write変更関数の内部データ構造を使用します。

read-modify-write変更関数とは、2つのバイト値のListを引数として受け取り、バイト値のListを返すAbstract Closureとして表される数学的関数です。これらのAbstract Closureは、次のすべての性質を満たします:

  • すべてのアルゴリズム手順を原子的に実行する。
  • 個々のアルゴリズム手順は観察可能でない。
Note

read-modify-write変更関数のアルゴリズム手順が純粋な数学的関数を構成することの検証を助けるため、次の編集上の慣例が推奨されます:

  • パラメーターおよび捕捉された値を除き、直接にも、呼び出された抽象操作およびAbstract Closureを介して推移的にも、いかなる言語値または仕様値にもアクセスしない。
  • Completion Recordを返す抽象操作およびAbstract Closureを、直接にも推移的にも呼び出さない。
  • Completion Recordを返さない。

25.1.2 固定長およびサイズ変更可能なArrayBufferオブジェクト

固定長ArrayBufferとは、作成後にバイト長を変更できないArrayBufferです。

サイズ変更可能なArrayBufferとは、作成後に ArrayBuffer.prototype.resize ( newLength ) を呼び出すことによってバイト長を変更できるArrayBufferです。

作成されるArrayBufferオブジェクトの種類は、ArrayBuffer ( length [ , options ] ) に渡される引数に依存します。

25.1.3 ArrayBufferオブジェクトのための抽象操作

25.1.3.1 AllocateArrayBuffer ( constructor, byteLength [ , maxByteLength ] )

The abstract operation AllocateArrayBuffer takes arguments constructor (コンストラクター) and byteLength (非負整数) and optional argument maxByteLength (非負整数または empty) and returns ArrayBufferを含む正常完了またはスロー完了のいずれか. ArrayBufferを作成するために使用されます。 It performs the following steps when called:

  1. Let slots be « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] ».
  2. If maxByteLength is present and maxByteLength is not empty, let allocatingResizableBuffer be true; else let allocatingResizableBuffer be false.
  3. If allocatingResizableBuffer is true, then
    1. If byteLength > maxByteLength, throw a RangeError exception.
    2. Append [[ArrayBufferMaxByteLength]] to slots.
  4. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", slots).
  5. Let block be ? CreateByteDataBlock(byteLength).
  6. Set obj.[[ArrayBufferData]] to block.
  7. Set obj.[[ArrayBufferByteLength]] to byteLength.
  8. If allocatingResizableBuffer is true, then
    1. If it is not possible to create a Data Block block consisting of maxByteLength bytes, throw a RangeError exception.
    2. NOTE: Resizable ArrayBuffers are designed to be implementable with in-place growth. Implementations may throw if, for example, virtual memory cannot be reserved up front.
    3. Set obj.[[ArrayBufferMaxByteLength]] to maxByteLength.
  9. Return obj.

25.1.3.2 ArrayBufferByteLength ( arrayBuffer, order )

The abstract operation ArrayBufferByteLength takes arguments arrayBuffer (ArrayBufferまたはSharedArrayBuffer) and order (seq-cst または unordered) and returns 非負整数. It performs the following steps when called:

  1. IsGrowableSharedArrayBuffer(arrayBuffer) が true の場合、
    1. bufferByteLengthBlockarrayBuffer.[[ArrayBufferByteLengthData]] とする。
    2. rawLengthGetRawBytesFromSharedBlock(bufferByteLengthBlock, 0, biguint64, true, order) とする。
    3. agentRecord を周囲のエージェントのAgent Recordとする。
    4. isLittleEndianagentRecord.[[LittleEndian]] とする。
    5. (RawBytesToNumeric(biguint64, rawLength, isLittleEndian)) を返す。
  2. Assert: IsDetachedBuffer(arrayBuffer) は false である。
  3. arrayBuffer.[[ArrayBufferByteLength]] を返す。

25.1.3.3 ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability )

The abstract operation ArrayBufferCopyAndDetach takes arguments arrayBuffer (ECMAScript言語値), newLength (ECMAScript言語値), and preserveResizability (preserve-resizability または fixed-length) and returns ArrayBufferを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]) を実行する。
  2. IsSharedArrayBuffer(arrayBuffer) が true の場合、TypeError 例外をスローする。
  3. newLengthundefined の場合、
    1. newByteLengtharrayBuffer.[[ArrayBufferByteLength]] とする。
  4. そうでなければ、
    1. newByteLength を ? ToIndex(newLength) とする。
  5. IsDetachedBuffer(arrayBuffer) が true の場合、TypeError 例外をスローする。
  6. preserveResizabilitypreserve-resizability であり、IsFixedLengthArrayBuffer(arrayBuffer) が false である場合、
    1. newMaxByteLengtharrayBuffer.[[ArrayBufferMaxByteLength]] とする。
  7. そうでなければ、
    1. newMaxByteLengthempty とする。
  8. arrayBuffer.[[ArrayBufferDetachKey]]undefined でない場合、TypeError 例外をスローする。
  9. newBuffer を ? AllocateArrayBuffer(%ArrayBuffer%, newByteLength, newMaxByteLength) とする。
  10. copyLengthmin(newByteLength, arrayBuffer.[[ArrayBufferByteLength]]) とする。
  11. fromBlockarrayBuffer.[[ArrayBufferData]] とする。
  12. toBlocknewBuffer.[[ArrayBufferData]] とする。
  13. CopyDataBlockBytes(toBlock, 0, fromBlock, 0, copyLength) を実行する。
  14. NOTE: 新しいData Blockの作成も古いData Blockからのコピーも観察可能ではありません。実装はこのメソッドをゼロコピー移動またはreallocとして実装してもよいです。
  15. DetachArrayBuffer(arrayBuffer) を実行する。
  16. newBuffer を返す。

25.1.3.4 IsDetachedBuffer ( arrayBuffer )

The abstract operation IsDetachedBuffer takes argument arrayBuffer (ArrayBufferまたはSharedArrayBuffer) and returns Boolean. It performs the following steps when called:

  1. arrayBuffer.[[ArrayBufferData]]null の場合、true を返す。
  2. false を返す。

25.1.3.5 DetachArrayBuffer ( arrayBuffer [ , key ] )

The abstract operation DetachArrayBuffer takes argument arrayBuffer (ArrayBuffer) and optional argument key (任意) and returns unused を含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. Assert: IsSharedArrayBuffer(arrayBuffer) は false である。
  2. key が存在しない場合、keyundefined に設定する。
  3. arrayBuffer.[[ArrayBufferDetachKey]]key でない場合、TypeError 例外をスローする。
  4. arrayBuffer.[[ArrayBufferData]]null に設定する。
  5. arrayBuffer.[[ArrayBufferByteLength]] を0に設定する。
  6. unused を返す。
Note

ArrayBufferインスタンスをデタッチすると、そのバッキングストアとして使用されるData Blockがそのインスタンスから切り離され、バッファーのバイト長が0に設定されます。

25.1.3.6 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength )

The abstract operation CloneArrayBuffer takes arguments srcBuffer (ArrayBufferまたはSharedArrayBuffer), srcByteOffset (非負整数), and srcLength (非負整数) and returns ArrayBufferを含む正常完了またはスロー完了のいずれか. srcByteOffset から始まり srcLength バイト続く範囲にわたる srcBuffer のデータのコピーをデータとして持つ、新しいArrayBufferを作成します。 It performs the following steps when called:

  1. Assert: IsDetachedBuffer(srcBuffer) は false である。
  2. targetBuffer を ? AllocateArrayBuffer(%ArrayBuffer%, srcLength) とする。
  3. srcBlocksrcBuffer.[[ArrayBufferData]] とする。
  4. targetBlocktargetBuffer.[[ArrayBufferData]] とする。
  5. CopyDataBlockBytes(targetBlock, 0, srcBlock, srcByteOffset, srcLength) を実行する。
  6. targetBuffer を返す。

25.1.3.7 GetArrayBufferMaxByteLengthOption ( options )

The abstract operation GetArrayBufferMaxByteLengthOption takes argument options (ECMAScript言語値) and returns 非負整数または empty のいずれかを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. options がObjectでない場合、empty を返す。
  2. maxByteLength を ? Get(options, "maxByteLength") とする。
  3. maxByteLengthundefined の場合、empty を返す。
  4. ToIndex(maxByteLength) を返す。

25.1.3.8 HostResizeArrayBuffer ( buffer, newByteLength )

The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (ArrayBuffer) and newByteLength (非負整数) and returns handled または unhandled のいずれかを含む正常完了、またはスロー完了のいずれか. ホストに buffer の実装定義のサイズ変更を実行する機会を与えます。ホストが buffer のサイズ変更を処理しないことを選択した場合、既定の動作として unhandled を返してもよいです。

HostResizeArrayBufferの実装は、次の要件に適合しなければなりません:

  • この抽象操作は buffer をデタッチしない。
  • この抽象操作が handled で正常完了する場合、buffer.[[ArrayBufferByteLength]]newByteLength である。

HostResizeArrayBufferの既定の実装は NormalCompletion(unhandled) を返すことです。

25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )

The abstract operation IsFixedLengthArrayBuffer takes argument arrayBuffer (ArrayBufferまたはSharedArrayBuffer) and returns Boolean. It performs the following steps when called:

  1. arrayBuffer[[ArrayBufferMaxByteLength]] 内部スロットを持つ場合、false を返す。
  2. true を返す。

25.1.3.10 IsUnsignedElementType ( type )

The abstract operation IsUnsignedElementType takes argument type (TypedArray要素型) and returns Boolean. 引数 type が符号なしTypedArray要素型であるかを検証します。 It performs the following steps when called:

  1. typeuint8uint8clampeduint16uint32、または biguint64 のいずれかである場合、true を返す。
  2. false を返す。

25.1.3.11 IsUnclampedIntegerElementType ( type )

The abstract operation IsUnclampedIntegerElementType takes argument type (TypedArray要素型) and returns Boolean. 引数 typeuint8clamped を含まないInteger TypedArray要素型であるかを検証します。 It performs the following steps when called:

  1. typeint8uint8int16uint16int32、または uint32 のいずれかである場合、true を返す。
  2. false を返す。

25.1.3.12 IsBigIntElementType ( type )

The abstract operation IsBigIntElementType takes argument type (TypedArray要素型) and returns Boolean. 引数 type がBigInt TypedArray要素型であるかを検証します。 It performs the following steps when called:

  1. typebiguint64 または bigint64 のいずれかである場合、true を返す。
  2. false を返す。

25.1.3.13 IsNoTearConfiguration ( type, order )

The abstract operation IsNoTearConfiguration takes arguments type (TypedArray要素型) and order (seq-cstunordered、または init) and returns Boolean. It performs the following steps when called:

  1. IsUnclampedIntegerElementType(type) が true の場合、true を返す。
  2. IsBigIntElementType(type) が true であり、orderinit でも unordered でもない場合、true を返す。
  3. false を返す。

25.1.3.14 RawBytesToNumeric ( type, rawBytes, isLittleEndian )

The abstract operation RawBytesToNumeric takes arguments type (TypedArray要素型), rawBytes (バイト値のList), and isLittleEndian (Boolean) and returns NumberまたはBigInt. It performs the following steps when called:

  1. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  2. isLittleEndianfalse の場合、rawBytes の要素の順序を反転する。
  3. typefloat16 の場合、
    1. value を、rawBytes のバイト要素を連結し、IEEE 754-2019 binary16値のリトルエンディアンビット文字列エンコーディングとして解釈したものとする。
    2. value がNaNである場合、NaN を返す。
    3. value に対応するNumber値を返す。
  4. typefloat32 の場合、
    1. value を、rawBytes のバイト要素を連結し、IEEE 754-2019 binary32値のリトルエンディアンビット文字列エンコーディングとして解釈したものとする。
    2. value がNaNである場合、NaN を返す。
    3. value に対応するNumber値を返す。
  5. typefloat64 の場合、
    1. value を、rawBytes のバイト要素を連結し、IEEE 754-2019 binary64値のリトルエンディアンビット文字列エンコーディングとして解釈したものとする。
    2. value がNaNである場合、NaN を返す。
    3. value に対応するNumber値を返す。
  6. IsUnsignedElementType(type) が true の場合、
    1. intValue を、rawBytes のバイト要素を連結し、符号なしリトルエンディアン2進数のビット文字列エンコーディングとして解釈したものとする。
  7. そうでなければ、
    1. intValue を、rawBytes のバイト要素を連結し、ビット長 elementSize × 8 の2進リトルエンディアン2の補数のビット文字列エンコーディングとして解釈したものとする。
  8. IsBigIntElementType(type) が true の場合、intValue に対応するBigInt値を返す。
  9. intValue に対応するNumber値を返す。

25.1.3.15 GetRawBytesFromSharedBlock ( block, byteIndex, type, isTypedArray, order )

The abstract operation GetRawBytesFromSharedBlock takes arguments block (Shared Data Block), byteIndex (非負整数), type (TypedArray要素型), isTypedArray (Boolean), and order (seq-cst または unordered) and returns バイト値のList. It performs the following steps when called:

  1. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  2. agentRecord を周囲のエージェントのAgent Recordとする。
  3. executionagentRecord.[[CandidateExecution]] とする。
  4. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
  5. isTypedArraytrue であり、IsNoTearConfiguration(type, order) が true である場合、noTeartrue とする。そうでなければ、noTearfalse とする。
  6. rawValue を、要素が非決定的に選択されたバイト値である、長さ elementSizeListとする。
  7. NOTE: 実装では、rawValue は基盤ハードウェア上の非原子的または原子的な読み取り命令の結果です。この非決定性は、弱い一貫性を持つハードウェアの観察可能な動作を記述するためのメモリモデルの意味論上の規定です。
  8. readEventReadSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize } とする。
  9. readEventeventsRecord.[[EventList]] に追加する。
  10. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: rawValue } を execution.[[ChosenValues]] に追加する。
  11. rawValue を返す。

25.1.3.16 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] )

The abstract operation GetValueFromBuffer takes arguments arrayBuffer (ArrayBufferまたはSharedArrayBuffer), byteIndex (非負整数), type (TypedArray要素型), isTypedArray (Boolean), and order (seq-cst または unordered) and optional argument isLittleEndian (Boolean) and returns NumberまたはBigInt. It performs the following steps when called:

  1. Assert: IsDetachedBuffer(arrayBuffer) は false である。
  2. Assert: arrayBuffer 内の byteIndex から始まる十分なバイトがあり、type の値を表せる。
  3. blockarrayBuffer.[[ArrayBufferData]] とする。
  4. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  5. IsSharedArrayBuffer(arrayBuffer) が true の場合、
    1. Assert: blockShared Data Blockである。
    2. rawValueGetRawBytesFromSharedBlock(block, byteIndex, type, isTypedArray, order) とする。
  6. そうでなければ、
    1. rawValue を、byteIndex(含む)から byteIndex + elementSize(含まない)までの区間のインデックスにある block からのバイトを要素とするListとする。
  7. Assert: rawValue の要素数は elementSize である。
  8. isLittleEndian が存在しない場合、
    1. agentRecord を周囲のエージェントのAgent Recordとする。
    2. isLittleEndianagentRecord.[[LittleEndian]] に設定する。
  9. RawBytesToNumeric(type, rawValue, isLittleEndian) を返す。

25.1.3.17 NumericToRawBytes ( type, value, isLittleEndian )

The abstract operation NumericToRawBytes takes arguments type (TypedArray要素型), value (NumberまたはBigInt), and isLittleEndian (Boolean) and returns バイト値のList. It performs the following steps when called:

  1. typefloat16 の場合、
    1. rawBytes を、value をroundTiesToEvenモードを用いてIEEE 754-2019 binary16形式に変換した結果である2バイトを要素とするListとする。バイトはリトルエンディアン順に並べられる。valueNaN の場合、rawBytes は実装が選択した任意のIEEE 754-2019 binary16形式のNaNエンコーディングに設定されてもよい。実装は、実装上区別可能な各 NaN 値について常に同じエンコーディングを選択しなければならない。
  2. そうでなく typefloat32 の場合、
    1. rawBytes を、value をroundTiesToEvenモードを用いてIEEE 754-2019 binary32形式に変換した結果である4バイトを要素とするListとする。バイトはリトルエンディアン順に並べられる。valueNaN の場合、rawBytes は実装が選択した任意のIEEE 754-2019 binary32形式のNaNエンコーディングに設定されてもよい。実装は、実装上区別可能な各 NaN 値について常に同じエンコーディングを選択しなければならない。
  3. そうでなく typefloat64 の場合、
    1. rawBytes を、valueIEEE 754-2019 binary64形式エンコーディングである8バイトを要素とするListとする。バイトはリトルエンディアン順に並べられる。valueNaN の場合、rawBytes は実装が選択した任意のIEEE 754-2019 binary64形式のNaNエンコーディングに設定されてもよい。実装は、実装上区別可能な各 NaN 値について常に同じエンコーディングを選択しなければならない。
  4. そうでなければ、
    1. nTable 70 のElement Type type に対して指定されたElement Size値とする。
    2. conversionOperation を、Table 70 のElement Type type に対する“Conversion Operation”列で名付けられた抽象操作とする。
    3. intValue(! conversionOperation(value)) とする。
    4. intValue ≥ 0 の場合、
      1. rawBytes を、intValuen バイト2進エンコーディングを要素とするListとする。バイトはリトルエンディアン順に並べられる。
    5. そうでなければ、
      1. rawBytes を、intValuen バイト2進2の補数エンコーディングを要素とするListとする。バイトはリトルエンディアン順に並べられる。
  5. isLittleEndianfalse の場合、rawBytes の要素の順序を反転する。
  6. rawBytes を返す。

25.1.3.18 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] )

The abstract operation SetValueInBuffer takes arguments arrayBuffer (ArrayBufferまたはSharedArrayBuffer), byteIndex (非負整数), type (TypedArray要素型), value (NumberまたはBigInt), isTypedArray (Boolean), and order (seq-cstunordered、または init) and optional argument isLittleEndian (Boolean) and returns unused. It performs the following steps when called:

  1. Assert: IsDetachedBuffer(arrayBuffer) は false である。
  2. Assert: arrayBuffer 内の byteIndex から始まる十分なバイトがあり、type の値を表せる。
  3. Assert: IsBigIntElementType(type) が true である場合、value はBigIntである。そうでなければ、value はNumberである。
  4. blockarrayBuffer.[[ArrayBufferData]] とする。
  5. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  6. agentRecord を周囲のエージェントのAgent Recordとする。
  7. isLittleEndian が存在しない場合、
    1. isLittleEndianagentRecord.[[LittleEndian]] に設定する。
  8. rawBytesNumericToRawBytes(type, value, isLittleEndian) とする。
  9. IsSharedArrayBuffer(arrayBuffer) が true の場合、
    1. executionagentRecord.[[CandidateExecution]] とする。
    2. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
    3. isTypedArraytrue であり、IsNoTearConfiguration(type, order) が true である場合、noTeartrue とする。そうでなければ、noTearfalse とする。
    4. WriteSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes } を eventsRecord.[[EventList]] に追加する。
  10. そうでなければ、
    1. rawBytes の個々のバイトを、block[byteIndex] から始めて block に格納する。
  11. unused を返す。

25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op )

The abstract operation GetModifySetValueInBuffer takes arguments arrayBuffer (ArrayBufferまたはSharedArrayBuffer), byteIndex (非負整数), type (TypedArray要素型), value (NumberまたはBigInt), and op (read-modify-write変更関数) and returns NumberまたはBigInt. It performs the following steps when called:

  1. Assert: IsDetachedBuffer(arrayBuffer) は false である。
  2. Assert: arrayBuffer 内の byteIndex から始まる十分なバイトがあり、type の値を表せる。
  3. Assert: IsBigIntElementType(type) が true である場合、value はBigIntである。そうでなければ、value はNumberである。
  4. blockarrayBuffer.[[ArrayBufferData]] とする。
  5. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  6. agentRecord を周囲のエージェントのAgent Recordとする。
  7. isLittleEndianagentRecord.[[LittleEndian]] とする。
  8. rawBytesNumericToRawBytes(type, value, isLittleEndian) とする。
  9. IsSharedArrayBuffer(arrayBuffer) が true の場合、
    1. executionagentRecord.[[CandidateExecution]] とする。
    2. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
    3. rawBytesRead を、要素が非決定的に選択されたバイト値である、長さ elementSizeListとする。
    4. NOTE: 実装では、rawBytesRead は基盤ハードウェア上のload-link、load-exclusive、またはread-modify-write命令のオペランドの結果です。この非決定性は、弱い一貫性を持つハードウェアの観察可能な動作を記述するためのメモリモデルの意味論上の規定です。
    5. rmwEventReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes, [[ModifyOp]]: op } とする。
    6. rmwEventeventsRecord.[[EventList]] に追加する。
    7. Chosen Value Record { [[Event]]: rmwEvent, [[ChosenValue]]: rawBytesRead } を execution.[[ChosenValues]] に追加する。
  10. そうでなければ、
    1. rawBytesRead を、block[byteIndex] から始まる elementSize バイトの列を要素とする、長さ elementSizeListとする。
    2. rawBytesModifiedop(rawBytesRead, rawBytes) とする。
    3. rawBytesModified の個々のバイトを、block[byteIndex] から始めて block に格納する。
  11. RawBytesToNumeric(type, rawBytesRead, isLittleEndian) を返す。

25.1.4 ArrayBufferコンストラクター

ArrayBufferコンストラクターは:

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

25.1.4.1 ArrayBuffer ( length [ , options ] )

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

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. byteLength を ? ToIndex(length) とする。
  3. requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption(options) とする。
  4. AllocateArrayBuffer(NewTarget, byteLength, requestedMaxByteLength) を返す。

25.1.5 ArrayBufferコンストラクターのプロパティ

ArrayBufferコンストラクターは:

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

25.1.5.1 ArrayBuffer.isView ( arg )

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

  1. arg がObjectでない場合、false を返す。
  2. arg[[ViewedArrayBuffer]] 内部スロットを持つ場合、true を返す。
  3. false を返す。

25.1.5.2 ArrayBuffer.prototype

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

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

25.1.5.3 get ArrayBuffer [ %Symbol.species% ]

ArrayBuffer[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

この関数の"name"プロパティの値は "get [Symbol.species]" です。

Note

ArrayBuffer.prototype.slice ( start, end ) は通常、そのthis値のコンストラクターを使用して派生オブジェクトを作成します。しかし、サブクラスコンストラクターは、その %Symbol.species% プロパティを再定義することによって、ArrayBuffer.prototype.slice ( start, end ) メソッドについてその既定の振る舞いを上書きできます。

25.1.6 ArrayBufferプロトタイプオブジェクトのプロパティ

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

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

25.1.6.1 get ArrayBuffer.prototype.byteLength

ArrayBuffer.prototype.byteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsDetachedBuffer(obj) が true の場合、+0𝔽 を返す。
  5. lengthobj.[[ArrayBufferByteLength]] とする。
  6. 𝔽(length) を返す。

25.1.6.2 ArrayBuffer.prototype.constructor

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

25.1.6.3 get ArrayBuffer.prototype.detached

ArrayBuffer.prototype.detachedは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsDetachedBuffer(obj) を返す。

25.1.6.4 get ArrayBuffer.prototype.maxByteLength

ArrayBuffer.prototype.maxByteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsDetachedBuffer(obj) が true の場合、+0𝔽 を返す。
  5. IsFixedLengthArrayBuffer(obj) が true の場合、
    1. lengthobj.[[ArrayBufferByteLength]] とする。
  6. そうでなければ、
    1. lengthobj.[[ArrayBufferMaxByteLength]] とする。
  7. 𝔽(length) を返す。

25.1.6.5 get ArrayBuffer.prototype.resizable

ArrayBuffer.prototype.resizableは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsFixedLengthArrayBuffer(obj) が false の場合、true を返す。
  5. false を返す。

25.1.6.6 ArrayBuffer.prototype.resize ( newLength )

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

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferMaxByteLength]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. newByteLength を ? ToIndex(newLength) とする。
  5. IsDetachedBuffer(obj) が true の場合、TypeError 例外をスローする。
  6. newByteLength > obj.[[ArrayBufferMaxByteLength]] の場合、RangeError 例外をスローする。
  7. hostHandled を ? HostResizeArrayBuffer(obj, newByteLength) とする。
  8. hostHandledhandled である場合、undefined を返す。
  9. oldBlockobj.[[ArrayBufferData]] とする。
  10. newBlock を ? CreateByteDataBlock(newByteLength) とする。
  11. copyLengthmin(newByteLength, obj.[[ArrayBufferByteLength]]) とする。
  12. CopyDataBlockBytes(newBlock, 0, oldBlock, 0, copyLength) を実行する。
  13. NOTE: 新しいData Blockの作成も古いData Blockからのコピーも観察可能ではありません。実装はこのメソッドをインプレース拡張または縮小として実装してもよいです。
  14. obj.[[ArrayBufferData]]newBlock に設定する。
  15. obj.[[ArrayBufferByteLength]]newByteLength に設定する。
  16. undefined を返す。

25.1.6.7 ArrayBuffer.prototype.slice ( start, end )

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

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsDetachedBuffer(obj) が true の場合、TypeError 例外をスローする。
  5. lenobj.[[ArrayBufferByteLength]] とする。
  6. relativeStart を ? ToIntegerOrInfinity(start) とする。
  7. relativeStart = -∞ の場合、first を0とする。
  8. そうでなく relativeStart < 0 の場合、firstmax(len + relativeStart, 0) とする。
  9. そうでなければ、firstmin(relativeStart, len) とする。
  10. endundefined の場合、relativeEndlen とする。そうでなければ、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  11. relativeEnd = -∞ の場合、final を0とする。
  12. そうでなく relativeEnd < 0 の場合、finalmax(len + relativeEnd, 0) とする。
  13. そうでなければ、finalmin(relativeEnd, len) とする。
  14. newLenmax(final - first, 0) とする。
  15. ctor を ? SpeciesConstructor(obj, %ArrayBuffer%) とする。
  16. new を ? Construct(ctor, « 𝔽(newLen) ») とする。
  17. RequireInternalSlot(new, [[ArrayBufferData]]) を実行する。
  18. IsSharedArrayBuffer(new) が true の場合、TypeError 例外をスローする。
  19. IsDetachedBuffer(new) が true の場合、TypeError 例外をスローする。
  20. SameValue(new, obj) が true の場合、TypeError 例外をスローする。
  21. new.[[ArrayBufferByteLength]] < newLen の場合、TypeError 例外をスローする。
  22. NOTE: 上記の手順の副作用によって、obj がデタッチまたはサイズ変更されている可能性があります。
  23. IsDetachedBuffer(obj) が true の場合、TypeError 例外をスローする。
  24. fromBufobj.[[ArrayBufferData]] とする。
  25. toBufnew.[[ArrayBufferData]] とする。
  26. currentLenobj.[[ArrayBufferByteLength]] とする。
  27. first < currentLen の場合、
    1. countmin(newLen, currentLen - first) とする。
    2. CopyDataBlockBytes(toBuf, 0, fromBuf, first, count) を実行する。
  28. new を返す。

25.1.6.8 ArrayBuffer.prototype.transfer ( [ newLength ] )

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

  1. objthis値とする。
  2. ArrayBufferCopyAndDetach(obj, newLength, preserve-resizability) を返す。

25.1.6.9 ArrayBuffer.prototype.transferToFixedLength ( [ newLength ] )

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

  1. objthis値とする。
  2. ArrayBufferCopyAndDetach(obj, newLength, fixed-length) を返す。

25.1.6.10 ArrayBuffer.prototype [ %Symbol.toStringTag% ]

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

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

25.1.7 ArrayBufferインスタンスのプロパティ

ArrayBufferインスタンスはArrayBufferプロトタイプオブジェクトからプロパティを継承します。ArrayBufferインスタンスはそれぞれ、[[ArrayBufferData]]内部スロット、[[ArrayBufferByteLength]]内部スロット、および[[ArrayBufferDetachKey]]内部スロットを持ちます。サイズ変更可能なArrayBufferインスタンスはそれぞれ、[[ArrayBufferMaxByteLength]]内部スロットを持ちます。

[[ArrayBufferData]]null であるArrayBufferインスタンスはデタッチされているとみなされ、そのArrayBufferインスタンスに含まれるデータにアクセスまたは変更するすべての演算子は失敗します。

[[ArrayBufferDetachKey]]undefined 以外の値に設定されているArrayBufferインスタンスでは、すべてのDetachArrayBuffer呼び出しで同じ"detach key"を引数として渡す必要があります。そうでない場合、TypeErrorになります。この内部スロットは、この仕様のアルゴリズムではなく、特定の埋め込み環境によってのみ設定されます。

25.1.8 サイズ変更可能なArrayBufferのガイドライン

Note 1

以下は、サイズ変更可能なArrayBufferを扱うECMAScriptプログラマー向けのガイドラインです。

可能な場合、プログラムはその展開環境でテストすることを推奨します。利用可能な物理メモリ量はハードウェアデバイス間で大きく異なります。同様に、仮想メモリサブシステムも、ハードウェアデバイス間だけでなくオペレーティングシステム間でも大きく異なります。64ビットのデスクトップWebブラウザーでメモリ不足エラーなしに動作するアプリケーションが、32ビットのモバイルWebブラウザーではメモリ不足になる可能性があります。

サイズ変更可能なArrayBuffer"maxByteLength"オプションの値を選択する際には、アプリケーションにとって可能な最小サイズを選択することを推奨します。"maxByteLength" は1,073,741,824(230バイトまたは1GiB)を超えないことを推奨します。

特定の最大サイズでサイズ変更可能なArrayBufferの構築に成功しても、将来のサイズ変更が成功することを保証するものではないことに注意してください。

Note 2

以下は、サイズ変更可能なArrayBufferを実装するECMAScript実装者向けのガイドラインです。

サイズ変更可能なArrayBufferは、サイズ変更時にコピーする方法、仮想メモリを事前に予約することによるインプレース拡張、またはコンストラクターの"maxByteLength"オプションの異なる値に対してその両方を組み合わせる方法として実装できます。

ホストがWebブラウザーのように多数のECMAScriptアプリケーションを同時に実行するマルチテナントであり、その実装が仮想メモリを予約することでインプレース拡張を実装することを選択する場合、32ビットおよび64ビットの実装の両方で、"maxByteLength" ≥ 1GiBから1.5GiBの値についてスローすることを推奨します。これは、単一のアプリケーションが仮想メモリアドレス空間を使い尽くす可能性を低減し、相互運用性リスクを低減するためです。

MMUを持たない組込みデバイス上で動作するホストなど、ホストが仮想メモリを持たない場合、またはホストがコピーによるサイズ変更のみを実装する場合、"maxByteLength"オプションについて任意の Number値を 受け入れてもよいです。ただし、要求されたサイズのメモリブロックが決して割り当てられない場合には、RangeError がスローされることを推奨します。例えば、要求されたサイズがデバイス上で使用可能な最大メモリ量を超える場合です。

25.2 SharedArrayBufferオブジェクト

25.2.1 固定長および拡張可能なSharedArrayBufferオブジェクト

固定長SharedArrayBufferとは、作成後にバイト長を変更できないSharedArrayBufferです。

拡張可能なSharedArrayBufferとは、作成後に SharedArrayBuffer.prototype.grow ( newLength ) を呼び出すことによってバイト長を増加できるSharedArrayBufferです。

作成されるSharedArrayBufferオブジェクトの種類は、SharedArrayBuffer ( length [ , options ] ) に渡される引数に依存します。

25.2.2 SharedArrayBufferオブジェクトのための抽象操作

25.2.2.1 AllocateSharedArrayBuffer ( constructor, byteLength [ , maxByteLength ] )

The abstract operation AllocateSharedArrayBuffer takes arguments constructor (コンストラクター) and byteLength (非負整数) and optional argument maxByteLength (非負整数または empty) and returns SharedArrayBufferを含む正常完了またはスロー完了のいずれか. SharedArrayBufferを作成するために使用されます。 It performs the following steps when called:

  1. Let slots be « [[ArrayBufferData]] ».
  2. If maxByteLength is present and maxByteLength is not empty, let allocatingGrowableBuffer be true; else let allocatingGrowableBuffer be false.
  3. If allocatingGrowableBuffer is true, then
    1. If byteLength > maxByteLength, throw a RangeError exception.
    2. Append [[ArrayBufferByteLengthData]] and [[ArrayBufferMaxByteLength]] to slots.
  4. Else,
    1. Append [[ArrayBufferByteLength]] to slots.
  5. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%SharedArrayBuffer.prototype%", slots).
  6. If allocatingGrowableBuffer is true, let allocLength be maxByteLength; else let allocLength be byteLength.
  7. Let block be ? CreateSharedByteDataBlock(allocLength).
  8. Set obj.[[ArrayBufferData]] to block.
  9. If allocatingGrowableBuffer is true, then
    1. Assert: byteLengthmaxByteLength.
    2. Let byteLengthBlock be ? CreateSharedByteDataBlock(8).
    3. Perform SetValueInBuffer(byteLengthBlock, 0, biguint64, (byteLength), true, seq-cst).
    4. Set obj.[[ArrayBufferByteLengthData]] to byteLengthBlock.
    5. Set obj.[[ArrayBufferMaxByteLength]] to maxByteLength.
  10. Else,
    1. Set obj.[[ArrayBufferByteLength]] to byteLength.
  11. Return obj.

25.2.2.2 IsSharedArrayBuffer ( obj )

The abstract operation IsSharedArrayBuffer takes argument obj (ArrayBufferまたはSharedArrayBuffer) and returns Boolean. オブジェクトがSharedArrayBufferであるかどうかをテストします。 It performs the following steps when called:

  1. obj.[[ArrayBufferData]]Shared Data Blockである場合、true を返す。
  2. false を返す。

25.2.2.3 IsGrowableSharedArrayBuffer ( obj )

The abstract operation IsGrowableSharedArrayBuffer takes argument obj (ArrayBufferまたはSharedArrayBuffer) and returns Boolean. オブジェクトが拡張可能なSharedArrayBufferであるかどうかをテストします。 It performs the following steps when called:

  1. IsSharedArrayBuffer(obj) が true であり、obj[[ArrayBufferByteLengthData]] 内部スロットを持つ場合、true を返す。
  2. false を返す。

25.2.2.4 HostGrowSharedArrayBuffer ( buffer, newByteLength )

The host-defined abstract operation HostGrowSharedArrayBuffer takes arguments buffer (SharedArrayBuffer) and newByteLength (非負整数) and returns handled または unhandled のいずれかを含む正常完了、またはスロー完了のいずれか. ホストに buffer の実装定義の拡張を実行する機会を与えます。ホストが buffer の拡張を処理しないことを選択した場合、既定の動作として unhandled を返してもよいです。

HostGrowSharedArrayBufferの実装は、次の要件に適合しなければなりません:

  • この抽象操作が unhandled で正常完了しない場合で、newByteLength < buffer の現在のバイト長、または newByteLength > buffer.[[ArrayBufferMaxByteLength]] である場合、RangeError 例外をスローする。
  • agentRecord を周囲のエージェントのAgent Recordとする。isLittleEndianagentRecord.[[LittleEndian]] とする。この抽象操作が handled で正常完了する場合、[[Order]]seq-cst[[Payload]]NumericToRawBytes(biguint64, newByteLength, isLittleEndian)、[[Block]]buffer.[[ArrayBufferByteLengthData]][[ByteIndex]] が0、[[ElementSize]] が8であるWriteSharedMemoryまたはReadModifyWriteSharedMemoryイベントが、SharedArrayBuffer.prototype.grow ( newLength ) への競合する呼び出しが「失われる」、すなわち黙って何もしない、ということがないように、周囲のエージェントの候補実行に追加される。
Note

上記の第2要件は、buffer の現在のバイト長がどのように、またはいつ読み取られるかについて意図的に曖昧です。バイト長は基盤ハードウェア上の原子的read-modify-write操作によって更新されなければならないため、load-link/store-conditionalまたはload-exclusive/store-exclusive命令ペアを使用するアーキテクチャは、ペアとなる命令を命令ストリーム内で近接させたい場合があります。そのため、SharedArrayBuffer.prototype.grow ( newLength ) 自体はHostGrowSharedArrayBufferを呼び出す前に newByteLength の境界チェックを行わず、現在のバイト長がいつ読み取られるかについての要件もありません。

これは、0 ≤ newByteLengthbuffer.[[ArrayBufferMaxByteLength]] が保証されているHostResizeArrayBufferとは対照的です。

HostGrowSharedArrayBufferの既定の実装は NormalCompletion(unhandled) を返すことです。

25.2.3 SharedArrayBufferコンストラクター

SharedArrayBufferコンストラクターは:

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

ホストがSharedArrayBufferへの並行アクセスを提供しない場合はいつでも、グローバルオブジェクト"SharedArrayBuffer"プロパティを省略してもよいです。

Note

ArrayBufferとは異なり、SharedArrayBufferはデタッチされることができず、その内部[[ArrayBufferData]]スロットは決して null になりません。

25.2.3.1 SharedArrayBuffer ( length [ , options ] )

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

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. byteLength を ? ToIndex(length) とする。
  3. requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption(options) とする。
  4. AllocateSharedArrayBuffer(NewTarget, byteLength, requestedMaxByteLength) を返す。

25.2.4 SharedArrayBufferコンストラクターのプロパティ

SharedArrayBufferコンストラクターは:

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

25.2.4.1 SharedArrayBuffer.prototype

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

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

25.2.4.2 get SharedArrayBuffer [ %Symbol.species% ]

SharedArrayBuffer[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

この関数の"name"プロパティの値は "get [Symbol.species]" です。

25.2.5 SharedArrayBufferプロトタイプオブジェクトのプロパティ

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

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

25.2.5.1 get SharedArrayBuffer.prototype.byteLength

SharedArrayBuffer.prototype.byteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. lengthArrayBufferByteLength(obj, seq-cst) とする。
  5. 𝔽(length) を返す。

25.2.5.2 SharedArrayBuffer.prototype.constructor

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

25.2.5.3 SharedArrayBuffer.prototype.grow ( newLength )

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

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferMaxByteLength]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. newByteLength を ? ToIndex(newLength) とする。
  5. hostHandled を ? HostGrowSharedArrayBuffer(obj, newByteLength) とする。
  6. hostHandledhandled である場合、undefined を返す。
  7. agentRecord を周囲のエージェントのAgent Recordとする。
  8. isLittleEndianagentRecord.[[LittleEndian]] とする。
  9. byteLengthBlockobj.[[ArrayBufferByteLengthData]] とする。
  10. currentByteLengthRawBytesGetRawBytesFromSharedBlock(byteLengthBlock, 0, biguint64, true, seq-cst) とする。
  11. newByteLengthRawBytesNumericToRawBytes(biguint64, (newByteLength), isLittleEndian) とする。
  12. 繰り返す:
    1. NOTE: これは、同じバッファーの並列で競合する拡張が全順序化され、失われず、黙って何もしないことがないようにするためのcompare-and-exchangeループです。このループは、競合なしに拡張を試みることができた場合に終了します。
    2. currentByteLength(RawBytesToNumeric(biguint64, currentByteLengthRawBytes, isLittleEndian)) とする。
    3. newByteLength = currentByteLength の場合、undefined を返す。
    4. newByteLength < currentByteLength または newByteLength > obj.[[ArrayBufferMaxByteLength]] の場合、RangeError 例外をスローする。
    5. byteLengthDeltanewByteLength - currentByteLength とする。
    6. byteLengthDelta バイトからなる新しいShared Data Block値を作成することが不可能な場合、RangeError 例外をスローする。
    7. NOTE: ここでは新しいShared Data Blockは構築も使用もされません。拡張可能なSharedArrayBufferの観察可能な振る舞いは、構築時に最大サイズのShared Data Blockを割り当てることで指定されており、この手順は、メモリ不足になった実装が RangeError をスローしなければならないという要件を捉えています。
    8. readByteLengthRawBytesAtomicCompareExchangeInSharedBlock(byteLengthBlock, 0, 8, currentByteLengthRawBytes, newByteLengthRawBytes) とする。
    9. ByteListEqual(readByteLengthRawBytes, currentByteLengthRawBytes) が true の場合、undefined を返す。
    10. currentByteLengthRawBytesreadByteLengthRawBytes に設定する。
Note

長さを更新するcompare-exchangeの偽の失敗は禁止されています。新しい長さの境界チェックが通過し、実装がメモリ不足でない場合、ReadModifyWriteSharedMemoryイベント(すなわち成功したcompare-exchange)は常に候補実行に追加されます。

SharedArrayBuffer.prototype.growへの並列呼び出しは全順序化されます。例えば、sab.grow(10)sab.grow(20)という2つの競合する呼び出しを考えます。2つの呼び出しの一方が競争に勝つことが保証されます。sab.grow(10)の呼び出しは、sab.grow(20)が先に起きた場合でもsabを縮小することは決してなく、その場合は代わりにRangeErrorをスローします。

25.2.5.4 get SharedArrayBuffer.prototype.growable

SharedArrayBuffer.prototype.growableは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. IsFixedLengthArrayBuffer(obj) が false の場合、true を返す。
  5. false を返す。

25.2.5.5 get SharedArrayBuffer.prototype.maxByteLength

SharedArrayBuffer.prototype.maxByteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. IsFixedLengthArrayBuffer(obj) が true の場合、
    1. lengthobj.[[ArrayBufferByteLength]] とする。
  5. そうでなければ、
    1. lengthobj.[[ArrayBufferMaxByteLength]] とする。
  6. 𝔽(length) を返す。

25.2.5.6 SharedArrayBuffer.prototype.slice ( start, end )

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

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. lenArrayBufferByteLength(obj, seq-cst) とする。
  5. relativeStart を ? ToIntegerOrInfinity(start) とする。
  6. relativeStart = -∞ の場合、first を0とする。
  7. そうでなく relativeStart < 0 の場合、firstmax(len + relativeStart, 0) とする。
  8. そうでなければ、firstmin(relativeStart, len) とする。
  9. endundefined の場合、relativeEndlen とする。そうでなければ、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  10. relativeEnd = -∞ の場合、final を0とする。
  11. そうでなく relativeEnd < 0 の場合、finalmax(len + relativeEnd, 0) とする。
  12. そうでなければ、finalmin(relativeEnd, len) とする。
  13. newLenmax(final - first, 0) とする。
  14. ctor を ? SpeciesConstructor(obj, %SharedArrayBuffer%) とする。
  15. new を ? Construct(ctor, « 𝔽(newLen) ») とする。
  16. RequireInternalSlot(new, [[ArrayBufferData]]) を実行する。
  17. IsSharedArrayBuffer(new) が false の場合、TypeError 例外をスローする。
  18. new.[[ArrayBufferData]]obj.[[ArrayBufferData]] である場合、TypeError 例外をスローする。
  19. ArrayBufferByteLength(new, seq-cst) < newLen の場合、TypeError 例外をスローする。
  20. fromBufobj.[[ArrayBufferData]] とする。
  21. toBufnew.[[ArrayBufferData]] とする。
  22. CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLen) を実行する。
  23. new を返す。

25.2.5.7 SharedArrayBuffer.prototype [ %Symbol.toStringTag% ]

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

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

25.2.6 SharedArrayBufferインスタンスのプロパティ

SharedArrayBufferインスタンスはSharedArrayBufferプロトタイプオブジェクトからプロパティを継承します。SharedArrayBufferインスタンスはそれぞれ[[ArrayBufferData]]内部スロットを持ちます。拡張可能でないSharedArrayBufferインスタンスはそれぞれ[[ArrayBufferByteLength]]内部スロットを持ちます。拡張可能なSharedArrayBufferインスタンスはそれぞれ[[ArrayBufferByteLengthData]]内部スロットおよび[[ArrayBufferMaxByteLength]]内部スロットを持ちます。

Note

SharedArrayBufferインスタンスは、ArrayBufferインスタンスと異なり、決してデタッチされません。

25.2.7 拡張可能なSharedArrayBufferのガイドライン

Note 1

以下は、拡張可能なSharedArrayBufferを扱うECMAScriptプログラマー向けのガイドラインです。

可能な場合、プログラムはその展開環境でテストすることを推奨します。利用可能な物理メモリ量はハードウェアデバイス間で大きく異なります。同様に、仮想メモリサブシステムも、ハードウェアデバイス間だけでなくオペレーティングシステム間でも大きく異なります。64ビットのデスクトップWebブラウザーでメモリ不足エラーなしに動作するアプリケーションが、32ビットのモバイルWebブラウザーではメモリ不足になる可能性があります。

拡張可能なSharedArrayBuffer"maxByteLength"オプションの値を選択する際には、アプリケーションにとって可能な最小サイズを選択することを推奨します。"maxByteLength" は1073741824、すなわち1GiBを超えないことを推奨します。

特定の最大サイズで拡張可能なSharedArrayBufferの構築に成功しても、将来の拡張が成功することを保証するものではないことに注意してください。

拡張可能なSharedArrayBufferの長さのすべてのロードが同期的な seq-cst ロードであるわけではありません。整数インデックス付きプロパティアクセス、例えば u8[idx] の境界チェックのための長さのロードは同期的ではありません。一般に、明示的な同期がない場合、あるプロパティアクセスが範囲内であることは、同じエージェント内の後続のプロパティアクセスも範囲内であることを意味しません。対照的に、SharedArrayBuffer、%TypedArray%.prototype、およびDataView.prototype上のlengthおよびbyteLengthゲッターを介した長さの明示的なロードは同期的です。TypedArrayが完全に範囲外かどうかを確認するために組み込みメソッドによって実行される長さのロードも同期的です。

Note 2

以下は、拡張可能なSharedArrayBufferを実装するECMAScript実装者向けのガイドラインです。

拡張可能なSharedArrayBufferは、仮想メモリを事前に予約することによるインプレース拡張として実装することを推奨します。

拡張操作は拡張可能なSharedArrayBuffer上のメモリアクセスと並列に発生し得るため、メモリモデルの制約により、順序なしアクセスであっても「tear」しない(値のビットが混ざらない)ことが要求されます。実際には、これは、拡張可能なSharedArrayBufferの基盤データブロックを、世界を停止することなしにコピーによって拡張できないことを意味します。世界を停止することは直列化ポイントを導入し低速であるため、実装戦略として推奨しません。

拡張されたメモリは、並列で競合するアクセスに対しても、その作成の瞬間からゼロ化されて見えなければなりません。これは、オンデマンドでゼロ埋めされる仮想メモリページ、または手動でメモリをゼロ化する場合の慎重な同期によって達成できます。

拡張可能なSharedArrayBufferTypedArrayビュー上の整数インデックス付きプロパティアクセスは、非拡張可能なSharedArrayBufferTypedArrayビュー上のアクセスと同様に最適化可能であることを意図しています。なぜなら、整数インデックス付きプロパティロードは、基盤バッファーの長さに対して同期的ではないためです(上記のプログラマー向けガイドラインを参照)。例えば、プロパティアクセスの境界チェックはループ外へ移動されてもよいです。

MMUを持たない組込みデバイス上で動作するホストなど、仮想メモリを持たないホストで、拡張可能なSharedArrayBufferをコピーによって実装することは実際には困難です。そのようなホスト上での拡張可能なSharedArrayBufferのメモリ使用の振る舞いは、仮想メモリを持つホストのものとは大きく異なる可能性があります。そのようなホストは、メモリ使用の期待値をユーザーに明確に伝えるべきです。

25.3 DataViewオブジェクト

25.3.1 DataViewオブジェクトのための抽象操作

25.3.1.1 DataView With Buffer Witness Record

DataView With Buffer Witness Recordとは、DataViewを、閲覧対象バッファーのキャッシュされたバイト長とともにカプセル化するために使用されるRecord値です。これは、閲覧対象バッファーが拡張可能なSharedArrayBufferである場合に、バイト長データブロックのReadSharedMemoryイベントが1つだけであることを保証するのに役立ちます。

DataView With Buffer Witness Recordは、Table 72 に列挙されるフィールドを持ちます。

Table 72: DataView With Buffer Witness Record Fields
フィールド名 意味
[[Object]] DataView バッファーのバイト長がロードされるDataViewオブジェクト。
[[CachedBufferByteLength]] 非負整数または detached Recordが作成されたときの、オブジェクトの[[ViewedArrayBuffer]]のバイト長。

25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj, order )

The abstract operation MakeDataViewWithBufferWitnessRecord takes arguments obj (DataView) and order (seq-cst または unordered) and returns DataView With Buffer Witness Record. It performs the following steps when called:

  1. bufferobj.[[ViewedArrayBuffer]] とする。
  2. IsDetachedBuffer(buffer) が true の場合、
    1. byteLengthdetached とする。
  3. そうでなければ、
    1. byteLengthArrayBufferByteLength(buffer, order) とする。
  4. DataView With Buffer Witness Record { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength } を返す。

25.3.1.3 GetViewByteLength ( viewRecord )

The abstract operation GetViewByteLength takes argument viewRecord (DataView With Buffer Witness Record) and returns 非負整数. It performs the following steps when called:

  1. Assert: IsViewOutOfBounds(viewRecord) は false である。
  2. viewviewRecord.[[Object]] とする。
  3. view.[[ByteLength]]auto でない場合、view.[[ByteLength]] を返す。
  4. Assert: IsFixedLengthArrayBuffer(view.[[ViewedArrayBuffer]]) は false である。
  5. byteOffsetview.[[ByteOffset]] とする。
  6. byteLengthviewRecord.[[CachedBufferByteLength]] とする。
  7. Assert: byteLengthdetached でない。
  8. byteLength - byteOffset を返す。

25.3.1.4 IsViewOutOfBounds ( viewRecord )

The abstract operation IsViewOutOfBounds takes argument viewRecord (DataView With Buffer Witness Record) and returns Boolean. It performs the following steps when called:

  1. viewviewRecord.[[Object]] とする。
  2. bufferByteLengthviewRecord.[[CachedBufferByteLength]] とする。
  3. IsDetachedBuffer(view.[[ViewedArrayBuffer]]) が true の場合、
    1. Assert: bufferByteLengthdetached である。
    2. true を返す。
  4. Assert: bufferByteLength は非負整数である。
  5. byteOffsetStartview.[[ByteOffset]] とする。
  6. view.[[ByteLength]]auto である場合、
    1. byteOffsetEndbufferByteLength とする。
  7. そうでなければ、
    1. byteOffsetEndbyteOffsetStart + view.[[ByteLength]] とする。
  8. NOTE: [[ByteOffset]]bufferByteLength である0長のDataViewは、範囲外とはみなされません。
  9. byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength の場合、true を返す。
  10. false を返す。

25.3.1.5 GetViewValue ( view, requestIndex, isLittleEndian, type )

The abstract operation GetViewValue takes arguments view (ECMAScript言語値), requestIndex (ECMAScript言語値), isLittleEndian (ECMAScript言語値), and type (TypedArray要素型) and returns NumberまたはBigIntのいずれかを含む正常完了、またはスロー完了のいずれか. DataViewインスタンス上の関数が、ビューのバッファーから値を取得するために使用します。 It performs the following steps when called:

  1. RequireInternalSlot(view, [[DataView]]) を実行する。
  2. Assert: view[[ViewedArrayBuffer]] 内部スロットを持つ。
  3. getIndex を ? ToIndex(requestIndex) とする。
  4. isLittleEndianToBoolean(isLittleEndian) に設定する。
  5. viewOffsetview.[[ByteOffset]] とする。
  6. viewRecordMakeDataViewWithBufferWitnessRecord(view, unordered) とする。
  7. NOTE: view のバッキングバッファーが拡張可能なSharedArrayBufferである場合、境界チェックは同期操作ではありません。
  8. IsViewOutOfBounds(viewRecord) が true の場合、TypeError 例外をスローする。
  9. viewSizeGetViewByteLength(viewRecord) とする。
  10. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  11. getIndex + elementSize > viewSize の場合、RangeError 例外をスローする。
  12. bufferIndexgetIndex + viewOffset とする。
  13. GetValueFromBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, false, unordered, isLittleEndian) を返す。

25.3.1.6 SetViewValue ( view, requestIndex, isLittleEndian, type, value )

The abstract operation SetViewValue takes arguments view (ECMAScript言語値), requestIndex (ECMAScript言語値), isLittleEndian (ECMAScript言語値), type (TypedArray要素型), and value (ECMAScript言語値) and returns undefined を含む正常完了またはスロー完了のいずれか. DataViewインスタンス上の関数が、ビューのバッファーに値を格納するために使用します。 It performs the following steps when called:

  1. RequireInternalSlot(view, [[DataView]]) を実行する。
  2. Assert: view[[ViewedArrayBuffer]] 内部スロットを持つ。
  3. getIndex を ? ToIndex(requestIndex) とする。
  4. IsBigIntElementType(type) が true の場合、numberValue を ? ToBigInt(value) とする。
  5. そうでなければ、numberValue を ? ToNumber(value) とする。
  6. isLittleEndianToBoolean(isLittleEndian) に設定する。
  7. viewOffsetview.[[ByteOffset]] とする。
  8. viewRecordMakeDataViewWithBufferWitnessRecord(view, unordered) とする。
  9. NOTE: view のバッキングバッファーが拡張可能なSharedArrayBufferである場合、境界チェックは同期操作ではありません。
  10. IsViewOutOfBounds(viewRecord) が true の場合、TypeError 例外をスローする。
  11. viewSizeGetViewByteLength(viewRecord) とする。
  12. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  13. getIndex + elementSize > viewSize の場合、RangeError 例外をスローする。
  14. bufferIndexgetIndex + viewOffset とする。
  15. SetValueInBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, numberValue, false, unordered, isLittleEndian) を実行する。
  16. undefined を返す。

25.3.2 DataViewコンストラクター

DataViewコンストラクターは:

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

25.3.2.1 DataView ( buffer [ , byteOffset [ , byteLength ] ] )

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

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. RequireInternalSlot(buffer, [[ArrayBufferData]]) を実行する。
  3. offset を ? ToIndex(byteOffset) とする。
  4. IsDetachedBuffer(buffer) が true の場合、TypeError 例外をスローする。
  5. bufferByteLengthArrayBufferByteLength(buffer, seq-cst) とする。
  6. offset > bufferByteLength の場合、RangeError 例外をスローする。
  7. bufferIsFixedLengthIsFixedLengthArrayBuffer(buffer) とする。
  8. byteLengthundefined の場合、
    1. bufferIsFixedLengthtrue の場合、
      1. viewByteLengthbufferByteLength - offset とする。
    2. そうでなければ、
      1. viewByteLengthauto とする。
  9. そうでなければ、
    1. viewByteLength を ? ToIndex(byteLength) とする。
    2. offset + viewByteLength > bufferByteLength の場合、RangeError 例外をスローする。
  10. obj を ? OrdinaryCreateFromConstructor(NewTarget, "%DataView.prototype%", « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] ») とする。
  11. IsDetachedBuffer(buffer) が true の場合、TypeError 例外をスローする。
  12. bufferByteLengthArrayBufferByteLength(buffer, seq-cst) に設定する。
  13. offset > bufferByteLength の場合、RangeError 例外をスローする。
  14. byteLengthundefined でない場合、
    1. offset + viewByteLength > bufferByteLength の場合、RangeError 例外をスローする。
  15. obj.[[ViewedArrayBuffer]]buffer に設定する。
  16. obj.[[ByteLength]]viewByteLength に設定する。
  17. obj.[[ByteOffset]]offset に設定する。
  18. obj を返す。

25.3.3 DataViewコンストラクターのプロパティ

DataViewコンストラクターは:

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

25.3.3.1 DataView.prototype

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

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

25.3.4 DataViewプロトタイプオブジェクトのプロパティ

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

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

25.3.4.1 get DataView.prototype.buffer

DataView.prototype.bufferは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[DataView]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. bufferobj.[[ViewedArrayBuffer]] とする。
  5. buffer を返す。

25.3.4.2 get DataView.prototype.byteLength

DataView.prototype.byteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[DataView]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. viewRecordMakeDataViewWithBufferWitnessRecord(obj, seq-cst) とする。
  5. IsViewOutOfBounds(viewRecord) が true の場合、TypeError 例外をスローする。
  6. sizeGetViewByteLength(viewRecord) とする。
  7. 𝔽(size) を返す。

25.3.4.3 get DataView.prototype.byteOffset

DataView.prototype.byteOffsetは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[DataView]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. viewRecordMakeDataViewWithBufferWitnessRecord(obj, seq-cst) とする。
  5. IsViewOutOfBounds(viewRecord) が true の場合、TypeError 例外をスローする。
  6. offsetobj.[[ByteOffset]] とする。
  7. 𝔽(offset) を返す。

25.3.4.4 DataView.prototype.constructor

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

25.3.4.5 DataView.prototype.getBigInt64 ( byteOffset [ , littleEndian ] )

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

  1. viewthis値とする。
  2. GetViewValue(view, byteOffset, littleEndian, bigint64) を返す。

25.3.4.6 DataView.prototype.getBigUint64 ( byteOffset [ , littleEndian ] )

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

  1. viewthis値とする。
  2. GetViewValue(view, byteOffset, littleEndian, biguint64) を返す。

25.3.4.7 DataView.prototype.getFloat16 ( byteOffset [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, float16) を返す。

25.3.4.8 DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, float32) を返す。

25.3.4.9 DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, float64) を返す。

25.3.4.10 DataView.prototype.getInt8 ( byteOffset )

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

  1. viewthis値とする。
  2. GetViewValue(view, byteOffset, true, int8) を返す。

25.3.4.11 DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, int16) を返す。

25.3.4.12 DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, int32) を返す。

25.3.4.13 DataView.prototype.getUint8 ( byteOffset )

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

  1. viewthis値とする。
  2. GetViewValue(view, byteOffset, true, uint8) を返す。

25.3.4.14 DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, uint16) を返す。

25.3.4.15 DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, uint32) を返す。

25.3.4.16 DataView.prototype.setBigInt64 ( byteOffset, value [ , littleEndian ] )

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

  1. viewthis値とする。
  2. SetViewValue(view, byteOffset, littleEndian, bigint64, value) を返す。

25.3.4.17 DataView.prototype.setBigUint64 ( byteOffset, value [ , littleEndian ] )

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

  1. viewthis値とする。
  2. SetViewValue(view, byteOffset, littleEndian, biguint64, value) を返す。

25.3.4.18 DataView.prototype.setFloat16 ( byteOffset, value [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, float16, value) を返す。

25.3.4.19 DataView.prototype.setFloat32 ( byteOffset, value [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, float32, value) を返す。

25.3.4.20 DataView.prototype.setFloat64 ( byteOffset, value [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, float64, value) を返す。

25.3.4.21 DataView.prototype.setInt8 ( byteOffset, value )

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

  1. viewthis値とする。
  2. SetViewValue(view, byteOffset, true, int8, value) を返す。

25.3.4.22 DataView.prototype.setInt16 ( byteOffset, value [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, int16, value) を返す。

25.3.4.23 DataView.prototype.setInt32 ( byteOffset, value [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, int32, value) を返す。

25.3.4.24 DataView.prototype.setUint8 ( byteOffset, value )

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

  1. viewthis値とする。
  2. SetViewValue(view, byteOffset, true, uint8, value) を返す。

25.3.4.25 DataView.prototype.setUint16 ( byteOffset, value [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, uint16, value) を返す。

25.3.4.26 DataView.prototype.setUint32 ( byteOffset, value [ , littleEndian ] )

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

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, uint32, value) を返す。

25.3.4.27 DataView.prototype [ %Symbol.toStringTag% ]

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

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

25.3.5 DataViewインスタンスのプロパティ

DataViewインスタンスは、DataViewプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。DataViewインスタンスはそれぞれ、[[DataView]][[ViewedArrayBuffer]][[ByteLength]]、および[[ByteOffset]]内部スロットを持ちます。

Note

[[DataView]]内部スロットの値は、この仕様内では使用されません。その内部スロットが存在するという単純な事実が、DataViewコンストラクターを使用して作成されたオブジェクトを識別するために仕様内で使用されます。

25.4 Atomicsオブジェクト

Atomicsオブジェクトは:

  • %Atomics%である。
  • グローバルオブジェクト"Atomics"プロパティの初期値である。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • [[Construct]]内部メソッドを持たない。new演算子と共にコンストラクターとして使用できない。
  • [[Call]]内部メソッドを持たない。関数として呼び出すことができない。

Atomicsオブジェクトは、共有メモリ配列セル上で不可分に(原子的に)動作する関数、およびエージェントがプリミティブイベントを待機しディスパッチできるようにする関数を提供します。規律をもって使用される場合、Atomics関数は、共有メモリを通じて通信するマルチエージェントプログラムが、並列CPU上であってもよく理解された順序で実行できるようにします。共有メモリ通信を支配する規則は、下記で定義されるメモリモデルによって提供されます。

Note

ECMAScriptにおける共有メモリのプログラミングおよび実装のための参考ガイドラインについては、メモリモデル節の末尾の注記を参照してください。

25.4.1 Waiter Record

Waiter Recordとは、Atomics.waitまたはAtomics.waitAsyncへの特定の呼び出しを表すために使用されるRecord値です。

Waiter Recordは、Table 73 に列挙されるフィールドを持ちます。

Table 73: Waiter Record Fields
フィールド名 意味
[[AgentSignifier]] エージェントsignifier Atomics.waitまたはAtomics.waitAsyncを呼び出したエージェント。
[[PromiseCapability]] PromiseCapability Recordまたは blocking Atomics.waitAsyncへの呼び出しを表す場合は結果のpromise、そうでない場合は blocking
[[TimeoutTime]] 非負の拡張数学値 タイムアウトが引き起こされ得る最も早い時刻。時刻値を使用して計算される。
[[Result]] "ok" または "timed-out" 呼び出しの戻り値。

25.4.2 WaiterList Record

WaiterList Recordは、Atomics.waitAtomics.waitAsync、およびAtomics.notifyを介したエージェントの待機と通知を説明するために使用されます。

WaiterList Recordは、Table 74 に列挙されるフィールドを持ちます。

Table 74: WaiterList Record Fields
フィールド名 意味
[[Waiters]] Waiter RecordList このWaiterListに関連付けられた位置で待機しているAtomics.waitまたはAtomics.waitAsyncへの呼び出し。
[[MostRecentLeaveEvent]] Synchronizeイベントまたは empty そのクリティカルセクションから最後に退出したイベント、またはそのクリティカルセクションに一度も入ったことがない場合は empty

同じエージェントsignifierを持つ複数のWaiter RecordがWaiterList内に存在できます。

エージェントクラスターはWaiterList Recordのストアを持ちます。このストアは (block, i) によって索引付けされます。ここで blockShared Data Blockであり、iblock のメモリ内へのバイトオフセットです。WaiterList Recordはエージェント非依存です。(block, i) によるWaiterList Recordのストア内の検索は、エージェントクラスター内の任意のエージェントで同じWaiterList Recordを結果とします。

各WaiterList Recordは、評価中にそのWaiterList Recordへの排他的アクセスを制御するクリティカルセクションを持ちます。一度に1つのエージェントだけがWaiterList Recordのクリティカルセクションに入ることができます。WaiterList Recordのクリティカルセクションへの入退出は、抽象操作EnterCriticalSectionおよびLeaveCriticalSectionによって制御されます。待機エージェントの追加と削除、エージェントリストの走査、リスト上のエージェントの一時停止と通知、Synchronizeイベントの設定と取得といったWaiterList Record上の操作は、そのWaiterList Recordのクリティカルセクションに入ったエージェントによってのみ実行できます。

25.4.3 Atomicsのための抽象操作

25.4.3.1 ValidateIntegerTypedArray ( typedArray, waitable )

The abstract operation ValidateIntegerTypedArray takes arguments typedArray (ECMAScript言語値) and waitable (Boolean) and returns TypedArray With Buffer Witness Recordを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. taRecord を ? ValidateTypedArray(typedArray, unordered) とする。
  2. NOTE: typedArray のバッキングバッファーが拡張可能なSharedArrayBufferである場合、境界チェックは同期操作ではありません。
  3. waitabletrue の場合、
    1. typedArray.[[TypedArrayName]]"Int32Array""BigInt64Array" のいずれでもない場合、TypeError 例外をスローする。
  4. そうでなければ、
    1. typeTypedArrayElementType(typedArray) とする。
    2. IsUnclampedIntegerElementType(type) が false であり、IsBigIntElementType(type) が false である場合、TypeError 例外をスローする。
  5. taRecord を返す。

25.4.3.2 ValidateAtomicAccess ( taRecord, requestIndex )

The abstract operation ValidateAtomicAccess takes arguments taRecord (a TypedArray With Buffer Witness Record) and requestIndex (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. It performs the following steps when called:

  1. lengthTypedArrayLength(taRecord) とする。
  2. accessIndex を ? ToIndex(requestIndex) とする。
  3. Assert: accessIndex ≥ 0 である。
  4. accessIndexlength の場合、RangeError 例外をスローする。
  5. typedArraytaRecord.[[Object]] とする。
  6. elementSizeTypedArrayElementSize(typedArray) とする。
  7. offsettypedArray.[[ByteOffset]] とする。
  8. (accessIndex × elementSize) + offset を返す。

25.4.3.3 ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex )

The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and requestIndex (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. It performs the following steps when called:

  1. taRecord を ? ValidateIntegerTypedArray(typedArray, false) とする。
  2. ValidateAtomicAccess(taRecord, requestIndex) を返す。

25.4.3.4 RevalidateAtomicAccess ( typedArray, byteIndexInBuffer )

The abstract operation RevalidateAtomicAccess takes arguments typedArray (a TypedArray) and byteIndexInBuffer (a non-negative integer) and returns either a normal completion containing unused or a throw completion. この操作は、Atomicsメソッドですべての引数強制変換が実行された後、原子的操作のためにバッキングバッファー内のインデックスを再検証します。これは、引数強制変換が任意の副作用を持ち得て、それによりバッファーが範囲外になる可能性があるためです。この操作は、typedArray のバッキングバッファーがSharedArrayBufferである場合にはスローしません。 It performs the following steps when called:

  1. taRecordMakeTypedArrayWithBufferWitnessRecord(typedArray, unordered) とする。
  2. NOTE: typedArray のバッキングバッファーが拡張可能なSharedArrayBufferである場合、境界チェックは同期操作ではありません。
  3. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
  4. Assert: byteIndexInBuffertypedArray.[[ByteOffset]] である。
  5. byteIndexInBuffertaRecord.[[CachedBufferByteLength]] の場合、RangeError 例外をスローする。
  6. unused を返す。

25.4.3.5 GetWaiterList ( block, i )

The abstract operation GetWaiterList takes arguments block (Shared Data Block) and i (4で割り切れる非負整数) and returns WaiterList Record. It performs the following steps when called:

  1. Assert: i および i + 3 は block のメモリ内の有効なバイトオフセットである。
  2. ペア (block, i) によって参照されるWaiterList Recordを返す。

25.4.3.6 EnterCriticalSection ( waiterList )

The abstract operation EnterCriticalSection takes argument waiterList (WaiterList Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントはいかなるWaiterList Recordクリティカルセクションにもいない。
  2. waiterListクリティカルセクションにエージェントがいなくなるまで待ち、その後 waiterListクリティカルセクションに入る(他のエージェントが入ることを許さない)。
  3. waiterList.[[MostRecentLeaveEvent]]empty でない場合、
    1. NOTE: 少なくとも一度クリティカルセクションに入った waiterList は、LeaveCriticalSectionによって設定されたSynchronizeイベントを持ちます。
    2. agentRecord を周囲のエージェントのAgent Recordとする。
    3. executionagentRecord.[[CandidateExecution]] とする。
    4. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
    5. enterEvent を新しいSynchronizeイベントとする。
    6. enterEventeventsRecord.[[EventList]] に追加する。
    7. (waiterList.[[MostRecentLeaveEvent]], enterEvent) を eventsRecord.[[AgentSynchronizesWith]] に追加する。
  4. unused を返す。

EnterCriticalSectionは、クリティカルセクションに入ろうとするエージェントが別のエージェントがそこから退出するのを待たなければならない場合、競合を持ちます。競合がない場合、EnterCriticalSection呼び出しのFIFO順序は観察可能です。競合がある場合、実装は任意の順序を選択してもよいですが、エージェントを無期限に待たせてはなりません。

25.4.3.7 LeaveCriticalSection ( waiterList )

The abstract operation LeaveCriticalSection takes argument waiterList (WaiterList Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. agentRecord を周囲のエージェントのAgent Recordとする。
  3. executionagentRecord.[[CandidateExecution]] とする。
  4. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
  5. leaveEvent を新しいSynchronizeイベントとする。
  6. leaveEventeventsRecord.[[EventList]] に追加する。
  7. waiterList.[[MostRecentLeaveEvent]]leaveEvent に設定する。
  8. waiterListクリティカルセクションを出る。
  9. unused を返す。

25.4.3.8 AddWaiter ( waiterList, waiterRecord )

The abstract operation AddWaiter takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. Assert: waiterList.[[Waiters]] 内には、[[PromiseCapability]]フィールドが waiterRecord.[[PromiseCapability]] であり、[[AgentSignifier]]フィールドが waiterRecord.[[AgentSignifier]] であるWaiter Recordは存在しない。
  3. waiterRecordwaiterList.[[Waiters]] に追加する。
  4. unused を返す。

25.4.3.9 RemoveWaiter ( waiterList, waiterRecord )

The abstract operation RemoveWaiter takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. Assert: waiterList.[[Waiters]]waiterRecord を含む。
  3. waiterRecordwaiterList.[[Waiters]] から削除する。
  4. unused を返す。

25.4.3.10 RemoveWaiters ( waiterList, count )

The abstract operation RemoveWaiters takes arguments waiterList (WaiterList Record) and count (非負整数または +∞) and returns Waiter RecordList. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. lenwaiterList.[[Waiters]] 内の要素数とする。
  3. countmin(count, len) に設定する。
  4. waiters を、waiterList.[[Waiters]] の最初の count 個の要素を要素とするListとする。
  5. waiterList.[[Waiters]] の最初の count 個の要素を削除する。
  6. waiters を返す。

25.4.3.11 SuspendThisAgent ( waiterList, waiterRecord )

The abstract operation SuspendThisAgent takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. Assert: waiterList.[[Waiters]]waiterRecord を含む。
  3. thisAgentAgentSignifier() とする。
  4. Assert: waiterRecord.[[AgentSignifier]]thisAgent である。
  5. Assert: waiterRecord.[[PromiseCapability]]blocking である。
  6. Assert: AgentCanSuspend() は true である。
  7. LeaveCriticalSection(waiterList) を実行し、時刻が waiterRecord.[[TimeoutTime]] になるまで周囲のエージェントを一時停止する。この複合操作は、クリティカルセクションを出た後、一時停止が有効になる前に到着した通知が失われないような方法で実行される。周囲のエージェントは、タイムアウトによって、または別のエージェントが引数 waiterList および thisAgentNotifyWaiterを呼び出すこと(すなわち、Atomics.notifyへの呼び出しを介して)によってのみ、一時停止から復帰できる。
  8. EnterCriticalSection(waiterList) を実行する。
  9. unused を返す。

25.4.3.12 NotifyWaiter ( waiterList, waiterRecord )

The abstract operation NotifyWaiter takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. waiterRecord.[[PromiseCapability]]blocking の場合、
    1. signifierが waiterRecord.[[AgentSignifier]] であるエージェントを一時停止から起こす。
    2. NOTE: これにより、そのエージェントはSuspendThisAgent内で実行を再開します。
  3. そうでなく AgentSignifier() が waiterRecord.[[AgentSignifier]] である場合、
    1. promiseCapabilitywaiterRecord.[[PromiseCapability]] とする。
    2. Call(promiseCapability.[[Resolve]], undefined, « waiterRecord.[[Result]] ») を実行する。
  4. そうでなければ、
    1. EnqueueResolveInAgentJob(waiterRecord.[[AgentSignifier]], waiterRecord.[[PromiseCapability]], waiterRecord.[[Result]]) を実行する。
  5. unused を返す。
Note

エージェントは、別のエージェントのpromise capabilityに対して、それをホストに渡すことを超えるいかなる形でもアクセスしてはなりません。

25.4.3.13 EnqueueResolveInAgentJob ( agentSignifier, promiseCapability, resolution )

The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (エージェントsignifier), promiseCapability (PromiseCapability Record), and resolution ("ok" または "timed-out") and returns unused. It performs the following steps when called:

  1. resolveJob を、agentSignifierpromiseCapability、および resolution を捕捉し、呼び出されたときに次の手順を実行する、パラメーターを持たない新しいJob Abstract Closureとする:
    1. Assert: AgentSignifier() は agentSignifier である。
    2. Call(promiseCapability.[[Resolve]], undefined, « resolution ») を実行する。
    3. unused を返す。
  2. realmInTargetAgent を ! GetFunctionRealm(promiseCapability.[[Resolve]]) とする。
  3. Assert: agentSignifierrealmInTargetAgent.[[AgentSignifier]] である。
  4. HostEnqueueGenericJob(resolveJob, realmInTargetAgent) を実行する。
  5. unused を返す。

25.4.3.14 DoWait ( mode, typedArray, index, value, timeout )

The abstract operation DoWait takes arguments mode (sync または async), typedArray (ECMAScript言語値), index (ECMAScript言語値), value (ECMAScript言語値), and timeout (ECMAScript言語値) and returns Object、"not-equal""timed-out"、または "ok" のいずれかを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. taRecord を ? ValidateIntegerTypedArray(typedArray, true) とする。
  2. buffertaRecord.[[Object]].[[ViewedArrayBuffer]] とする。
  3. IsSharedArrayBuffer(buffer) が false の場合、TypeError 例外をスローする。
  4. byteIndexInBuffer を ? ValidateAtomicAccess(taRecord, index) とする。
  5. arrayTypeNametypedArray.[[TypedArrayName]] とする。
  6. arrayTypeName"BigInt64Array" である場合、expected を ? ToBigInt64(value) とする。
  7. そうでなければ、expected を ? ToInt32(value) とする。
  8. timeoutNumber を ? ToNumber(timeout) とする。
  9. timeoutNumberNaN または +∞𝔽 のいずれかである場合、realTimeout を +∞ とする。
  10. そうでなく timeoutNumber-∞𝔽 である場合、realTimeout を0とする。
  11. そうでなければ、realTimeoutmax((timeoutNumber), 0) とする。
  12. modesync であり、AgentCanSuspend() が false である場合、TypeError 例外をスローする。
  13. blockbuffer.[[ArrayBufferData]] とする。
  14. waiterListGetWaiterList(block, byteIndexInBuffer) とする。
  15. modesync の場合、
    1. promiseCapabilityblocking とする。
    2. resultObjectundefined とする。
  16. そうでなければ、
    1. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
    2. resultObjectOrdinaryObjectCreate(%Object.prototype%) とする。
  17. EnterCriticalSection(waiterList) を実行する。
  18. elementTypeTypedArrayElementType(typedArray) とする。
  19. witnessGetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst) とする。
  20. expectedwitness の場合、
    1. LeaveCriticalSection(waiterList) を実行する。
    2. modesync の場合、"not-equal" を返す。
    3. CreateDataPropertyOrThrow(resultObject, "async", false) を実行する。
    4. CreateDataPropertyOrThrow(resultObject, "value", "not-equal") を実行する。
    5. resultObject を返す。
  21. realTimeout = 0 かつ modeasync である場合、
    1. NOTE: 同期即時タイムアウトには特別な処理はありません。非同期即時タイムアウトは、早く失敗し不要なPromiseジョブを避けるために特別な処理を持ちます。
    2. LeaveCriticalSection(waiterList) を実行する。
    3. CreateDataPropertyOrThrow(resultObject, "async", false) を実行する。
    4. CreateDataPropertyOrThrow(resultObject, "value", "timed-out") を実行する。
    5. resultObject を返す。
  22. thisAgentAgentSignifier() とする。
  23. now を現在時刻を識別する時刻値(UTC)とする。
  24. additionalTimeout を実装定義の非負数学値とする。
  25. timeoutTime(now) + realTimeout + additionalTimeout とする。
  26. NOTE: realTimeout が +∞ の場合、timeoutTime も +∞ です。
  27. waiterRecord を新しいWaiter Record { [[AgentSignifier]]: thisAgent, [[PromiseCapability]]: promiseCapability, [[TimeoutTime]]: timeoutTime, [[Result]]: "ok" } とする。
  28. AddWaiter(waiterList, waiterRecord) を実行する。
  29. modesync の場合、
    1. SuspendThisAgent(waiterList, waiterRecord) を実行する。
  30. そうでなく timeoutTime が有限である場合、
    1. EnqueueAtomicsWaitAsyncTimeoutJob(waiterList, waiterRecord) を実行する。
  31. LeaveCriticalSection(waiterList) を実行する。
  32. modesync の場合、waiterRecord.[[Result]] を返す。
  33. CreateDataPropertyOrThrow(resultObject, "async", true) を実行する。
  34. CreateDataPropertyOrThrow(resultObject, "value", promiseCapability.[[Promise]]) を実行する。
  35. resultObject を返す。
Note

additionalTimeout は、電力消費の削減やタイミング攻撃を緩和するためのタイマー解像度の粗化など、必要に応じて実装がタイムアウトを延長することを可能にします。この値はDoWaitの呼び出しごとに異なってもよいです。

25.4.3.15 EnqueueAtomicsWaitAsyncTimeoutJob ( waiterList, waiterRecord )

The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. timeoutJob を、waiterList および waiterRecord を捕捉し、呼び出されたときに次の手順を実行する、パラメーターを持たない新しいJob Abstract Closureとする:
    1. EnterCriticalSection(waiterList) を実行する。
    2. waiterList.[[Waiters]]waiterRecord を含む場合、
      1. timeOfJobExecution を現在時刻を識別する時刻値(UTC)とする。
      2. Assert: (timeOfJobExecution) ≥ waiterRecord.[[TimeoutTime]] である(時刻値の潜在的な非単調性を無視する)。
      3. waiterRecord.[[Result]]"timed-out" に設定する。
      4. RemoveWaiter(waiterList, waiterRecord) を実行する。
      5. NotifyWaiter(waiterList, waiterRecord) を実行する。
    3. LeaveCriticalSection(waiterList) を実行する。
    4. unused を返す。
  2. now を現在時刻を識別する時刻値(UTC)とする。
  3. currentRealm を現在のRealm Recordとする。
  4. HostEnqueueTimeoutJob(timeoutJob, currentRealm, 𝔽(waiterRecord.[[TimeoutTime]]) - now) を実行する。
  5. unused を返す。

25.4.3.16 AtomicCompareExchangeInSharedBlock ( block, byteIndexInBuffer, elementSize, expectedBytes, replacementBytes )

The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (Shared Data Block), byteIndexInBuffer (整数), elementSize (非負整数), expectedBytes (バイト値のList), and replacementBytes (バイト値のList) and returns バイト値のList. It performs the following steps when called:

  1. agentRecord を周囲のエージェントのAgent Recordとする。
  2. executionagentRecord.[[CandidateExecution]] とする。
  3. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
  4. rawBytesRead を、要素が非決定的に選択されたバイト値である、長さ elementSizeListとする。
  5. NOTE: 実装では、rawBytesRead は基盤ハードウェア上のload-link、load-exclusive、またはread-modify-write命令のオペランドの結果です。この非決定性は、弱い一貫性を持つハードウェアの観察可能な振る舞いを記述するためのメモリモデルの意味論上の規定です。
  6. NOTE: 期待値と読み取られた値の比較は、期待値が読み取られた値と等しくない場合に不必要に強い同期を避けるため、read-modify-write変更関数の外側で実行されます。
  7. ByteListEqual(rawBytesRead, expectedBytes) が true の場合、
    1. second を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (oldBytes, newBytes) を持つ新しいread-modify-write変更関数とする:
      1. newBytes を返す。
    2. eventReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize, [[Payload]]: replacementBytes, [[ModifyOp]]: second } とする。
  8. そうでなければ、
    1. eventReadSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize } とする。
  9. eventeventsRecord.[[EventList]] に追加する。
  10. Chosen Value Record { [[Event]]: event, [[ChosenValue]]: rawBytesRead } を execution.[[ChosenValues]] に追加する。
  11. rawBytesRead を返す。

25.4.3.17 AtomicReadModifyWrite ( typedArray, index, value, op )

The abstract operation AtomicReadModifyWrite takes arguments typedArray (ECMAScript言語値), index (ECMAScript言語値), value (ECMAScript言語値), and op (read-modify-write変更関数) and returns NumberまたはBigIntのいずれかを含む正常完了、またはスロー完了のいずれか. op はバイト値のListを2つ引数として取り、バイト値のListを返します。この操作は、値を原子的にロードし、それを別の値と結合し、その結合を格納します。ロードされた値を返します。 It performs the following steps when called:

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. typedArray.[[ContentType]]bigint である場合、coerced を ? ToBigInt(value) とする。
  3. そうでなければ、coerced𝔽(? ToIntegerOrInfinity(value)) とする。
  4. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  5. buffertypedArray.[[ViewedArrayBuffer]] とする。
  6. elementTypeTypedArrayElementType(typedArray) とする。
  7. GetModifySetValueInBuffer(buffer, byteIndexInBuffer, elementType, coerced, op) を返す。

25.4.3.18 ByteListBitwiseOp ( op, xBytes, yBytes )

The abstract operation ByteListBitwiseOp takes arguments op (&^、または |), xBytes (バイト値のList), and yBytes (バイト値のList) and returns バイト値のList. この操作は、引数のすべてのバイト値に対してビット単位演算を原子的に実行し、バイト値のListを返します。 It performs the following steps when called:

  1. Assert: xBytesyBytes は同じ数の要素を持つ。
  2. result を新しい空のListとする。
  3. i を0とする。
  4. xBytes の各要素 xByte について、次を行う:
    1. yByteyBytes[i] とする。
    2. op& である場合、
      1. resultByte を、xByteyByte にビット単位AND演算を適用した結果とする。
    3. そうでなく op^ である場合、
      1. resultByte を、xByteyByte にビット単位排他的OR(XOR)演算を適用した結果とする。
    4. そうでなければ、
      1. Assert: op| である。
      2. resultByte を、xByteyByte にビット単位包含OR演算を適用した結果とする。
    5. ii + 1 に設定する。
    6. resultByteresult に追加する。
  5. result を返す。

25.4.3.19 ByteListEqual ( xBytes, yBytes )

The abstract operation ByteListEqual takes arguments xBytes (バイト値のList) and yBytes (バイト値のList) and returns Boolean. It performs the following steps when called:

  1. xBytesyBytes が同じ数の要素を持たない場合、false を返す。
  2. i を0とする。
  3. xBytes の各要素 xByte について、次を行う:
    1. yByteyBytes[i] とする。
    2. xByteyByte の場合、false を返す。
    3. ii + 1 に設定する。
  4. true を返す。

25.4.4 Atomics.add ( typedArray, index, value )

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

  1. add を、typedArray を捕捉し、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. typeTypedArrayElementType(typedArray) とする。
    2. agentRecord を周囲のエージェントのAgent Recordとする。
    3. isLittleEndianagentRecord.[[LittleEndian]] とする。
    4. xRawBytesToNumeric(type, xBytes, isLittleEndian) とする。
    5. yRawBytesToNumeric(type, yBytes, isLittleEndian) とする。
    6. x がNumberである場合、
      1. sumNumber::add(x, y) とする。
    7. そうでなければ、
      1. Assert: x はBigIntである。
      2. sumBigInt::add(x, y) とする。
    8. sumBytesNumericToRawBytes(type, sum, isLittleEndian) とする。
    9. Assert: sumBytesxBytes、および yBytes は同じ数の要素を持つ。
    10. sumBytes を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, add) を返す。

25.4.5 Atomics.and ( typedArray, index, value )

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

  1. and を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. ByteListBitwiseOp(&, xBytes, yBytes) を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, and) を返す。

25.4.6 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue )

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

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. buffertypedArray.[[ViewedArrayBuffer]] とする。
  3. blockbuffer.[[ArrayBufferData]] とする。
  4. typedArray.[[ContentType]]bigint である場合、
    1. expected を ? ToBigInt(expectedValue) とする。
    2. replacement を ? ToBigInt(replacementValue) とする。
  5. そうでなければ、
    1. expected𝔽(? ToIntegerOrInfinity(expectedValue)) とする。
    2. replacement𝔽(? ToIntegerOrInfinity(replacementValue)) とする。
  6. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  7. elementTypeTypedArrayElementType(typedArray) とする。
  8. elementSizeTypedArrayElementSize(typedArray) とする。
  9. agentRecord を周囲のエージェントのAgent Recordとする。
  10. isLittleEndianagentRecord.[[LittleEndian]] とする。
  11. expectedBytesNumericToRawBytes(elementType, expected, isLittleEndian) とする。
  12. replacementBytesNumericToRawBytes(elementType, replacement, isLittleEndian) とする。
  13. IsSharedArrayBuffer(buffer) が true の場合、
    1. rawBytesReadAtomicCompareExchangeInSharedBlock(block, byteIndexInBuffer, elementSize, expectedBytes, replacementBytes) とする。
  14. そうでなければ、
    1. rawBytesRead を、block[byteIndexInBuffer] から始まる elementSize バイトの列を要素とする、長さ elementSizeListとする。
    2. ByteListEqual(rawBytesRead, expectedBytes) が true の場合、
      1. replacementBytes の個々のバイトを、block[byteIndexInBuffer] から始めて block に格納する。
  15. RawBytesToNumeric(elementType, rawBytesRead, isLittleEndian) を返す。

25.4.7 Atomics.exchange ( typedArray, index, value )

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

  1. second を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (oldBytes, newBytes) を持つ新しいread-modify-write変更関数とする:
    1. newBytes を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, second) を返す。

25.4.8 Atomics.isLockFree ( size )

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

  1. n を ? ToIntegerOrInfinity(size) とする。
  2. agentRecord を周囲のエージェントのAgent Recordとする。
  3. n = 1 の場合、agentRecord.[[IsLockFree1]] を返す。
  4. n = 2 の場合、agentRecord.[[IsLockFree2]] を返す。
  5. n = 4 の場合、true を返す。
  6. n = 8 の場合、agentRecord.[[IsLockFree8]] を返す。
  7. false を返す。
Note

この関数は最適化プリミティブです。その直感は、サイズ n バイトのデータ上の原子的プリミティブ(compareExchangeloadstoreaddsubandorxor、またはexchange)の原子的手順が、周囲のエージェントがそのデータを構成する n バイトの外側のロックを取得することなしに実行される場合、Atomics.isLockFree(n) は true を返す、というものです。高性能アルゴリズムは、クリティカルセクションでロックまたは原子的操作のどちらを使用するかを決定するためにこの関数を使用します。原子的プリミティブがロックフリーでない場合、アルゴリズムが独自のロックを提供する方がしばしば効率的です。

Atomics.isLockFree(4) は、既知の関連ハードウェアすべてでサポート可能であるため、常に true を返します。これを仮定できることは、一般にプログラムを単純化します。

この関数によって返される値にかかわらず、すべての原子的操作は原子的であることが保証されます。例えば、操作の途中で可視的な操作が発生すること(例えば「tearing」)は決してありません。

25.4.9 Atomics.load ( typedArray, index )

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

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  3. buffertypedArray.[[ViewedArrayBuffer]] とする。
  4. elementTypeTypedArrayElementType(typedArray) とする。
  5. GetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst) を返す。

25.4.10 Atomics.or ( typedArray, index, value )

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

  1. or を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. ByteListBitwiseOp(|, xBytes, yBytes) を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, or) を返す。

25.4.11 Atomics.store ( typedArray, index, value )

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

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. typedArray.[[ContentType]]bigint である場合、coerced を ? ToBigInt(value) とする。
  3. そうでなければ、coerced𝔽(? ToIntegerOrInfinity(value)) とする。
  4. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  5. buffertypedArray.[[ViewedArrayBuffer]] とする。
  6. elementTypeTypedArrayElementType(typedArray) とする。
  7. SetValueInBuffer(buffer, byteIndexInBuffer, elementType, coerced, true, seq-cst) を実行する。
  8. coerced を返す。

25.4.12 Atomics.sub ( typedArray, index, value )

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

  1. subtract を、typedArray を捕捉し、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. typeTypedArrayElementType(typedArray) とする。
    2. agentRecord を周囲のエージェントのAgent Recordとする。
    3. isLittleEndianagentRecord.[[LittleEndian]] とする。
    4. xRawBytesToNumeric(type, xBytes, isLittleEndian) とする。
    5. yRawBytesToNumeric(type, yBytes, isLittleEndian) とする。
    6. x がNumberである場合、
      1. differenceNumber::subtract(x, y) とする。
    7. そうでなければ、
      1. Assert: x はBigIntである。
      2. differenceBigInt::subtract(x, y) とする。
    8. differenceBytesNumericToRawBytes(type, difference, isLittleEndian) とする。
    9. Assert: differenceBytesxBytes、および yBytes は同じ数の要素を持つ。
    10. differenceBytes を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, subtract) を返す。

25.4.13 Atomics.wait ( typedArray, index, value, timeout )

この関数は、周囲のエージェントを待機キューに入れて、通知されるか待機がタイムアウトするまで一時停止し、それらの場合を区別するStringを返します。

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

  1. DoWait(sync, typedArray, index, value, timeout) を返す。

25.4.14 Atomics.waitAsync ( typedArray, index, value, timeout )

この関数は、呼び出し元エージェントが通知されるかタイムアウトに到達したときに解決されるPromiseを返します。

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

  1. DoWait(async, typedArray, index, value, timeout) を返す。

25.4.15 Atomics.notify ( typedArray, index, count )

この関数は、待機キューで眠っているいくつかのエージェントに通知します。

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

  1. taRecord を ? ValidateIntegerTypedArray(typedArray, true) とする。
  2. byteIndexInBuffer を ? ValidateAtomicAccess(taRecord, index) とする。
  3. countundefined の場合、
    1. count を +∞ に設定する。
  4. そうでなければ、
    1. intCount を ? ToIntegerOrInfinity(count) とする。
    2. countmax(intCount, 0) に設定する。
  5. buffertypedArray.[[ViewedArrayBuffer]] とする。
  6. blockbuffer.[[ArrayBufferData]] とする。
  7. IsSharedArrayBuffer(buffer) が false の場合、+0𝔽 を返す。
  8. waiterListGetWaiterList(block, byteIndexInBuffer) とする。
  9. EnterCriticalSection(waiterList) を実行する。
  10. waitersRemoveWaiters(waiterList, count) とする。
  11. waiters の各要素 waiterRecord について、次を行う:
    1. NotifyWaiter(waiterList, waiterRecord) を実行する。
  12. LeaveCriticalSection(waiterList) を実行する。
  13. nwaiters 内の要素数とする。
  14. 𝔽(n) を返す。

25.4.16 Atomics.xor ( typedArray, index, value )

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

  1. xor を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. ByteListBitwiseOp(^, xBytes, yBytes) を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, xor) を返す。

25.4.17 Atomics [ %Symbol.toStringTag% ]

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

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

25.5 JSONオブジェクト

JSONオブジェクトは:

  • %JSON%である。
  • グローバルオブジェクト"JSON"プロパティの初期値である。
  • 通常のオブジェクトである。
  • JSONテキストを解析および構築するために使用される2つの関数、parsestringifyを含む。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • [[Construct]]内部メソッドを持たない。new演算子と共にコンストラクターとして使用できない。
  • [[Call]]内部メソッドを持たない。関数として呼び出すことができない。

JSONデータ交換形式はECMA-404で定義されています。この仕様で使用されるJSON交換形式は、ECMA-404によって記述されたものと正確に同じです。JSON.parseおよびJSON.stringifyの適合実装は、ECMA-404仕様で記述された正確な交換形式を、その形式に対するいかなる削除または拡張もなしにサポートしなければなりません。

25.5.1 JSON.isRawJSON ( obj )

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

  1. obj がObjectであり、obj[[IsRawJSON]] 内部スロットを持つ場合、true を返す。
  2. false を返す。

25.5.2 JSON.parse ( text [ , reviver ] )

この関数はJSONテキスト(JSON形式のString)を解析し、ECMAScript言語値を生成します。JSON形式は、ECMAScriptリテラル、Array Initializer、およびObject Initializerの構文に似た構文で、リテラル、配列、およびオブジェクトを表します。解析後、JSONオブジェクトはECMAScriptオブジェクトとして実現されます。JSON配列はECMAScript Arrayインスタンスとして実現されます。JSON文字列、数値、真偽値、およびnullは、ECMAScriptのString、Number、Boolean、および null として実現されます。

任意の reviver パラメーターは、結果をフィルターし変換できる関数です。解析によって生成される各値について、reviver は3つの引数(関連付けられたプロパティキー、値、およびコンテキストオブジェクト)で呼び出されます。プロパティが変更されておらず、その値がプリミティブである場合、提供されるコンテキストオブジェクトは、対応するParse Nodeのソーステキストを含む"source"プロパティを持ちます。呼び出しが undefined を返す場合、そのプロパティは削除されます。そうでない場合、そのプロパティは戻り値を使用するように再定義されます。

  1. jsonString を ? ToString(text) とする。
  2. parseResult を ? ParseJSON(jsonString) とする。
  3. unfilteredparseResult.[[Value]] とする。
  4. IsCallable(reviver) が false の場合、unfiltered を返す。
  5. rootOrdinaryObjectCreate(%Object.prototype%) とする。
  6. rootName を空のStringとする。
  7. CreateDataPropertyOrThrow(root, rootName, unfiltered) を実行する。
  8. snapshotCreateJSONParseRecord(parseResult.[[ParseNode]], rootName, unfiltered) とする。
  9. InternalizeJSONProperty(root, rootName, reviver, snapshot) を返す。

この関数の"length"プロパティは 2𝔽 です。

25.5.2.1 ParseJSON ( text )

The abstract operation ParseJSON takes argument text (String) and returns フィールド [[ParseNode]]Parse Node)および [[Value]](ECMAScript言語値)を持つRecordを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. StringToCodePoints(text) がECMA-404で指定される有効なJSONテキストでない場合、SyntaxError 例外をスローする。
  2. scriptString"("text、および ");" の文字列連結とする。
  3. scriptParseText(scriptString, Script) とする。
  4. NOTE: 13.2.5.1 で定義される早期エラー規則は、上記のParseTextの呼び出しについて特別な扱いを持ちます。
  5. Assert: scriptParse Nodeである。
  6. result を ! Evaluation of script とする。
  7. NOTE: 13.2.5.6 で定義されるPropertyDefinitionEvaluation意味論は、上記の評価について特別な扱いを持ちます。
  8. Assert: result はString、Number、Boolean、ArrayLiteralまたはObjectLiteralのいずれかによって定義されるObject、または null のいずれかである。
  9. Record { [[ParseNode]]: script, [[Value]]: result } を返す。

JSON.parseの適合実装がJSON文法を拡張することは許されません。実装が変更または拡張されたJSON交換形式をサポートしたい場合、別の解析関数を定義することによってそうしなければなりません。

Note 1

有効なJSONテキストはECMAScriptのPrimaryExpression構文のサブセットです。手順 1jsonString がそのサブセットに適合することを検証し、手順 8 は評価が適切な型の値を返すことを表明します。

しかし、13.2.5.6 はParseJSON中に異なる振る舞いをするため、同じソーステキストがJSONとしてではなくPrimaryExpressionとして評価された場合、異なる結果を生成する可能性があります。さらに、オブジェクトリテラル内の重複する"__proto__"プロパティに対するEarly ErrorもParseJSON中には適用されないため、文法に一致しているにもかかわらず、ParseJSONによって受け入れられるすべてのテキストがPrimaryExpressionとして有効であるわけではありません。

Note 2

オブジェクト内に重複する名前Stringがある場合、字句的に先行する同じキーの値は上書きされます。

25.5.2.2 JSON Parse Record

JSON Parse Recordとは、JSONテキストから解析された値の初期状態を記述するために使用されるRecord値です。

JSON Parse Recordは、Table 75 に列挙されるフィールドを持ちます。

Table 75: JSON Parse Record Fields
フィールド名 意味
[[ParseNode]] Parse Node コンテキストParse Node
[[Key]] プロパティ名 [[Value]]が関連付けられているプロパティ名。
[[Value]] ECMAScript言語値 [[ParseNode]]の評価によって生成された値。
[[Elements]] JSON Parse RecordList [[Value]]がArrayである場合、これは[[Value]]の要素に対応するJSON Parse Recordを含む。そうでない場合、これは空のListである。
[[Entries]] JSON Parse RecordList [[Value]]が非Array Objectである場合、これは[[Value]]のエントリーに対応するJSON Parse Recordを含む。そうでない場合、これは空のListである。

25.5.2.3 CreateJSONParseRecord ( parseNode, key, val )

The abstract operation CreateJSONParseRecord takes arguments parseNode (Parse Node), key (プロパティ名), and val (ECMAScript言語値) and returns JSON Parse Record. JSONテキストから解析された parseNode と、その評価によって生成された val を再帰的に結合します。 It performs the following steps when called:

  1. typedValNodeShallowestContainedJSONValue(parseNode) とする。
  2. Assert: typedValNodeempty でない。
  3. elements を新しい空のListとする。
  4. entries を新しい空のListとする。
  5. val がObjectである場合、
    1. isArray を ! IsArray(val) とする。
    2. isArraytrue の場合、
      1. Assert: typedValNodeArrayLiteral Parse Nodeである。
      2. contentNodestypedValNodeJSONArrayLiteralContentNodesとする。
      3. lencontentNodes 内の要素数とする。
      4. valLen を ! LengthOfArrayLike(val) とする。
      5. Assert: valLenlen である。
      6. index を0とする。
      7. index < len の間、繰り返す:
        1. propName を ! ToString(𝔽(index)) とする。
        2. elementParseRecordCreateJSONParseRecord(contentNodes[index], propName, ! Get(val, propName)) とする。
        3. elementParseRecordelements に追加する。
        4. indexindex + 1 に設定する。
    3. そうでなければ、
      1. Assert: typedValNodeObjectLiteral Parse Nodeである。
      2. propertyNodestypedValNodePropertyDefinitionNodesとする。
      3. NOTE: val はJSONテキストから生成され変更されていないため、そのすべてのプロパティキーはStringであり、網羅的に列挙されます。
      4. keys を ! EnumerableOwnProperties(val, key) とする。
      5. keys の各String propertyKey について、次を行う:
        1. NOTE: 単一のオブジェクトに対して同じ名前の複数の名前/値ペアを指定するJSONテキスト(例えば {"a":"lost","a":"kept"})の場合、結果のECMAScriptオブジェクトの対応するプロパティの値は、その名前を持つ最後のペアによって指定されます。
        2. propertyDefinitionempty とする。
        3. propertyNodes の各Parse Node propertyNode について、次を行う:
          1. propNamepropertyNodePropNameとする。
          2. propNamepropertyKey である場合、propertyDefinitionpropertyNode に設定する。
        4. Assert: propertyDefinition PropertyDefinition : PropertyName : AssignmentExpression である。
        5. propertyValueNodepropertyDefinitionAssignmentExpression とする。
        6. entryParseRecordCreateJSONParseRecord(propertyValueNode, propertyKey, ! Get(val, propertyKey)) とする。
        7. entryParseRecordentries に追加する。
  6. そうでなければ、
    1. Assert: typedValNodeArrayLiteral Parse Nodeでも ObjectLiteral Parse Nodeでもない。
  7. JSON Parse Record { [[ParseNode]]: typedValNode, [[Key]]: key, [[Value]]: val, [[Elements]]: elements, [[Entries]]: entries } を返す。

25.5.2.4 InternalizeJSONProperty ( holder, name, reviver, parseRecord )

The abstract operation InternalizeJSONProperty takes arguments holder (Object), name (String), reviver (関数オブジェクト), and parseRecord (JSON Parse Recordまたは empty) and returns ECMAScript言語値を含む正常完了またはスロー完了のいずれか.

Note

このアルゴリズムは、[[Delete]]またはCreateDataPropertyのいずれかが false を返しても、意図的に例外をスローしません。

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

  1. val を ? Get(holder, name) とする。
  2. contextOrdinaryObjectCreate(%Object.prototype%) とする。
  3. parseRecordJSON Parse Recordであり、SameValue(parseRecord.[[Value]], val) が true である場合、
    1. val がObjectでない場合、
      1. parseNodeparseRecord.[[ParseNode]] とする。
      2. Assert: parseNodeArrayLiteral Parse Nodeでも ObjectLiteral Parse Nodeでもない。
      3. sourceTextparseNode に一致したソーステキストとする。
      4. CreateDataPropertyOrThrow(context, "source", CodePointsToString(sourceText)) を実行する。
    2. elementRecordsparseRecord.[[Elements]] とする。
    3. entryRecordsparseRecord.[[Entries]] とする。
  4. そうでなければ、
    1. elementRecords を新しい空のListとする。
    2. entryRecords を新しい空のListとする。
  5. val がObjectである場合、
    1. isArray を ? IsArray(val) とする。
    2. isArraytrue の場合、
      1. elementRecordsLenelementRecords 内の要素数とする。
      2. len を ? LengthOfArrayLike(val) とする。
      3. index を0とする。
      4. index < len の間、繰り返す:
        1. propertyKey を ! ToString(𝔽(index)) とする。
        2. index < elementRecordsLen の場合、elementRecordelementRecords[index] とする。そうでなければ、elementRecordempty とする。
        3. newElement を ? InternalizeJSONProperty(val, propertyKey, reviver, elementRecord) とする。
        4. newElementundefined である場合、
          1. val.[[Delete]](propertyKey) を実行する。
        5. そうでなければ、
          1. CreateDataProperty(val, propertyKey, newElement) を実行する。
        6. indexindex + 1 に設定する。
    3. そうでなければ、
      1. keys を ? EnumerableOwnProperties(val, key) とする。
      2. keys の各String propertyKey について、次を行う:
        1. entryRecords の要素 entry であって entry.[[Key]]propertyKey であるものが存在する場合、entryRecordentry とする。そうでなければ、entryRecordempty とする。
        2. newElement を ? InternalizeJSONProperty(val, propertyKey, reviver, entryRecord) とする。
        3. newElementundefined である場合、
          1. val.[[Delete]](propertyKey) を実行する。
        4. そうでなければ、
          1. CreateDataProperty(val, propertyKey, newElement) を実行する。
  6. Call(reviver, holder, « name, val, context ») を返す。

25.5.2.5 Static Semantics: ShallowestContainedJSONValue ( root )

The abstract operation ShallowestContainedJSONValue takes argument root (Parse Node) and returns Parse Nodeまたは empty. root を根とする解析木を幅優先探索し、JSON値に対応する非終端記号のインスタンスである最初のノードを返します。そのようなノードが存在しない場合は empty を返します。 It performs the following steps when called:

  1. activeFunc をアクティブな関数オブジェクトとする。
  2. Assert: activeFuncJSON.parse組み込み関数オブジェクトである(JSON.parse を参照)。
  3. types を « NullLiteral, BooleanLiteral, NumericLiteral, StringLiteral, ArrayLiteral, ObjectLiteral, UnaryExpression » とする。
  4. unaryExpressionempty とする。
  5. queue を « root » とする。
  6. queue が空でない間、繰り返す:
    1. candidatequeue の最初の要素とする。
    2. queue から最初の要素を削除する。
    3. queuedChildrenfalse とする。
    4. types の各非終端記号 type について、次を行う:
      1. candidatetype のインスタンスである場合、
        1. NOTE: JSON文法では、numberトークンは負の値を表す場合があります。ECMAScriptでは、否定は単項演算として表され、その中で UnaryExpression- に続く派生 UnaryExpression として解析されます。
        2. typeUnaryExpression である場合、
          1. candidate の親が UnaryExpression Parse Nodeでない場合、unaryExpressioncandidate に設定する。
        3. そうでなく typeNumericLiteral である場合、
          1. Assert: candidateunaryExpression に含まれている。
          2. unaryExpression を返す。
        4. そうでなければ、
          1. candidate を返す。
      2. queuedChildrenfalse であり、candidate が非終端記号のインスタンスであり、かつ candidate Contains typetrue である場合、
        1. children を、candidate の各子ノードを順に含むListとする。
        2. queuequeuechildren のリスト連結に設定する。
        3. queuedChildrentrue に設定する。
  7. empty を返す。

25.5.2.6 Static Semantics: JSONArrayLiteralContentNodes

The syntax-directed operation JSONArrayLiteralContentNodes takes no arguments and returns Parse NodeList. It is defined piecewise over the following productions:

ArrayLiteral : [ Elisionopt ] [ ElementList ] [ ElementList , Elisionopt ]
  1. Assert: Elision は存在しない。
  2. ElementList が存在しない場合、新しい空のListを返す。
  3. ElementListJSONArrayLiteralContentNodesを返す。
ElementList : Elisionopt AssignmentExpression
  1. Assert: Elision は存在しない。
  2. « AssignmentExpression » を返す。
ElementList : ElementList , Elisionopt AssignmentExpression
  1. Assert: Elision は存在しない。
  2. elements を派生 ElementListJSONArrayLiteralContentNodesとする。
  3. elements と « AssignmentExpression » のリスト連結を返す。
ElementList : Elisionopt SpreadElement ElementList , Elisionopt SpreadElement
  1. NOTE: ECMA-404で指定されるJSONテキストは SpreadElement を含みません。
  2. Assert: この手順に到達することは決してない。

25.5.3 JSON.rawJSON ( text )

この関数は、文字列、数値、真偽値、またはnull値の生のJSONテキストを表すオブジェクトを返します。

  1. jsonString を ? ToString(text) とする。
  2. jsonString が空のStringである場合、SyntaxError 例外をスローする。
  3. jsonString の最初のコード単位が、ASCII小文字コード単位(0x0061から0x007Aまで、両端を含む)、ASCII数字コード単位(0x0030から0x0039まで、両端を含む)、0x0022(QUOTATION MARK)、または0x002D(HYPHEN-MINUS)のいずれでもない場合、SyntaxError 例外をスローする。
  4. jsonString の最後のコード単位が、ASCII小文字コード単位(0x0061から0x007Aまで、両端を含む)、ASCII数字コード単位(0x0030から0x0039まで、両端を含む)、または0x0022(QUOTATION MARK)のいずれでもない場合、SyntaxError 例外をスローする。
  5. parseResult を ? ParseJSON(jsonString) とする。
  6. Assert: parseResult.[[Value]] はString、Number、Boolean、または null のいずれかである。
  7. internalSlotsList を « [[IsRawJSON]] » とする。
  8. objOrdinaryObjectCreate(null, internalSlotsList) とする。
  9. CreateDataPropertyOrThrow(obj, "rawJSON", jsonString) を実行する。
  10. SetIntegrityLevel(obj, frozen) を実行する。
  11. obj を返す。

25.5.4 JSON.stringify ( value [ , replacer [ , space ] ] )

この関数は、ECMAScript言語値を表すUTF-16エンコードJSON形式のString、または undefined を返します。3つのパラメーターを取ることができます。value パラメーターはECMAScript言語値であり、通常はオブジェクトまたは配列ですが、String、Boolean、Number、または null であることもできます。任意の replacer パラメーターは、オブジェクトおよび配列が文字列化される方法を変更する関数、または文字列化されるオブジェクトプロパティを選択するための包含リストとして働くStringおよびNumberの配列のいずれかです。任意の space パラメーターは、結果に空白を挿入して人間にとっての可読性を向上させることを可能にするStringまたはNumberです。

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

  1. stack を新しい空のListとする。
  2. indent を空のStringとする。
  3. propertyListundefined とする。
  4. replacerFunctionundefined とする。
  5. replacer がObjectである場合、
    1. IsCallable(replacer) が true の場合、
      1. replacerFunctionreplacer に設定する。
    2. そうでなければ、
      1. isArray を ? IsArray(replacer) とする。
      2. isArraytrue の場合、
        1. propertyList を新しい空のListに設定する。
        2. len を ? LengthOfArrayLike(replacer) とする。
        3. k を0とする。
        4. k < len の間、繰り返す:
          1. propertyKey を ! ToString(𝔽(k)) とする。
          2. propertyValue を ? Get(replacer, propertyKey) とする。
          3. itemundefined とする。
          4. propertyValue がStringである場合、
            1. itempropertyValue に設定する。
          5. そうでなく propertyValue がNumberである場合、
            1. item を ! ToString(propertyValue) に設定する。
          6. そうでなく propertyValue がObjectである場合、
            1. propertyValue[[StringData]] または [[NumberData]] 内部スロットを持つ場合、item を ? ToString(propertyValue) に設定する。
          7. itemundefined でなく、かつ propertyListitem を含まない場合、
            1. itempropertyList に追加する。
          8. kk + 1 に設定する。
  6. space がObjectである場合、
    1. space[[NumberData]] 内部スロットを持つ場合、
      1. space を ? ToNumber(space) に設定する。
    2. そうでなく space[[StringData]] 内部スロットを持つ場合、
      1. space を ? ToString(space) に設定する。
  7. space がNumberである場合、
    1. spaceMV を ! ToIntegerOrInfinity(space) とする。
    2. spaceMVmin(10, spaceMV) に設定する。
    3. spaceMV < 1 の場合、gap を空のStringとする。そうでなければ、gap をコード単位0x0020(SPACE)が spaceMV 個出現するString値とする。
  8. そうでなく space がStringである場合、
    1. space の長さが10以下である場合、gapspace とする。そうでなければ、gapspace の0から10までの部分文字列とする。
  9. そうでなければ、
    1. gap を空のStringとする。
  10. wrapperOrdinaryObjectCreate(%Object.prototype%) とする。
  11. CreateDataPropertyOrThrow(wrapper, 空のString, value) を実行する。
  12. stateJSON Serialization Record { [[ReplacerFunction]]: replacerFunction, [[Stack]]: stack, [[Indent]]: indent, [[Gap]]: gap, [[PropertyList]]: propertyList } とする。
  13. SerializeJSONProperty(state, 空のString, wrapper) を返す。

この関数の"length"プロパティは 3𝔽 です。

Note 1

JSON構造は任意の深さまで入れ子にできますが、非循環でなければなりません。value が循環構造である、または循環構造を含む場合、この関数は TypeError 例外をスローしなければなりません。これは文字列化できない値の例です:

a = [];
a[0] = a;
my_text = JSON.stringify(a); // これはTypeErrorをスローしなければならない。
Note 2

シンボリックなプリミティブ値は次のようにレンダリングされます:

  • null 値は、JSONテキストではString値 "null" としてレンダリングされる。
  • undefined 値はレンダリングされない。
  • true 値は、JSONテキストではString値 "true" としてレンダリングされる。
  • false 値は、JSONテキストではString値 "false" としてレンダリングされる。
Note 3

String値はQUOTATION MARK(")コード単位で囲まれます。コード単位 " および \\ 接頭辞でエスケープされます。制御文字コード単位は、エスケープシーケンス \uHHHH、またはより短い形式である \b(BACKSPACE)、\f(FORM FEED)、\n(LINE FEED)、\r(CARRIAGE RETURN)、\t(CHARACTER TABULATION)に置き換えられます。

Note 4

有限数はToString(number)を呼び出したかのように文字列化されます。NaN および Infinity は符号にかかわらずString値 "null" として表されます。

Note 5

JSON表現を持たない値(undefined や関数など)はStringを生成しません。代わりに undefined 値を生成します。配列では、これらの値はString値 "null" として表されます。オブジェクトでは、表現不能な値により、そのプロパティは文字列化から除外されます。

Note 6

オブジェクトは、U+007B(LEFT CURLY BRACKET)に続き、0個以上のプロパティをU+002C(COMMA)で区切り、U+007D(RIGHT CURLY BRACKET)で閉じたものとしてレンダリングされます。プロパティは、プロパティ名を表す引用符付きString、U+003A(COLON)、そして文字列化されたプロパティ値からなります。配列は、開始U+005B(LEFT SQUARE BRACKET)に続き、0個以上の値をU+002C(COMMA)で区切り、U+005D(RIGHT SQUARE BRACKET)で閉じたものとしてレンダリングされます。

25.5.4.1 JSON Serialization Record

JSON Serialization Recordとは、JSON形式への直列化を可能にするために使用されるRecord値です。

JSON Serialization Recordは、Table 76 に列挙されるフィールドを持ちます。

Table 76: JSON Serialization Record Fields
フィールド名 意味
[[ReplacerFunction]] 関数オブジェクトまたは undefined オブジェクトプロパティの置換値を供給できる関数(JSON.stringifyの replacer パラメーターから)。
[[PropertyList]] StringのListまたは undefined のいずれか 非配列オブジェクトを直列化するときに含めるプロパティ名(JSON.stringifyの replacer パラメーターから)。
[[Gap]] String インデントの単位(JSON.stringifyの space パラメーターから)。
[[Stack]] ObjectのList 直列化処理中である入れ子のオブジェクトの集合。循環構造を検出するために使用される。
[[Indent]] String 現在のインデント。

25.5.4.2 SerializeJSONProperty ( state, key, holder )

The abstract operation SerializeJSONProperty takes arguments state (JSON Serialization Record), key (String), and holder (Object) and returns Stringまたは undefined のいずれかを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. value を ? Get(holder, key) とする。
  2. value が Object または value が BigInt である場合、
    1. toJSON を ? GetV(value, "toJSON") とする。
    2. IsCallable(toJSON) が true である場合、
      1. value を ? Call(toJSON, value, « key ») に設定する。
  3. state.[[ReplacerFunction]]undefined でない場合、
    1. value を ? Call(state.[[ReplacerFunction]], holder, « key, value ») に設定する。
  4. value が Object である場合、
    1. value[[IsRawJSON]] 内部スロットを持つ場合、
      1. rawJSON を ! Get(value, "rawJSON") とする。
      2. Assert: rawJSON は String である。
      3. rawJSON を返す。
    2. value[[NumberData]] 内部スロットを持つ場合、
      1. value を ? ToNumber(value) に設定する。
    3. そうではなく、value[[StringData]] 内部スロットを持つ場合、
      1. value を ? ToString(value) に設定する。
    4. そうではなく、value[[BooleanData]] 内部スロットを持つ場合、
      1. valuevalue.[[BooleanData]] に設定する。
    5. そうではなく、value[[BigIntData]] 内部スロットを持つ場合、
      1. valuevalue.[[BigIntData]] に設定する。
  5. valuenull である場合、"null" を返す。
  6. valuetrue である場合、"true" を返す。
  7. valuefalse である場合、"false" を返す。
  8. value が String である場合、QuoteJSONString(value) を返す。
  9. value が Number である場合、
    1. value が有限である場合、! ToString(value) を返す。
    2. "null" を返す。
  10. value が BigInt である場合、TypeError 例外を投げる。
  11. value が Object であり、IsCallable(value) が false である場合、
    1. isArray を ? IsArray(value) とする。
    2. isArraytrue である場合、
      1. SerializeJSONArray(state, value) を返す。
    3. SerializeJSONObject(state, value) を返す。
  12. undefined を返す。

25.5.4.3 QuoteJSONString ( value )

The abstract operation QuoteJSONString takes argument value (String) and returns String. value を0x0022(QUOTATION MARK)コード単位で囲み、その内部の特定の他のコード単位をエスケープします。この操作は、value6.1.4 で説明されるUTF-16エンコードされたコードポイントの列として解釈します。 It performs the following steps when called:

  1. product を、コード単位0x0022(QUOTATION MARK)のみからなるString値とする。
  2. StringToCodePoints(value) の各コードポイント cp について、次を行う:
    1. cpTable 77 の“Code Point”列に列挙されている場合、
      1. product を、product と、対応する行の“Escape Sequence”列で指定される cp のエスケープシーケンスとの文字列連結に設定する。
    2. そうでなく cp の数値が0x0020(SPACE)未満であるか、または cp が先行サロゲートまたは後続サロゲートと同じ数値を持つ場合、
      1. unit を、数値が cp の数値であるコード単位とする。
      2. product を、productUnicodeEscape(unit) の文字列連結に設定する。
    3. そうでなければ、
      1. product を、productUTF16EncodeCodePoint(cp) の文字列連結に設定する。
  3. product を、product とコード単位0x0022(QUOTATION MARK)の文字列連結に設定する。
  4. product を返す。
Table 77: JSON Single Character Escape Sequences
コードポイント Unicode文字名 エスケープシーケンス
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 \\

25.5.4.4 UnicodeEscape ( constructor )

The abstract operation UnicodeEscape takes argument constructor (コード単位) and returns String. constructor をUnicodeエスケープシーケンスとして表します。 It performs the following steps when called:

  1. nconstructor の数値とする。
  2. Assert: n ≤ 0xFFFF である。
  3. hex を、小文字の16進数として書式化された n のString表現とする。
  4. コード単位0x005C(REVERSE SOLIDUS)、"u"、および StringPad(hex, 4, "0", start) の文字列連結を返す。

25.5.4.5 SerializeJSONObject ( state, value )

The abstract operation SerializeJSONObject takes arguments state (JSON Serialization Record) and value (Object) and returns Stringを含む正常完了またはスロー完了のいずれか. オブジェクトを直列化します。 It performs the following steps when called:

  1. state.[[Stack]]value を含む場合、その構造は循環しているため、TypeError 例外をスローする。
  2. valuestate.[[Stack]] に追加する。
  3. stepBackstate.[[Indent]] とする。
  4. state.[[Indent]]state.[[Indent]]state.[[Gap]] の文字列連結に設定する。
  5. state.[[PropertyList]]undefined でない場合、
    1. keysstate.[[PropertyList]] とする。
  6. そうでなければ、
    1. keys を ? EnumerableOwnProperties(value, key) とする。
  7. partial を新しい空のListとする。
  8. keys の各要素 propertyKey について、次を行う:
    1. strP を ? SerializeJSONProperty(state, propertyKey, value) とする。
    2. strPundefined でない場合、
      1. memberQuoteJSONString(propertyKey) とする。
      2. membermember":" の文字列連結に設定する。
      3. state.[[Gap]] が空のStringでない場合、
        1. membermember とコード単位0x0020(SPACE)の文字列連結に設定する。
      4. membermemberstrP の文字列連結に設定する。
      5. memberpartial に追加する。
  9. partial が空である場合、
    1. final"{}" とする。
  10. そうでなければ、
    1. state.[[Gap]] が空のStringである場合、
      1. properties を、partial のすべての要素Stringを連結し、隣接するStringの各ペアの間をコード単位0x002C(COMMA)で区切って形成されるString値とする。最初のStringの前にも最後のStringの後にもコンマは挿入されない。
      2. final"{"properties、および "}" の文字列連結とする。
    2. そうでなければ、
      1. separator を、コード単位0x002C(COMMA)、コード単位0x000A(LINE FEED)、および state.[[Indent]] の文字列連結とする。
      2. properties を、partial のすべての要素Stringを連結し、隣接するStringの各ペアの間を separator で区切って形成されるString値とする。separator Stringは、最初のStringの前にも最後のStringの後にも挿入されない。
      3. final"{"、コード単位0x000A(LINE FEED)、state.[[Indent]]properties、コード単位0x000A(LINE FEED)、stepBack、および "}" の文字列連結とする。
  11. state.[[Stack]] の最後の要素を削除する。
  12. state.[[Indent]]stepBack に設定する。
  13. final を返す。

25.5.4.6 SerializeJSONArray ( state, value )

The abstract operation SerializeJSONArray takes arguments state (a JSON Serialization Record) and value (an Object) and returns either a normal completion containing a String or a throw completion. 配列を直列化します。 It performs the following steps when called:

  1. state.[[Stack]]value を含む場合、その構造は循環しているため、TypeError 例外をスローする。
  2. valuestate.[[Stack]] に追加する。
  3. stepBackstate.[[Indent]] とする。
  4. state.[[Indent]]state.[[Indent]]state.[[Gap]] の文字列連結に設定する。
  5. partial を新しい空のListとする。
  6. len を ? LengthOfArrayLike(value) とする。
  7. index を0とする。
  8. index < len の間、繰り返す:
    1. strP を ? SerializeJSONProperty(state, ! ToString(𝔽(index)), value) とする。
    2. strPundefined である場合、
      1. "null"partial に追加する。
    3. そうでなければ、
      1. strPpartial に追加する。
    4. indexindex + 1 に設定する。
  9. partial が空である場合、
    1. final"[]" とする。
  10. そうでなければ、
    1. state.[[Gap]] が空のStringである場合、
      1. properties を、partial のすべての要素Stringを連結し、隣接するStringの各ペアの間をコード単位0x002C(COMMA)で区切って形成されるString値とする。最初のStringの前にも最後のStringの後にもコンマは挿入されない。
      2. final"["properties、および "]" の文字列連結とする。
    2. そうでなければ、
      1. separator を、コード単位0x002C(COMMA)、コード単位0x000A(LINE FEED)、および state.[[Indent]] の文字列連結とする。
      2. properties を、partial のすべての要素Stringを連結し、隣接するStringの各ペアの間を separator で区切って形成されるString値とする。separator Stringは、最初のStringの前にも最後のStringの後にも挿入されない。
      3. final"["、コード単位0x000A(LINE FEED)、state.[[Indent]]properties、コード単位0x000A(LINE FEED)、stepBack、および "]" の文字列連結とする。
  11. state.[[Stack]] の最後の要素を削除する。
  12. state.[[Indent]]stepBack に設定する。
  13. final を返す。
Note

配列の表現には、+0𝔽(含む)から array.length(含まない)までの区間内の要素のみが含まれます。キーが配列インデックスでないプロパティは文字列化から除外されます。配列は、開始LEFT SQUARE BRACKET、COMMAで区切られた要素、および終了RIGHT SQUARE BRACKETとして文字列化されます。

25.5.5 JSON [ %Symbol.toStringTag% ]

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

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