?
u
m
/
p
1-9
0
`
本節、および
read-modify-write 変更関数 とは、2 つの
read-modify-write 変更関数のアルゴリズムステップが純粋な数学的関数を成していることの検証を助けるため、次の編集上の慣例を推奨する:
固定長 ArrayBuffer とは、生成後にバイト長が変化しない ArrayBuffer である。
リサイズ可能 ArrayBuffer とは、
生成される ArrayBuffer オブジェクトの種類は、
The abstract operation AllocateArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or
The abstract operation ArrayBufferByteLength takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer) and order (
The abstract operation ArrayBufferCopyAndDetach takes arguments arrayBuffer (an ECMAScript language value), newLength (an ECMAScript language value), and preserveResizability (
realloc
として実装してよい。The abstract operation IsDetachedBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
The abstract operation DetachArrayBuffer takes argument arrayBuffer (an ArrayBuffer) and optional argument key (anything) and returns either a
ArrayBuffer インスタンスをデタッチすることは、裏付けとして使用される
The abstract operation CloneArrayBuffer takes arguments srcBuffer (an ArrayBuffer or a SharedArrayBuffer), srcByteOffset (a non-negative integer), and srcLength (a non-negative integer) and returns either a
The abstract operation GetArrayBufferMaxByteLengthOption takes argument options (an ECMAScript language value) and returns either a
The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer) and newByteLength (a non-negative integer) and returns either a
HostResizeArrayBuffer の実装は以下に従わなければならない:
HostResizeArrayBuffer の既定実装は
The abstract operation IsFixedLengthArrayBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
The abstract operation IsUnsignedElementType takes argument type (a
The abstract operation IsUnclampedIntegerElementType takes argument type (a
The abstract operation IsBigIntElementType takes argument type (a
The abstract operation IsNoTearConfiguration takes arguments type (a
The abstract operation RawBytesToNumeric takes arguments type (a
The abstract operation GetRawBytesFromSharedBlock takes arguments block (a
The abstract operation GetValueFromBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a
The abstract operation NumericToRawBytes takes arguments type (a
The abstract operation SetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a
The abstract operation GetModifySetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or a SharedArrayBuffer), byteIndex (a non-negative integer), type (a
ArrayBuffer
extends
句の値として使用できる。指定された ArrayBuffer の挙動を継承するサブクラスArrayBuffer.prototype
組込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、ArrayBuffer super
呼び出しを含める必要がある。この関数は呼び出し時に次を行う:
ArrayBuffer
この関数は呼び出し時に次を行う:
ArrayBuffer.prototype
の初期値は
このプロパティは { [[Writable]]:
ArrayBuffer[%Symbol.species%]
は set アクセサが
この関数の
ArrayBuffer プロトタイプオブジェクト:
ArrayBuffer.prototype.byteLength
は set アクセサが
ArrayBuffer.prototype.constructor
の初期値は
ArrayBuffer.prototype.detached
は set アクセサが
ArrayBuffer.prototype.maxByteLength
は set アクセサが
ArrayBuffer.prototype.resizable
は set アクセサが
このメソッドは呼び出し時に次を行う:
このメソッドは呼び出し時に次を行う:
このメソッドは呼び出し時に次を行う:
このメソッドは呼び出し時に次を行う:
このプロパティは { [[Writable]]:
ArrayBuffer インスタンスは
[[ArrayBufferData]] が
[[ArrayBufferDetachKey]] が
以下は
可能であれば展開環境でプログラムをテストすることを推奨する。利用可能な物理メモリ量はハードウェアデバイス間で大きく異なる。同様に仮想メモリサブシステムもデバイスや OS により大きく異なる。64 ビットデスクトップ Web ブラウザでメモリ不足を起こさないアプリケーションが 32 ビットモバイル Web ブラウザではメモリ不足になる可能性がある。
特定の最大サイズで
以下は
固定長 SharedArrayBuffer とは、生成後にそのバイト長が変更できない SharedArrayBuffer である。
成長可能 SharedArrayBuffer とは、
生成される SharedArrayBuffer オブジェクトの種別は、
The abstract operation AllocateSharedArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or
The abstract operation IsSharedArrayBuffer takes argument obj (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. オブジェクトが ArrayBuffer / SharedArrayBuffer あるいはそのサブタイプかどうかを判定する。 It performs the following steps when called:
The host-defined abstract operation HostGrowSharedArrayBuffer takes arguments buffer (a SharedArrayBuffer) and newByteLength (a non-negative integer) and returns either a
HostGrowSharedArrayBuffer の実装は以下の要件に従わなければならない:
SharedArrayBuffer.prototype.grow
への競合する呼び出しが「失われない」(沈黙して何もしないことがない)ようにする。上記 2 つ目の要件は、buffer の現在バイト長をどのよう/いつ読み取るかについて意図的に曖昧にしている。基盤ハードウェア上でバイト長をアトミック read-modify-write で更新する必要があるため、load-link/store-conditional や load-exclusive/store-exclusive 命令対を用いるアーキテクチャでは命令ペアを命令ストリーム内で近接させたい場合がある。そのため SharedArrayBuffer.prototype.grow 自体は HostGrowSharedArrayBuffer を呼ぶ前に newByteLength の境界チェックを行わず、また現在のバイト長をいつ読むかを規定しない。
これは
HostGrowSharedArrayBuffer の既定実装は
SharedArrayBuffer
extends
句の値として使用できる。指定された SharedArrayBuffer の挙動を継承するサブクラスSharedArrayBuffer.prototype
の組込みメソッドを支える内部状態でサブクラスインスタンスを生成・初期化するため super
呼び出しを含めねばならない。ArrayBuffer
と異なり、SharedArrayBuffer
はデタッチされず、その内部 [[ArrayBufferData]] スロットが
この関数は呼び出し時に次を行う:
SharedArrayBuffer
SharedArrayBuffer.prototype
の初期値は
このプロパティは { [[Writable]]:
SharedArrayBuffer[%Symbol.species%]
は set アクセサが
この関数の
SharedArrayBuffer プロトタイプオブジェクト:
SharedArrayBuffer.prototype.byteLength
は set アクセサが
SharedArrayBuffer.prototype.constructor
の初期値は
このメソッドは呼び出し時に以下を行う:
長さ更新の compare-exchange の擬似的失敗は許されない。新しい長さの境界チェックが通り、実装がメモリ不足でない場合、候補実行には常に
SharedArrayBuffer.prototype.grow への並列呼び出しは全順序化される。例: sab.grow(10)
と sab.grow(20)
が競合する場合、必ずどちらかが勝つ。sab.grow(10)
が sab.grow(20)
の後でも sab
を縮めることはなく、その場合は
SharedArrayBuffer.prototype.growable
は set アクセサが
SharedArrayBuffer.prototype.maxByteLength
は set アクセサが
このメソッドは呼び出し時に以下を行う:
このプロパティは { [[Writable]]:
SharedArrayBuffer インスタンスは
ArrayBuffer と異なり、SharedArrayBuffer インスタンスは決してデタッチされない。
以下は
可能な限り実際のデプロイ環境でテストすることを推奨する。利用可能な物理メモリ量はハードウェア間で大きく異なる。同様に仮想メモリサブシステムもハードウェアや OS により大きく異なる。64 ビットデスクトップブラウザで正常なアプリが 32 ビットモバイルブラウザではメモリ不足になる可能性がある。
特定の最大サイズで
u8[idx]
のようなlength
/ byteLength
ゲッター、
以下は
grow 操作は基盤メモリアクセスと並行し得るため、メモリモデル上の制約として非順序 (unordered) アクセスでも「ティア」(値の一部が混ざる) を起こしてはならない。実際には基盤データブロックをコピーで拡張する(世界停止を伴う)手法では実装しづらい。世界停止は直列化ポイントを導入し遅いため推奨しない。
追加されたメモリは作成直後(競合アクセスに対しても)ゼロ化されているように見えねばならない。ゼロ初期化オンデマンドの仮想メモリページ、または手動ゼロ化時の慎重な同期で実現できる。
仮想メモリを持たない(MMU の無い組込み等)
DataView With Buffer Witness Record は、DataView と、その参照バッファのキャッシュされたバイト長をカプセル化するための
DataView With Buffer Witness Record は
Field Name | Value | Meaning |
---|---|---|
[[Object]] | a DataView | バッファのバイト長が読み込まれる DataView オブジェクト。 |
[[CachedBufferByteLength]] |
a non-negative integer or |
|
The abstract operation MakeDataViewWithBufferWitnessRecord takes arguments obj (a DataView) and order (
The abstract operation GetViewByteLength takes argument viewRecord (a
The abstract operation IsViewOutOfBounds takes argument viewRecord (a
The abstract operation GetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), and type (a
The abstract operation SetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), type (a
DataView
extends
句の値として使用できる。指定された DataView の挙動を継承するサブクラスDataView.prototype
の組込みメソッドを支える内部状態でインスタンスを初期化するため super
呼び出しを含めねばならない。この関数は呼び出し時に次を行う:
DataView
DataView.prototype
の初期値は
このプロパティは { [[Writable]]:
DataView プロトタイプオブジェクト:
DataView.prototype.buffer
は set アクセサが
DataView.prototype.byteLength
は set アクセサが
DataView.prototype.byteOffset
は set アクセサが
DataView.prototype.constructor
の初期値は
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このメソッドは呼び出し時に以下を行う:
このプロパティは { [[Writable]]:
DataView インスタンスは
[[DataView]] 内部スロットの値自体は仕様内では使用されない。その内部スロットが存在すること自体で DataView
Atomics オブジェクトは次の通りである:
new
演算子でAtomics オブジェクトは共有メモリ配列セルに対して不可分(アトミック)に動作する関数、およびエージェントがプリミティブなイベントを待機・送出するための関数を提供する。規律を守って用いることで、共有メモリを介して通信するマルチエージェントプログラムは、並列 CPU 上であっても理解可能な順序で実行される。共有メモリ通信を支配する規則は後述のメモリモデルで定義される。
ECMAScript での共有メモリのプログラミングおよび実装に関する参考指針については、メモリモデル節末尾の注記を参照のこと。
Waiter Record は Atomics.wait
または Atomics.waitAsync
への特定の呼び出しを表すために用いられる
Waiter Record は
フィールド名 | 値 | 意味 |
---|---|---|
[[AgentSignifier]] | エージェント識別子 |
Atomics.wait または Atomics.waitAsync を呼び出したエージェント。
|
[[PromiseCapability]] |
|
Atomics.waitAsync の呼び出しを表す場合はその結果の Promise、それ以外は |
[[TimeoutTime]] | 非負の拡張数学的値 |
タイムアウトが発火し得る最も早い時刻; |
[[Result]] |
|
呼び出しの戻り値。 |
WaiterList Record は Atomics.wait
, Atomics.waitAsync
, Atomics.notify
を通じたエージェントの待機と通知を説明するために用いられる。
WaiterList Record は
フィールド名 | 値 | 意味 |
---|---|---|
[[Waiters]] |
|
この WaiterList が関連付けられているロケーションで待機している Atomics.wait または Atomics.waitAsync への呼び出し。
|
[[MostRecentLeaveEvent]] |
|
直近にその |
同一のエージェント識別子を持つ複数の
エージェントクラスタは WaiterList Record の保管領域を持ち、そのインデックスは (block, i) であり、block は
各 WaiterList Record はその評価中の排他的アクセスを制御する クリティカルセクション を持つ。同時に入場できるのは 1 つのエージェントのみである。クリティカルセクションへの入退場は
The abstract operation ValidateIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and waitable (a Boolean) and returns 正常完了で
The abstract operation ValidateAtomicAccess takes arguments taRecord (a
The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and requestIndex (an ECMAScript language value) and returns 正常完了で
The abstract operation RevalidateAtomicAccess takes arguments typedArray (a
The abstract operation GetWaiterList takes arguments block (a
The abstract operation EnterCriticalSection takes argument WL (a
EnterCriticalSection は、
The abstract operation LeaveCriticalSection takes argument WL (a
The abstract operation AddWaiter takes arguments WL (a
The abstract operation RemoveWaiter takes arguments WL (a
The abstract operation RemoveWaiters takes arguments WL (a
The abstract operation SuspendThisAgent takes arguments WL (a
Atomics.notify
呼び出し経由)場合のみ起こる。The abstract operation NotifyWaiter takes arguments WL (a
エージェントは、
The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (an
The abstract operation DoWait takes arguments mode (
additionalTimeout は、電力消費削減やタイミング攻撃緩和のためのタイマー分解能粗化など、実装が必要に応じてタイムアウトにパディングを追加することを許容する。値は DoWait の呼び出しごとに異なり得る。
The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments WL (a
The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (a
The abstract operation AtomicReadModifyWrite takes arguments typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and op (a read-modify-write modification function) and returns 正常完了で Number または BigInt を含むか、または
The abstract operation ByteListBitwiseOp takes arguments op (&
, ^
, または |
), xBytes (a
&
なら^
なら|
。The abstract operation ByteListEqual takes arguments xBytes (a
この関数は呼び出されたとき次を行う:
この関数は呼び出されたとき次を行う:
&
, xBytes, yBytes) を返す。この関数は呼び出されたとき次を行う:
この関数は呼び出されたとき次を行う:
この関数は呼び出されたとき次を行う:
この関数は最適化プリミティブである。直感的には、サイズ n バイトのデータに対するアトミックプリミティブ(compareExchange
, load
, store
, add
, sub
, and
, or
, xor
, exchange
)のアトミックステップが、そのデータ n バイト外のロックを取得せずに実行されるなら Atomics.isLockFree
(n) は
Atomics.isLockFree
(4) は常に
この関数が返す値に関わらず、全てのアトミック操作はアトミックであることが保証される。例えば、操作の途中で可視な操作が発生(いわゆる「tearing」)することは決してない。
この関数は呼び出されたとき次を行う:
この関数は呼び出されたとき次を行う:
|
, xBytes, yBytes) を返す この関数は呼び出されたとき次を行う:
この関数は呼び出されたとき次を行う:
この関数は周囲のエージェントを待機キューに入れ、通知またはタイムアウトまでサスペンドし、それらを区別する文字列を返す。
呼び出されたとき次を行う:
この関数は、呼び出しエージェントが通知されるかタイムアウトに達したとき解決される Promise を返す。
呼び出されたとき次を行う:
この関数は待機キューでスリープしている一部のエージェントに通知する。
呼び出されたとき次を行う:
この関数は呼び出されたとき次を行う:
^
, xBytes, yBytes) を返す このプロパティは属性 { [[Writable]]:
JSON オブジェクトは次の通りである:
parse
と stringify
の 2 つの関数を含み、JSON テキストの構文解析と構築に使用される。new
演算子でJSON データ交換形式は ECMA-404 に定義される。本仕様で使用される JSON 交換形式は ECMA-404 に記述されるものと正確に同一である。JSON.parse
および JSON.stringify
の適合実装は ECMA-404 仕様に記述された交換形式を、削除や拡張なしにサポートしなければならない。
この関数は JSON テキスト(JSON 形式の文字列)を構文解析し、ECMAScript 言語値を生成する。JSON 形式はリテラル、配列、オブジェクトを ECMAScript のリテラル、配列初期化子、オブジェクト初期化子に類似した構文で表現する。構文解析後、JSON オブジェクトは ECMAScript オブジェクトとして実体化され、JSON 配列は ECMAScript の Array インスタンスとして実体化される。JSON の文字列、数値、真偽値、および null はそれぞれ ECMAScript の String, Number, Boolean,
任意の reviver パラメータは 2 つのパラメータ key, value を取る関数であり、結果をフィルタおよび変換できる。構文解析で生成された各 key/value ペアで呼び出され、その戻り値が元の値の代わりに使用される。受け取ったものをそのまま返した場合、構造は変更されない。
この関数の
The abstract operation ParseJSON takes argument text (a String) and returns 正常完了で ECMAScript 言語値を含むか、または
適合実装が JSON.parse
の JSON 文法を拡張することは許されない。修正または拡張された JSON 交換形式をサポートしたい実装は別の parse 関数を定義しなければならない。
有効な JSON テキストは ECMAScript
しかし、
オブジェクト内に重複する name String が存在する場合、字句的に先行する同一キーの値は上書きされる。
The abstract operation InternalizeJSONProperty takes arguments holder (an Object), name (a String), and reviver (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または
このアルゴリズムは [[Delete]] または
呼び出されたとき次を行う:
この関数は value を UTF-16 エンコードされた JSON 形式の文字列か
呼び出されたとき次を行う:
この関数の
JSON 構造は任意の深さにネスト可能であるが非循環でなければならない。value が循環構造であるか含む場合、この関数は
a = [];
a[0] = a;
my_text = JSON.stringify(a); // これは TypeError を投げなければならない。
シンボリックなプリミティブ値は以下のようにレンダリングされる:
文字列値は QUOTATION MARK ("
) コード単位で囲まれる。コード単位 "
と \
は \
接頭辞でエスケープされる。制御文字コード単位は \u
HHHH のエスケープシーケンス、または短い形式 \b
(BACKSPACE), \f
(FORM FEED), \n
(LINE FEED), \r
(CARRIAGE RETURN), \t
(CHARACTER TABULATION) に置換される。
JSON 表現を持たない値(
オブジェクトは U+007B (LEFT CURLY BRACKET) で開始し、0 個以上のプロパティを U+002C (COMMA) で区切り、U+007D (RIGHT CURLY BRACKET) で閉じる。プロパティは
JSON Serialization Record は JSON 形式へのシリアライズを可能にするために用いられる
JSON Serialization Record は
フィールド名 | 値 | 意味 |
---|---|---|
[[ReplacerFunction]] | オブジェクトプロパティに代替値を提供できる関数(JSON.stringify の replacer パラメータ)。 | |
[[PropertyList]] | String の |
非配列オブジェクトをシリアライズする際に含める |
[[Gap]] | String | インデント単位(JSON.stringify の space パラメータ)。 |
[[Stack]] | Object の |
シリアライズ処理中の入れ子オブジェクト集合。循環構造検出に使用。 |
[[Indent]] | String | 現在のインデント。 |
The abstract operation SerializeJSONProperty takes arguments state (a
The abstract operation QuoteJSONString takes argument value (a String) and returns String. value を 0x0022 (QUOTATION MARK) コード単位で囲み、その内部の特定コード単位をエスケープする。この操作は
Code Point | Unicode Character Name | Escape Sequence |
---|---|---|
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 |
\\
|
The abstract operation UnicodeEscape takes argument C (a code unit) and returns String. C を Unicode エスケープシーケンスとして表現する。 It performs the following steps when called:
The abstract operation SerializeJSONObject takes arguments state (a
The abstract operation SerializeJSONArray takes arguments state (a
配列の表現には array.length
(含まない)までの要素のみが含まれる。
このプロパティは属性 { [[Writable]]: