← ECMAScript 2027 · İçindekiler
ECMA-262 · 18inci Baskı
25

Yapılandırılmış Veri (Structured Data)

25.1 ArrayBuffer Nesneleri (ArrayBuffer Objects)

25.1.1 Gösterim (Notation)

Bu bölümdeki aşağıdaki açıklamalar, 25.4 ve 29 "oku-değiştir-yaz" (read-modify-write) değişiklik fonksiyonu dahili veri yapısını kullanır.

Bir oku-değiştir-yaz değişiklik fonksiyonu, argüman olarak iki bayt değerleri Listesi (List) alan ve bir bayt değerleri Listesi (List) döndüren, bir Soyut Kapatma (Abstract Closure) olarak temsil edilen matematiksel bir fonksiyondur. Bu Soyut Kapatmalar (Abstract Closures) aşağıdaki özelliklerin tümünü karşılar:

  • Tüm algoritma adımlarını atomik olarak gerçekleştirirler.

  • Bireysel algoritma adımları gözlemlenebilir değildir.

25.1.2 Sabit Uzunluklu ve Yeniden Boyutlandırılabilir ArrayBuffer Nesneleri (Fixed-length and Resizable ArrayBuffer Objects)

Sabit uzunluklu bir ArrayBuffer, oluşturulduktan sonra bayt uzunluğu değiştirilemeyen bir ArrayBuffer'dır.

Yeniden boyutlandırılabilir bir ArrayBuffer, oluşturulduktan sonra ArrayBuffer.prototype.resize ( newLength ) çağrıları aracılığıyla bayt uzunluğu değişebilen bir ArrayBuffer'dır.

Oluşturulan ArrayBuffer nesnesinin türü, ArrayBuffer ( length [ , options ] ) işlevine aktarılan argümanlara bağlıdır.

25.1.3 ArrayBuffer Nesneleri İçin Soyut İşlemler (Abstract Operations For ArrayBuffer Objects)

25.1.3.1 AllocateArrayBuffer ( ctor, byteLength [ , maxByteLength ] )

AllocateArrayBuffer soyut işlemi, ctor (bir yapıcı (constructor)) ve byteLength (negatif olmayan bir tamsayı (integer)) argümanlarını ve isteğe bağlı maxByteLength (negatif olmayan bir tamsayı (integer) veya empty) argümanını alır ve bir ArrayBuffer içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Bir ArrayBuffer oluşturmak için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. slots, « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] » olsun.

  2. Eğer maxByteLength mevcutsa ve maxByteLength empty değilse, allocatingResizableBuffer değerini true olarak ayarla; aksi takdirde allocatingResizableBuffer değerini false olarak ayarla.

  3. Eğer allocatingResizableBuffer true ise, o zaman

    1. Eğer byteLength > maxByteLength ise, bir RangeError istisnası fırlat.

    2. [[ArrayBufferMaxByteLength]] özelliğini slots listesine ekle.

  4. obj, ? OrdinaryCreateFromConstructor(ctor, "%ArrayBuffer.prototype%", slots) olsun.

  5. block, ? CreateByteDataBlock(byteLength) olsun.

  6. obj.[[ArrayBufferData]] değerini block olarak ayarla.

  7. obj.[[ArrayBufferByteLength]] değerini byteLength olarak ayarla.

  8. Eğer allocatingResizableBuffer true ise, o zaman

    1. Eğer maxByteLength bayttan oluşan bir Veri Bloğu (Data Block) block oluşturmak mümkün değilse, bir RangeError istisnası fırlat.

    2. NOTE: Yeniden boyutlandırılabilir ArrayBuffer'lar, yerinde büyüme (in-place growth) ile uygulanabilir olacak şekilde tasarlanmıştır. Örneğin, sanal bellek önceden rezerve edilemiyorsa uygulamalar hata fırlatabilir.

    3. obj.[[ArrayBufferMaxByteLength]] değerini maxByteLength olarak ayarla.

  9. obj döndür.

25.1.3.2 ArrayBufferByteLength ( arrayBuffer, order )

ArrayBufferByteLength soyut işlemi, arrayBuffer (bir ArrayBuffer veya SharedArrayBuffer) ve order (seq-cst veya unordered) argümanlarını alır ve negatif olmayan bir tamsayı (integer) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer IsGrowableSharedArrayBuffer(arrayBuffer) true ise, o zaman

    1. bufferByteLengthBlock, arrayBuffer.[[ArrayBufferByteLengthData]] olsun.

    2. rawLength, GetRawBytesFromSharedBlock(bufferByteLengthBlock, 0, biguint64, true, order) olsun.

    3. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

    4. isLittleEndian, agentRecord.[[LittleEndian]] olsun.

    5. (RawBytesToNumeric(biguint64, rawLength, isLittleEndian)) döndür.

  2. Assert: IsDetachedBuffer(arrayBuffer) false değeridir.

  3. arrayBuffer.[[ArrayBufferByteLength]] döndür.

25.1.3.3 ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability )

ArrayBufferCopyAndDetach soyut işlemi, arrayBuffer (bir ECMAScript dil değeri (ECMAScript language value)), newLength (bir ECMAScript dil değeri (ECMAScript language value)) ve preserveResizability (preserve-resizability veya fixed-length) argümanlarını alır ve bir ArrayBuffer içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]) işlemini gerçekleştir.

  2. Eğer IsSharedArrayBuffer(arrayBuffer) true ise, bir TypeError istisnası fırlat.

  3. Eğer newLength undefined ise, o zaman

    1. newByteLength, arrayBuffer.[[ArrayBufferByteLength]] olsun.
  4. Değilse,

    1. newByteLength, ? ToIndex(newLength) olsun.
  5. Eğer IsDetachedBuffer(arrayBuffer) true ise, bir TypeError istisnası fırlat.

  6. Eğer preserveResizability, preserve-resizability ise ve IsFixedLengthArrayBuffer(arrayBuffer) false ise, o zaman

    1. newMaxByteLength, arrayBuffer.[[ArrayBufferMaxByteLength]] olsun.
  7. Değilse,

    1. newMaxByteLength, empty olsun.
  8. Eğer arrayBuffer.[[ArrayBufferDetachKey]] undefined değilse, bir TypeError istisnası fırlat.

  9. newBuffer, ? AllocateArrayBuffer(%ArrayBuffer%, newByteLength, newMaxByteLength) olsun.

  10. copyLength, min(newByteLength, arrayBuffer.[[ArrayBufferByteLength]]) olsun.

  11. fromBlock, arrayBuffer.[[ArrayBufferData]] olsun.

  12. toBlock, newBuffer.[[ArrayBufferData]] olsun.

  13. CopyDataBlockBytes(toBlock, 0, fromBlock, 0, copyLength) işlemini gerçekleştir.

  14. NOTE: Ne yeni Veri Bloğunun (Data Block) oluşturulması ne de eski Veri Bloğundan (Data Block) kopyalanması gözlemlenebilirdir. Uygulamalar bu metodu sıfır-kopyalı taşıma (zero-copy move) veya realloc olarak uygulayabilir.

  15. ! DetachArrayBuffer(arrayBuffer) işlemini gerçekleştir.

  16. newBuffer döndür.

25.1.3.4 IsDetachedBuffer ( arrayBuffer )

IsDetachedBuffer soyut işlemi, arrayBuffer (bir ArrayBuffer veya SharedArrayBuffer) argümanını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer arrayBuffer.[[ArrayBufferData]] null ise, true döndür.

  2. false döndür.

25.1.3.5 DetachArrayBuffer ( arrayBuffer [ , key ] )

DetachArrayBuffer soyut işlemi, arrayBuffer (bir ArrayBuffer) argümanını ve isteğe bağlı key (herhangi bir şey) argümanını alır ve unused içeren bir olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsSharedArrayBuffer(arrayBuffer) false değeridir.

  2. Eğer key mevcut değilse, key değerini undefined olarak ayarla.

  3. Eğer arrayBuffer.[[ArrayBufferDetachKey]] değeri key ile aynı değilse, bir TypeError istisnası fırlat.

  4. arrayBuffer.[[ArrayBufferData]] değerini null olarak ayarla.

  5. arrayBuffer.[[ArrayBufferByteLength]] değerini 0 olarak ayarla.

  6. unused döndür.

25.1.3.6 CloneArrayBuffer ( sourceBuffer, sourceByteOffset, sourceLength )

CloneArrayBuffer soyut işlemi, sourceBuffer (bir ArrayBuffer veya SharedArrayBuffer), sourceByteOffset (negatif olmayan bir tamsayı (integer)) ve sourceLength (negatif olmayan bir tamsayı (integer)) argümanlarını alır ve bir ArrayBuffer içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Verileri, sourceBuffer verilerinin sourceByteOffset konumundan başlayarak sourceLength bayt boyunca kopyası olan yeni bir ArrayBuffer oluşturur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsDetachedBuffer(sourceBuffer) false değeridir.

  2. targetBuffer, ? AllocateArrayBuffer(%ArrayBuffer%, sourceLength) olsun.

  3. sourceBlock, sourceBuffer.[[ArrayBufferData]] olsun.

  4. targetBlock, targetBuffer.[[ArrayBufferData]] olsun.

  5. CopyDataBlockBytes(targetBlock, 0, sourceBlock, sourceByteOffset, sourceLength) işlemini gerçekleştir.

  6. targetBuffer döndür.

25.1.3.7 GetArrayBufferMaxByteLengthOption ( options )

GetArrayBufferMaxByteLengthOption soyut işlemi, options (bir ECMAScript dil değeri (ECMAScript language value)) argümanını alır ve negatif olmayan bir tamsayı (integer) ya da empty içeren bir olağan tamamlanma (normal completion containing) veya bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer options bir Nesne değilse (is not an Object), empty döndür.

  2. maxByteLength, ? Get(options, "maxByteLength") olsun.

  3. Eğer maxByteLength undefined ise, empty döndür.

  4. ? ToIndex(maxByteLength) döndür.

25.1.3.8 HostResizeArrayBuffer ( buffer, newByteLength )

Ana bilgisayar tarafından tanımlanmış (host-defined) HostResizeArrayBuffer soyut işlemi, buffer (bir ArrayBuffer) ve newByteLength (negatif olmayan bir tamsayı (integer)) argümanlarını alır ve handled ya da unhandled içeren bir olağan tamamlanma (normal completion containing) veya bir fırlatma tamamlanması (throw completion) döndürür. Ana bilgisayara (host), buffer nesnesinin uygulama tarafından tanımlanmış (implementation-defined) yeniden boyutlandırılmasını gerçekleştirme fırsatı verir. Eğer ana bilgisayar (host) buffer nesnesinin yeniden boyutlandırılmasını işlememeyi seçerse, varsayılan davranış için unhandled döndürebilir.

HostResizeArrayBuffer uygulaması aşağıdaki gereksinimlere uygun olmalıdır:

  • Soyut işlem buffer nesnesini ayırmaz (detach).

  • Eğer soyut işlem handled ile olağan şekilde tamamlanırsa, buffer.[[ArrayBufferByteLength]] değeri newByteLength olur.

HostResizeArrayBuffer varsayılan uygulaması, NormalCompletion(unhandled) döndürmektir.

25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )

IsFixedLengthArrayBuffer soyut işlemi, arrayBuffer (bir ArrayBuffer veya SharedArrayBuffer) argümanını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer arrayBuffer bir [[ArrayBufferMaxByteLength]] dahili yuvasına sahipse, false döndür.

  2. true döndür.

25.1.3.10 IsUnsignedElementType ( type )

IsUnsignedElementType soyut işlemi, type (bir TypedArray eleman türü (TypedArray element type)) argümanını alır ve bir Boolean döndürür. type argümanının işaretsiz (unsigned) bir TypedArray eleman türü (TypedArray element type) olup olmadığını doğrular. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer type; uint8, uint8clamped, uint16, uint32 veya biguint64 değerlerinden biriyse, true döndür.

  2. false döndür.

25.1.3.11 IsUnclampedIntegerElementType ( type )

IsUnclampedIntegerElementType soyut işlemi, type (bir TypedArray eleman türü (TypedArray element type)) argümanını alır ve bir Boolean döndürür. type argümanının uint8clamped hariç bir Tamsayı (Integer) TypedArray eleman türü (TypedArray element type) olup olmadığını doğrular. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer type; int8, uint8, int16, uint16, int32 veya uint32 değerlerinden biriyse, true döndür.

  2. false döndür.

25.1.3.12 IsBigIntElementType ( type )

IsBigIntElementType soyut işlemi, type (bir TypedArray eleman türü (TypedArray element type)) argümanını alır ve bir Boolean döndürür. type argümanının bir BigInt TypedArray eleman türü (TypedArray element type) olup olmadığını doğrular. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer type; biguint64 veya bigint64 değerlerinden biriyse, true döndür.

  2. false döndür.

25.1.3.13 IsNoTearConfiguration ( type, order )

IsNoTearConfiguration soyut işlemi, type (bir TypedArray eleman türü (TypedArray element type)) ve order (seq-cst, unordered veya init) argümanlarını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer IsUnclampedIntegerElementType(type) true ise, true döndür.

  2. Eğer IsBigIntElementType(type) true ise ve order; ne init ne de unordered ise, true döndür.

  3. false döndür.

25.1.3.14 RawBytesToNumeric ( type, rawBytes, isLittleEndian )

RawBytesToNumeric soyut işlemi, type (bir TypedArray eleman türü (TypedArray element type)), rawBytes (bayt değerleri Listesi (List)) ve isLittleEndian (bir Boolean) argümanlarını alır ve bir Sayı (Number) veya BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. elementSize, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.

  2. Eğer isLittleEndian false ise, rawBytes elemanlarının sırasını tersine çevir.

  3. Eğer type float16 ise, o zaman

    1. value, rawBytes bayt elemanlarının birleştirilmesi ve bir IEEE 754-2019 binary16 değerinin little-endian bit dizisi kodlaması olarak yorumlanmasıyla elde edilen değer olsun.

    2. Eğer value bir NaN ise, NaN döndür.

    3. value değerine karşılık gelen Sayı (Number) değerini döndür.

  4. Eğer type float32 ise, o zaman

    1. value, rawBytes bayt elemanlarının birleştirilmesi ve bir IEEE 754-2019 binary32 değerinin little-endian bit dizisi kodlaması olarak yorumlanmasıyla elde edilen değer olsun.

    2. Eğer value bir NaN ise, NaN döndür.

    3. value değerine karşılık gelen Sayı (Number) değerini döndür.

  5. Eğer type float64 ise, o zaman

    1. value, rawBytes bayt elemanlarının birleştirilmesi ve bir IEEE 754-2019 binary64 değerinin little-endian bit dizisi kodlaması olarak yorumlanmasıyla elde edilen değer olsun.

    2. Eğer value bir NaN ise, NaN döndür.

    3. value değerine karşılık gelen Sayı (Number) değerini döndür.

  6. Eğer IsUnsignedElementType(type) true ise, o zaman

    1. intValue, rawBytes bayt elemanlarının birleştirilmesi ve işaretsiz bir little-endian ikili (binary) sayının bit dizisi kodlaması olarak yorumlanmasıyla elde edilen değer olsun.
  7. Değilse,

    1. intValue, rawBytes bayt elemanlarının birleştirilmesi ve bit uzunluğu elementSize × 8 olan ikili little-endian ikiye tümleyen (two's complement) sayısının bit dizisi kodlaması olarak yorumlanmasıyla elde edilen değer olsun.
  8. Eğer IsBigIntElementType(type) true ise, intValue değerine karşılık gelen BigInt değerini döndür.

  9. intValue değerine karşılık gelen Sayı (Number) değerini döndür.

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

GetRawBytesFromSharedBlock soyut işlemi, block (bir Paylaşılan Veri Bloğu (Shared Data Block)), byteIndex (negatif olmayan bir tamsayı (integer)), type (bir TypedArray eleman türü (TypedArray element type)), isTypedArray (bir Boolean) ve order (seq-cst veya unordered) argümanlarını alır ve bayt değerleri (byte values) içeren bir Liste (List) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. elementSize, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.

  2. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

  3. execution, agentRecord.[[CandidateExecution]] olsun.

  4. eventsRecord, execution.[[EventsRecords]] içindeki [[AgentSignifier]] değeri AgentSignifier() olan Aracı Olayları Kaydı (Agent Events Record) olsun.

  5. Eğer isTypedArray true ise ve IsNoTearConfiguration(type, order) true ise, noTear değerini true olarak ayarla; aksi takdirde noTear değerini false olarak ayarla.

  6. rawValue, elemanları deterministik olmayan şekilde seçilmiş bayt değerleri (byte values) olan, elementSize uzunluğunda yeni bir Liste (List) olsun.

  7. NOTE: Uygulamalarda rawValue, alt donanımdaki atomik olmayan veya atomik bir okuma talimatının sonucudur. Belirsizlik (nondeterminism), zayıf tutarlılığa sahip donanımın gözlemlenebilir davranışını tanımlamak için bellek modelinin (memory model) semantik bir yönergesidir.

  8. readEvent, ReadSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize } olsun.

  9. readEvent olayını eventsRecord.[[EventList]] listesine ekle.

  10. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: rawValue } kaydını execution.[[ChosenValues]] listesine ekle.

  11. rawValue döndür.

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

GetValueFromBuffer soyut işlemi, arrayBuffer (bir ArrayBuffer veya SharedArrayBuffer), byteIndex (negatif olmayan bir tamsayı (integer)), type (bir TypedArray eleman türü (TypedArray element type)), isTypedArray (bir Boolean) ve order (seq-cst veya unordered) argümanlarını ve isteğe bağlı isLittleEndian (bir Boolean) argümanını alır ve bir Sayı (Number) veya BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsDetachedBuffer(arrayBuffer) false değeridir.

  2. Assert: arrayBuffer içinde byteIndex konumundan başlayarak bir type değerini temsil etmek için yeterli bayt bulunmaktadır.

  3. block, arrayBuffer.[[ArrayBufferData]] olsun.

  4. elementSize, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.

  5. Eğer IsSharedArrayBuffer(arrayBuffer) true ise, o zaman

    1. Assert: block bir Paylaşılan Veri Bloğudur (Shared Data Block).

    2. rawValue, GetRawBytesFromSharedBlock(block, byteIndex, type, isTypedArray, order) olsun.

  6. Değilse,

    1. rawValue, elemanları block içindeki byteIndex (dahil) ile byteIndex + elementSize (hariç) aralığındaki (interval) indekslerdeki baytlar olan bir Liste (List) olsun.
  7. Assert: rawValue içindeki eleman sayısı elementSize değeridir.

  8. Eğer isLittleEndian mevcut değilse, o zaman

    1. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

    2. isLittleEndian değerini agentRecord.[[LittleEndian]] olarak ayarla.

  9. RawBytesToNumeric(type, rawValue, isLittleEndian) döndür.

25.1.3.17 NumericToRawBytes ( type, value, isLittleEndian )

NumericToRawBytes soyut işlemi, type (bir TypedArray eleman türü (TypedArray element type)), value (bir Sayı (Number) veya BigInt) ve isLittleEndian (bir Boolean) argümanlarını alır ve bayt değerleri (byte values) içeren bir Liste (List) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer type float16 ise, o zaman

    1. rawBytes, elemanları roundTiesToEven modu kullanılarak value değerinin IEEE 754-2019 binary16 formatına dönüştürülmesiyle elde edilen 2 bayt olan bir Liste (List) olsun. Baytlar little-endian sırasına göre düzenlenir. Eğer value NaN ise, rawBytes uygulamaya göre seçilmiş herhangi bir IEEE 754-2019 binary16 formatı NaN kodlaması olarak ayarlanabilir. Uygulama, uygulamaya göre ayırt edilebilen her bir NaN değeri için her zaman aynı kodlamayı seçmelidir.
  2. Değilse eğer type float32 ise, o zaman

    1. rawBytes, elemanları roundTiesToEven modu kullanılarak value değerinin IEEE 754-2019 binary32 formatına dönüştürülmesiyle elde edilen 4 bayt olan bir Liste (List) olsun. Baytlar little-endian sırasına göre düzenlenir. Eğer value NaN ise, rawBytes uygulamaya göre seçilmiş herhangi bir IEEE 754-2019 binary32 formatı NaN kodlaması olarak ayarlanabilir. Uygulama, uygulamaya göre ayırt edilebilen her bir NaN değeri için her zaman aynı kodlamayı seçmelidir.
  3. Değilse eğer type float64 ise, o zaman

    1. rawBytes, elemanları value değerinin IEEE 754-2019 binary64 formatı kodlaması olan 8 bayt olan bir Liste (List) olsun. Baytlar little-endian sırasına göre düzenlenir. Eğer value NaN ise, rawBytes uygulamaya göre seçilmiş herhangi bir IEEE 754-2019 binary64 formatı NaN kodlaması olarak ayarlanabilir. Uygulama, uygulamaya göre ayırt edilebilen her bir NaN değeri için her zaman aynı kodlamayı seçmelidir.
  4. Değilse,

    1. n, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.

    2. conversionOperation, Eleman Türü type için Tablo 70 içindeki "Conversion Operation" (Dönüşüm İşlemi) sütununda adı geçen soyut işlem olsun.

    3. intValue, (! conversionOperation(value)) olsun.

    4. Eğer intValue ≥ 0 ise, o zaman

         1. *rawBytes*, elemanları *intValue* değerinin *n*-baytlık ikili kodlaması olan bir [Liste (List)](07_sec-ecmascript-data-types-and-values.md#sec-list-and-record-specification-type) olsun. Baytlar little-endian sırasına göre sıralanır.
    5. Değilse,

         1. *rawBytes*, elemanları *intValue* değerinin *n*-baytlık ikili ikiye tümleyen kodlaması olan bir [Liste (List)](07_sec-ecmascript-data-types-and-values.md#sec-list-and-record-specification-type) olsun. Baytlar little-endian sırasına göre sıralanır.
  5. Eğer isLittleEndian false ise, rawBytes elemanlarının sırasını tersine çevir.

  6. rawBytes döndür.

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

SetValueInBuffer soyut işlemi, arrayBuffer (bir ArrayBuffer veya SharedArrayBuffer), byteIndex (negatif olmayan bir tamsayı (integer)), type (bir TypedArray eleman türü (TypedArray element type)), value (bir Sayı (Number) veya BigInt), isTypedArray (bir Boolean) ve order (seq-cst, unordered veya init) argümanlarını ve isteğe bağlı isLittleEndian (bir Boolean) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsDetachedBuffer(arrayBuffer) false değeridir.

  2. Assert: arrayBuffer içinde byteIndex konumundan başlayarak bir type değerini temsil etmek için yeterli bayt bulunmaktadır.

  3. Assert: Eğer IsBigIntElementType(type) true ise, value bir BigInt'tir (is a BigInt); aksi takdirde value bir Sayıdır (is a Number).

  4. block, arrayBuffer.[[ArrayBufferData]] olsun.

  5. elementSize, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.

  6. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

  7. Eğer isLittleEndian mevcut değilse, o zaman

    1. isLittleEndian değerini agentRecord.[[LittleEndian]] olarak ayarla.
  8. rawBytes, NumericToRawBytes(type, value, isLittleEndian) olsun.

  9. Eğer IsSharedArrayBuffer(arrayBuffer) true ise, o zaman

    1. execution, agentRecord.[[CandidateExecution]] olsun.

    2. eventsRecord, execution.[[EventsRecords]] içindeki [[AgentSignifier]] değeri AgentSignifier() olan Aracı Olayları Kaydı (Agent Events Record) olsun.

    3. Eğer isTypedArray true ise ve IsNoTearConfiguration(type, order) true ise, noTear değerini true olarak ayarla; aksi takdirde noTear değerini false olarak ayarla.

    4. WriteSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes } işlemini eventsRecord.[[EventList]] listesine ekle.

  10. Değilse,

    1. rawBytes listesinin bireysel baytlarını, block[byteIndex] konumundan başlayarak block içine kaydet.
  11. unused döndür.

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

GetModifySetValueInBuffer soyut işlemi, arrayBuffer (bir ArrayBuffer veya SharedArrayBuffer), byteIndex (negatif olmayan bir tamsayı (integer)), type (bir TypedArray eleman türü (TypedArray element type)), value (bir Sayı (Number) veya BigInt) ve op (bir oku-değiştir-yaz değişiklik fonksiyonu) argümanlarını alır ve bir Sayı (Number) veya BigInt döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsDetachedBuffer(arrayBuffer) false değeridir.

  2. Assert: arrayBuffer içinde byteIndex konumundan başlayarak bir type değerini temsil etmek için yeterli bayt bulunmaktadır.

  3. Assert: Eğer IsBigIntElementType(type) true ise, value bir BigInt'tir (is a BigInt); aksi takdirde value bir Sayıdır (is a Number).

  4. block, arrayBuffer.[[ArrayBufferData]] olsun.

  5. elementSize, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.

  6. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

  7. isLittleEndian, agentRecord.[[LittleEndian]] olsun.

  8. rawBytes, NumericToRawBytes(type, value, isLittleEndian) olsun.

  9. Eğer IsSharedArrayBuffer(arrayBuffer) true ise, o zaman

    1. execution, agentRecord.[[CandidateExecution]] olsun.

    2. eventsRecord, execution.[[EventsRecords]] içindeki [[AgentSignifier]] değeri AgentSignifier() olan Aracı Olayları Kaydı (Agent Events Record) olsun.

    3. rawBytesRead, elemanları deterministik olmayan şekilde seçilmiş bayt değerleri (byte values) olan, elementSize uzunluğunda bir Liste (List) olsun.

    4. NOTE: Uygulamalarda rawBytesRead, alt donanımdaki load-link, load-exclusive veya bir oku-değiştir-yaz talimatının işleneninin (operand) sonucudur. Belirsizlik (nondeterminism), zayıf tutarlılığa sahip donanımın gözlemlenebilir davranışını tanımlamak için bellek modelinin (memory model) semantik bir yönergesidir.

    5. rmwEvent, ReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes, [[ModifyOp]]: op } olsun.

    6. rmwEvent olayını eventsRecord.[[EventList]] listesine ekle.

    7. Chosen Value Record { [[Event]]: rmwEvent, [[ChosenValue]]: rawBytesRead } kaydını execution.[[ChosenValues]] listesine ekle.

  10. Değilse,

    1. rawBytesRead, elemanları block[byteIndex] konumundan başlayan elementSize baytlık dizi olan, elementSize uzunluğunda bir Liste (List) olsun.

    2. rawBytesModified, op(rawBytesRead, rawBytes) olsun.

    3. rawBytesModified listesinin bireysel baytlarını, block[byteIndex] konumundan başlayarak block içine kaydet.

  11. RawBytesToNumeric(type, rawBytesRead, isLittleEndian) döndür.

25.1.4 ArrayBuffer Yapıcısı (The ArrayBuffer Constructor)

ArrayBuffer yapıcısı (constructor):

  • %ArrayBuffer% nesnesidir.

  • global nesnenin (global object) "ArrayBuffer" özelliğinin ilk değeridir.

  • bir yapıcı (constructor) olarak çağrıldığında yeni bir ArrayBuffer oluşturur ve başlatır.

  • fonksiyon olarak çağrılması amaçlanmamıştır ve bu şekilde çağrıldığında bir istisna fırlatır.

  • bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen ArrayBuffer davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors) alt sınıf örneğini oluşturmak ve başlatmak için ArrayBuffer yapıcısına (constructor) bir super çağrısı içermelidir.

25.1.4.1 ArrayBuffer ( length [ , options ] )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.

  2. byteLength, ? ToIndex(length) olsun.

  3. requestedMaxByteLength, ? GetArrayBufferMaxByteLengthOption(options) olsun.

  4. ? AllocateArrayBuffer(NewTarget, byteLength, requestedMaxByteLength) döndür.

25.1.5 ArrayBuffer Yapıcısının Özellikleri (Properties of the ArrayBuffer Constructor)

ArrayBuffer yapıcısı (constructor):

  • değeri %Function.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • aşağıdaki özelliklere sahiptir:

25.1.5.1 ArrayBuffer.isView ( arg )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer arg bir Nesne değilse (is not an Object), false döndür.

  2. Eğer arg bir [[ViewedArrayBuffer]] dahili yuvasına sahipse, true döndür.

  3. false döndür.

25.1.5.2 ArrayBuffer.prototype

ArrayBuffer.prototype özelliğinin ilk değeri ArrayBuffer prototip nesnesidir (ArrayBuffer prototype object).

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

25.1.5.3 get ArrayBuffer [ %Symbol.species% ]

ArrayBuffer[%Symbol.species%], set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. this değerini döndür.

Bu fonksiyonun "name" özelliğinin ilk değeri "get [Symbol.species]" şeklindedir.

25.1.6 ArrayBuffer Prototip Nesnesinin Özellikleri (Properties of the ArrayBuffer Prototype Object)

ArrayBuffer prototip nesnesi:

25.1.6.1 get ArrayBuffer.prototype.byteLength

ArrayBuffer.prototype.byteLength, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) true ise, bir TypeError istisnası fırlat.

  4. Eğer IsDetachedBuffer(obj) true ise, +0𝔽 döndür.

  5. length, obj.[[ArrayBufferByteLength]] olsun.

  6. 𝔽(length) döndür.

25.1.6.2 ArrayBuffer.prototype.constructor

ArrayBuffer.prototype.constructor özelliğinin ilk değeri %ArrayBuffer% yapıcısıdır.

25.1.6.3 get ArrayBuffer.prototype.detached

ArrayBuffer.prototype.detached, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) true ise, bir TypeError istisnası fırlat.

  4. IsDetachedBuffer(obj) döndür.

25.1.6.4 get ArrayBuffer.prototype.maxByteLength

ArrayBuffer.prototype.maxByteLength, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) true ise, bir TypeError istisnası fırlat.

  4. Eğer IsDetachedBuffer(obj) true ise, +0𝔽 döndür.

  5. Eğer IsFixedLengthArrayBuffer(obj) true ise, o zaman

    1. length, obj.[[ArrayBufferByteLength]] olsun.
  6. Değilse,

    1. length, obj.[[ArrayBufferMaxByteLength]] olsun.
  7. 𝔽(length) döndür.

25.1.6.5 get ArrayBuffer.prototype.resizable

ArrayBuffer.prototype.resizable, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) true ise, bir TypeError istisnası fırlat.

  4. Eğer IsFixedLengthArrayBuffer(obj) false ise, true döndür.

  5. false döndür.

25.1.6.6 ArrayBuffer.prototype.resize ( newLength )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferMaxByteLength]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) true ise, bir TypeError istisnası fırlat.

  4. newByteLength, ? ToIndex(newLength) olsun.

  5. Eğer IsDetachedBuffer(obj) true ise, bir TypeError istisnası fırlat.

  6. Eğer newByteLength > obj.[[ArrayBufferMaxByteLength]] ise, bir RangeError istisnası fırlat.

  7. hostHandled, ? HostResizeArrayBuffer(obj, newByteLength) olsun.

  8. Eğer hostHandled, handled ise, undefined döndür.

  9. oldBlock, obj.[[ArrayBufferData]] olsun.

  10. newBlock, ? CreateByteDataBlock(newByteLength) olsun.

  11. copyLength, min(newByteLength, obj.[[ArrayBufferByteLength]]) olsun.

  12. CopyDataBlockBytes(newBlock, 0, oldBlock, 0, copyLength) işlemini gerçekleştir.

  13. NOTE: Ne yeni Veri Bloğunun (Data Block) oluşturulması ne de eski Veri Bloğundan (Data Block) kopyalanması gözlemlenebilirdir. Uygulamalar bu metodu yerinde büyüme (in-place growth) veya küçülme (shrinkage) olarak uygulayabilir.

  14. obj.[[ArrayBufferData]] değerini newBlock olarak ayarla.

  15. obj.[[ArrayBufferByteLength]] değerini newByteLength olarak ayarla.

  16. undefined döndür.

25.1.6.7 ArrayBuffer.prototype.slice ( start, end )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) true ise, bir TypeError istisnası fırlat.

  4. Eğer IsDetachedBuffer(obj) true ise, bir TypeError istisnası fırlat.

  5. length, obj.[[ArrayBufferByteLength]] olsun.

  6. relativeStart, ? ToIntegerOrInfinity(start) olsun.

  7. Eğer relativeStart = -∞ ise, first değerini 0 olarak ayarla.

  8. Değilse eğer relativeStart < 0 ise, first değerini max(length + relativeStart, 0) olarak ayarla.

  9. Değilse, first değerini min(relativeStart, length) olarak ayarla.

  10. Eğer end undefined ise, relativeEnd değerini length olarak ayarla; aksi takdirde relativeEnd değerini ? ToIntegerOrInfinity(end) olarak ayarla.

  11. Eğer relativeEnd = -∞ ise, final değerini 0 olarak ayarla.

  12. Değilse eğer relativeEnd < 0 ise, final değerini max(length + relativeEnd, 0) olarak ayarla.

  13. Değilse, final değerini min(relativeEnd, length) olarak ayarla.

  14. newLength, max(final - first, 0) olsun.

  15. ctor, ? SpeciesConstructor(obj, %ArrayBuffer%) olsun.

  16. new, ? Construct(ctor, « 𝔽(newLength) ») olsun.

  17. ? RequireInternalSlot(new, [[ArrayBufferData]]) işlemini gerçekleştir.

  18. Eğer IsSharedArrayBuffer(new) true ise, bir TypeError istisnası fırlat.

  19. Eğer IsDetachedBuffer(new) true ise, bir TypeError istisnası fırlat.

  20. Eğer SameValue(new, obj) true ise, bir TypeError istisnası fırlat.

  21. Eğer new.[[ArrayBufferByteLength]] < newLength ise, bir TypeError istisnası fırlat.

  22. NOTE: Yukarıdaki adımların yan etkileri obj nesnesini ayırmış veya yeniden boyutlandırmış olabilir.

  23. Eğer IsDetachedBuffer(obj) true ise, bir TypeError istisnası fırlat.

  24. fromBuf, obj.[[ArrayBufferData]] olsun.

  25. toBuf, new.[[ArrayBufferData]] olsun.

  26. currentLength, obj.[[ArrayBufferByteLength]] olsun.

  27. Eğer first < currentLength ise, o zaman

    1. count, min(newLength, currentLength - first) olsun.

    2. CopyDataBlockBytes(toBuf, 0, fromBuf, first, count) işlemini gerçekleştir.

  28. new döndür.

25.1.6.8 ArrayBuffer.prototype.transfer ( [ newLength ] )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? ArrayBufferCopyAndDetach(obj, newLength, preserve-resizability) döndür.

25.1.6.9 ArrayBuffer.prototype.transferToFixedLength ( [ newLength ] )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? ArrayBufferCopyAndDetach(obj, newLength, fixed-length) döndür.

25.1.6.10 ArrayBuffer.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% özelliğinin ilk değeri, "ArrayBuffer" Dize (String) değeridir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

25.1.7 Properties of ArrayBuffer Instances

ArrayBuffer örnekleri, ArrayBuffer prototip nesnesinden (ArrayBuffer prototype object) özellikleri miras alırlar. Her ArrayBuffer örneği bir [[ArrayBufferData]] dahili yuvasına, bir [[ArrayBufferByteLength]] dahili yuvasına ve bir [[ArrayBufferDetachKey]] dahili yuvasına sahiptir. Yeniden boyutlandırılabilir olan her ArrayBuffer örneği ayrıca bir [[ArrayBufferMaxByteLength]] dahili yuvasına sahiptir.

[[ArrayBufferData]] değeri null olan ArrayBuffer örnekleri ayrılmış (detached) kabul edilir ve ArrayBuffer örneğinde bulunan verilere erişmek veya bunları değiştirmek için yapılan tüm işlemler başarısız olur.

[[ArrayBufferDetachKey]] değeri undefined dışında bir değere ayarlanmış olan ArrayBuffer örnekleri için yapılan tüm DetachArrayBuffer çağrılarında aynı "ayırma anahtarı" (detach key) argüman olarak geçirilmelidir, aksi takdirde bir TypeError oluşur. Bu dahili yuva sadece belirli yerleştirme ortamları (embedding environments) tarafından ayarlanır, bu belirtimdeki algoritmalar tarafından ayarlanmaz.

25.1.8 Yeniden Boyutlandırılabilir ArrayBuffer Yönergeleri (Resizable ArrayBuffer Guidelines)

25.2 SharedArrayBuffer Nesneleri (SharedArrayBuffer Objects)

25.2.1 Sabit Uzunluklu ve Büyütülebilir SharedArrayBuffer Nesneleri (Fixed-length and Growable SharedArrayBuffer Objects)

Sabit uzunluklu bir SharedArrayBuffer, oluşturulduktan sonra bayt uzunluğu değiştirilemeyen bir SharedArrayBuffer'dır.

Büyütülebilir bir SharedArrayBuffer, oluşturulduktan sonra SharedArrayBuffer.prototype.grow ( newLength ) çağrıları aracılığıyla bayt uzunluğu artırılabilen bir SharedArrayBuffer'dır.

Oluşturulan SharedArrayBuffer nesnesinin türü, SharedArrayBuffer ( length [ , options ] ) işlevine aktarılan argümanlara bağlıdır.

25.2.2 SharedArrayBuffer Nesneleri İçin Soyut İşlemler (Abstract Operations for SharedArrayBuffer Objects)

25.2.2.1 AllocateSharedArrayBuffer ( ctor, byteLength [ , maxByteLength ] )

AllocateSharedArrayBuffer soyut işlemi, ctor (bir yapıcı (constructor)) ve byteLength (negatif olmayan bir tamsayı (integer)) argümanlarını ve isteğe bağlı maxByteLength (negatif olmayan bir tamsayı (integer) veya empty) argümanını alır ve bir SharedArrayBuffer içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Bir SharedArrayBuffer oluşturmak için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. slots, « [[ArrayBufferData]] » olsun.

  2. Eğer maxByteLength mevcutsa ve maxByteLength empty değilse, allocatingGrowableBuffer değerini true olarak ayarla; aksi takdirde allocatingGrowableBuffer değerini false olarak ayarla.

  3. Eğer allocatingGrowableBuffer true ise, o zaman

    1. Eğer byteLength > maxByteLength ise, bir RangeError istisnası fırlat.

    2. [[ArrayBufferByteLengthData]] ve [[ArrayBufferMaxByteLength]] özelliklerini slots listesine ekle.

  4. Değilse,

    1. [[ArrayBufferByteLength]] özelliğini slots listesine ekle.
  5. obj, ? OrdinaryCreateFromConstructor(ctor, "%SharedArrayBuffer.prototype%", slots) olsun.

  6. Eğer allocatingGrowableBuffer true ise, allocLength değerini maxByteLength olarak ayarla; aksi takdirde allocLength değerini byteLength olarak ayarla.

  7. block, ? CreateSharedByteDataBlock(allocLength) olsun.

  8. obj.[[ArrayBufferData]] değerini block olarak ayarla.

  9. Eğer allocatingGrowableBuffer true ise, o zaman

    1. Assert: byteLengthmaxByteLength.

    2. byteLengthBlock, ? CreateSharedByteDataBlock(8) olsun.

    3. SetValueInBuffer(byteLengthBlock, 0, biguint64, (byteLength), true, seq-cst) işlemini gerçekleştir.

    4. obj.[[ArrayBufferByteLengthData]] değerini byteLengthBlock olarak ayarla.

    5. obj.[[ArrayBufferMaxByteLength]] değerini maxByteLength olarak ayarla.

  10. Değilse,

    1. obj.[[ArrayBufferByteLength]] değerini byteLength olarak ayarla.
  11. obj döndür.

25.2.2.2 IsSharedArrayBuffer ( obj )

IsSharedArrayBuffer soyut işlemi, obj (bir ArrayBuffer veya SharedArrayBuffer) argümanını alır ve bir Boolean döndürür. Bir nesnenin SharedArrayBuffer olup olmadığını test eder. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer obj.[[ArrayBufferData]] bir Paylaşılan Veri Bloğu (Shared Data Block) ise, true döndür.

  2. false döndür.

25.2.2.3 IsGrowableSharedArrayBuffer ( obj )

IsGrowableSharedArrayBuffer soyut işlemi, obj (bir ArrayBuffer veya SharedArrayBuffer) argümanını alır ve bir Boolean döndürür. Bir nesnenin büyütülebilir bir SharedArrayBuffer olup olmadığını test eder. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer IsSharedArrayBuffer(obj) true ise ve obj bir [[ArrayBufferByteLengthData]] dahili yuvasına sahipse, true döndür.

  2. false döndür.

25.2.2.4 HostGrowSharedArrayBuffer ( buffer, newByteLength )

Ana bilgisayar tarafından tanımlanmış (host-defined) HostGrowSharedArrayBuffer soyut işlemi, buffer (bir SharedArrayBuffer) ve newByteLength (negatif olmayan bir tamsayı (integer)) argümanlarını alır ve handled ya da unhandled içeren bir olağan tamamlanma (normal completion containing) veya bir fırlatma tamamlanması (throw completion) döndürür. Ana bilgisayara (host), buffer nesnesinin uygulama tarafından tanımlanmış (implementation-defined) büyütülmesini gerçekleştirme fırsatı verir. Eğer ana bilgisayar (host) buffer nesnesinin büyütülmesini işlememeyi seçerse, varsayılan davranış için unhandled döndüebilir.

HostGrowSharedArrayBuffer uygulaması aşağıdaki gereksinimlere uygun olmalıdır:

HostGrowSharedArrayBuffer varsayılan uygulaması, NormalCompletion(unhandled) döndürmektir.

25.2.3 SharedArrayBuffer Yapıcısı (The SharedArrayBuffer Constructor)

SharedArrayBuffer yapıcısı (constructor):

  • %SharedArrayBuffer% nesnesidir.

  • eğer mevcutsa (aşağıya bakın), global nesnenin (global object) "SharedArrayBuffer" özelliğinin ilk değeridir.

  • bir yapıcı (constructor) olarak çağrıldığında yeni bir SharedArrayBuffer oluşturur ve başlatır.

  • fonksiyon olarak çağrılması amaçlanmamıştır ve bu şekilde çağrıldığında bir istisna fırlatır.

  • bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen SharedArrayBuffer davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors) alt sınıf örneklerini oluşturmak ve başlatmak için SharedArrayBuffer yapıcısına (constructor) bir super çağrısı içermelidir.

Bir ana bilgisayar (host) SharedArrayBuffer nesnelerine eşzamanlı erişim sağlamadığında, global nesnenin (global object) "SharedArrayBuffer" özelliğini atlayabilir.

25.2.3.1 SharedArrayBuffer ( length [ , options ] )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.

  2. byteLength, ? ToIndex(length) olsun.

  3. requestedMaxByteLength, ? GetArrayBufferMaxByteLengthOption(options) olsun.

  4. ? AllocateSharedArrayBuffer(NewTarget, byteLength, requestedMaxByteLength) döndür.

25.2.4 SharedArrayBuffer Yapıcısının Özellikleri (Properties of the SharedArrayBuffer Constructor)

SharedArrayBuffer yapıcısı (constructor):

  • değeri %Function.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • aşağıdaki özelliklere sahiptir:

25.2.4.1 SharedArrayBuffer.prototype

SharedArrayBuffer.prototype özelliğinin ilk değeri SharedArrayBuffer prototip nesnesidir (SharedArrayBuffer prototype object).

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

25.2.4.2 get SharedArrayBuffer [ %Symbol.species% ]

SharedArrayBuffer[%Symbol.species%], set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. this değerini döndür.

Bu fonksiyonun "name" özelliğinin ilk değeri "get [Symbol.species]" şeklindedir.

25.2.5 SharedArrayBuffer Prototip Nesnesinin Özellikleri (Properties of the SharedArrayBuffer Prototype Object)

SharedArrayBuffer prototip nesnesi:

25.2.5.1 get SharedArrayBuffer.prototype.byteLength

SharedArrayBuffer.prototype.byteLength, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) false ise, bir TypeError istisnası fırlat.

  4. length, ArrayBufferByteLength(obj, seq-cst) olsun.

  5. 𝔽(length) döndür.

25.2.5.2 SharedArrayBuffer.prototype.constructor

SharedArrayBuffer.prototype.constructor özelliğinin ilk değeri %SharedArrayBuffer% yapıcısıdır.

25.2.5.3 SharedArrayBuffer.prototype.grow ( newLength )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferMaxByteLength]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) false ise, bir TypeError istisnası fırlat.

  4. newByteLength, ? ToIndex(newLength) olsun.

  5. hostHandled, ? HostGrowSharedArrayBuffer(obj, newByteLength) olsun.

  6. Eğer hostHandled handled ise, undefined döndür.

  7. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

  8. isLittleEndian, agentRecord.[[LittleEndian]] olsun.

  9. byteLengthBlock, obj.[[ArrayBufferByteLengthData]] olsun.

  10. currentByteLengthRawBytes, GetRawBytesFromSharedBlock(byteLengthBlock, 0, biguint64, true, seq-cst) olsun.

  11. newByteLengthRawBytes, NumericToRawBytes(biguint64, (newByteLength), isLittleEndian) olsun.

  12. Tekrarla,

    1. NOTE: Bu, aynı arabelleğin paralel, yarışan büyütme işlemlerinin tamamen sıralanmasını, kaybolmamasını ve sessizce hiçbir şey yapmamasını sağlamak için bir karşılaştır-ve-değiştir (compare-and-exchange) döngüsüdür. Döngü, çekişmesiz bir şekilde büyütmeye çalışabildiğinde sona erer.

    2. currentByteLength, (RawBytesToNumeric(biguint64, currentByteLengthRawBytes, isLittleEndian)) olsun.

    3. Eğer newByteLength = currentByteLength ise, undefined döndür.

    4. Eğer newByteLength < currentByteLength veya newByteLength > obj.[[ArrayBufferMaxByteLength]] ise, bir RangeError istisnası fırlat.

    5. byteLengthDelta, newByteLength - currentByteLength olsun.

    6. Eğer byteLengthDelta bayttan oluşan yeni bir Paylaşılan Veri Bloğu (Shared Data Block) değeri oluşturmak imkansızsa, bir RangeError istisnası fırlat.

    7. NOTE: Burada yeni bir Paylaşılan Veri Bloğu (Shared Data Block) oluşturulmaz ve kullanılmaz. Büyütülebilir SharedArrayBuffer nesnelerinin gözlemlenebilir davranışı, oluşturma zamanında max-boyutlu bir Paylaşılan Veri Bloğu (Shared Data Block) tahsis edilerek belirtilir ve bu adım, belleği tükenen uygulamaların bir RangeError fırlatması gerekliliğini yansıtır.

    8. readByteLengthRawBytes, AtomicCompareExchangeInSharedBlock(byteLengthBlock, 0, 8, currentByteLengthRawBytes, newByteLengthRawBytes) olsun.

    9. Eğer ByteListEqual(readByteLengthRawBytes, currentByteLengthRawBytes) true ise, undefined döndür.

    10. currentByteLengthRawBytes değerini readByteLengthRawBytes olarak ayarla.

25.2.5.4 get SharedArrayBuffer.prototype.growable

SharedArrayBuffer.prototype.growable, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) false ise, bir TypeError istisnası fırlat.

  4. Eğer IsFixedLengthArrayBuffer(obj) false ise, true döndür.

  5. false döndür.

25.2.5.5 get SharedArrayBuffer.prototype.maxByteLength

SharedArrayBuffer.prototype.maxByteLength, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) false ise, bir TypeError istisnası fırlat.

  4. Eğer IsFixedLengthArrayBuffer(obj) true ise, o zaman

    1. length, obj.[[ArrayBufferByteLength]] olsun.
  5. Değilse,

    1. length, obj.[[ArrayBufferMaxByteLength]] olsun.
  6. 𝔽(length) döndür.

25.2.5.6 SharedArrayBuffer.prototype.slice ( start, end )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. Eğer IsSharedArrayBuffer(obj) false ise, bir TypeError istisnası fırlat.

  4. length, ArrayBufferByteLength(obj, seq-cst) olsun.

  5. relativeStart, ? ToIntegerOrInfinity(start) olsun.

  6. Eğer relativeStart = -∞ ise, first değerini 0 olarak ayarla.

  7. Değilse eğer relativeStart < 0 ise, first değerini max(length + relativeStart, 0) olarak ayarla.

  8. Değilse, first değerini min(relativeStart, length) olarak ayarla.

  9. Eğer end undefined ise, relativeEnd değerini length olarak ayarla; aksi takdirde relativeEnd değerini ? ToIntegerOrInfinity(end) olarak ayarla.

  10. Eğer relativeEnd = -∞ ise, final değerini 0 olarak ayarla.

  11. Değilse eğer relativeEnd < 0 ise, final değerini max(length + relativeEnd, 0) olarak ayarla.

  12. Değilse, final değerini min(relativeEnd, length) olarak ayarla.

  13. newLength, max(final - first, 0) olsun.

  14. ctor, ? SpeciesConstructor(obj, %SharedArrayBuffer%) olsun.

  15. new, ? Construct(ctor, « 𝔽(newLength) ») olsun.

  16. ? RequireInternalSlot(new, [[ArrayBufferData]]) işlemini gerçekleştir.

  17. Eğer IsSharedArrayBuffer(new) false ise, bir TypeError istisnası fırlat.

  18. Eğer new.[[ArrayBufferData]] değeri obj.[[ArrayBufferData]] ile aynıysa, bir TypeError istisnası fırlat.

  19. Eğer ArrayBufferByteLength(new, seq-cst) < newLength ise, bir TypeError istisnası fırlat.

  20. fromBuf, obj.[[ArrayBufferData]] olsun.

  21. toBuf, new.[[ArrayBufferData]] olsun.

  22. CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLength) işlemini gerçekleştir.

  23. new döndür.

25.2.5.7 SharedArrayBuffer.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%(07_sec-ecmascript-data-types-and-values.md#sec-well-known-symbols) özelliğinin ilk değeri "SharedArrayBuffer" dizgisidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

25.2.6 SharedArrayBuffer Örneklerinin Özellikleri (Properties of SharedArrayBuffer Instances)

SharedArrayBuffer örnekleri özellikleri SharedArrayBuffer prototip nesnesinden (SharedArrayBuffer prototype object) miras alır. Her SharedArrayBuffer örneği bir [[ArrayBufferData]] dahili yuvasına sahiptir. Büyütülebilir olmayan SharedArrayBuffer örneklerinin her biri bir [[ArrayBufferByteLength]] dahili yuvasına sahiptir. Büyütülebilir SharedArrayBuffer örneklerinin her biri ise bir [[ArrayBufferByteLengthData]] dahili yuvasına ve bir [[ArrayBufferMaxByteLength]] dahili yuvasına sahiptir.

25.2.7 Büyütülebilir SharedArrayBuffer Kılavuzları (Growable SharedArrayBuffer Guidelines)

25.3 DataView Nesneleri (DataView Objects)

25.3.1 DataView Nesneleri İçin Soyut İşlemler (Abstract Operations For DataView Objects)

25.3.1.1 Arabellek Tanıklı DataView Kayıtları (DataView With Buffer Witness Records)

Bir Arabellek Tanıklı DataView Kaydı (DataView With Buffer Witness Record), izlenen arabelleğin önbelleğe alınmış bayt uzunluğu ile birlikte bir DataView nesnesini kapsüllemek için kullanılan bir Kayıt (Record) değeridir. İzlenen arabellek büyütülebilir bir SharedArrayBuffer olduğunda, bayt uzunluğu veri bloğunun tek bir ReadSharedMemory olayının olmasını sağlamaya yardımcı olmak için kullanılır.

Arabellek Tanıklı DataView Kayıtları, Tablo 72 içinde listelenen alanlara sahiptir.

Tablo 72: Arabellek Tanıklı DataView Kaydı Alanları

Alan Adı Değer Anlamı
[[Object]] bir DataView Arabelleğinin bayt uzunluğu yüklenen DataView nesnesi.
[[CachedBufferByteLength]] negatif olmayan bir tamsayı (integer) veya detached Kayıt (Record) oluşturulduğunda nesnenin [[ViewedArrayBuffer]] yuvasının bayt uzunluğu.

25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj, order )

MakeDataViewWithBufferWitnessRecord soyut işlemi, obj (bir DataView) ve order (seq-cst or unordered) argümanlarını alır ve bir Arabellek Tanıklı DataView Kaydı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. buffer, obj.[[ViewedArrayBuffer]] olsun.

  2. Eğer IsDetachedBuffer(buffer) true ise, o zaman

    1. byteLength, detached olsun.
  3. Değilse,

    1. byteLength, ArrayBufferByteLength(buffer, order) olsun.
  4. Arabellek Tanıklı DataView Kaydını { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength } döndür.

25.3.1.3 GetViewByteLength ( viewRecord )

GetViewByteLength soyut işlemi, viewRecord (bir Arabellek Tanıklı DataView Kaydı) argümanını alır ve negatif olmayan bir tamsayı (integer) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsViewOutOfBounds(viewRecord) false değeridir.

  2. view, viewRecord.[[Object]] olsun.

  3. Eğer view.[[ByteLength]] auto değilse, view.[[ByteLength]] değerini döndür.

  4. Assert: IsFixedLengthArrayBuffer(view.[[ViewedArrayBuffer]]) false değeridir.

  5. byteOffset, view.[[ByteOffset]] olsun.

  6. byteLength, viewRecord.[[CachedBufferByteLength]] olsun.

  7. Assert: byteLength detached değildir.

  8. byteLength - byteOffset döndür.

25.3.1.4 IsViewOutOfBounds ( viewRecord )

IsViewOutOfBounds soyut işlemi, viewRecord (bir Arabellek Tanıklı DataView Kaydı) argümanını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, viewRecord.[[Object]] olsun.

  2. bufferByteLength, viewRecord.[[CachedBufferByteLength]] olsun.

  3. Eğer IsDetachedBuffer(view.[[ViewedArrayBuffer]]) true ise, o zaman

    1. Assert: bufferByteLength detached değeridir.

    2. true döndür.

  4. Assert: bufferByteLength negatif olmayan bir tamsayı (integer) değeridir.

  5. byteOffsetStart, view.[[ByteOffset]] olsun.

  6. Eğer view.[[ByteLength]] auto ise, o zaman

    1. byteOffsetEnd, bufferByteLength olsun.
  7. Değilse,

    1. byteOffsetEnd, byteOffsetStart + view.[[ByteLength]] olsun.
  8. NOTE: [[ByteOffset]] değeri bufferByteLength olan 0 uzunluğunda bir DataView sınır dışı sayılmaz.

  9. Eğer byteOffsetStart > bufferByteLength veya byteOffsetEnd > bufferByteLength ise, true döndür.

  10. false döndür.

25.3.1.5 GetViewValue ( view, requestIndex, isLittleEndian, type )

GetViewValue soyut işlemi, view (bir ECMAScript dil değeri (ECMAScript language value)), requestIndex (bir ECMAScript dil değeri (ECMAScript language value)), isLittleEndian (bir ECMAScript dil değeri (ECMAScript language value)) ve type (bir TypedArray eleman türü (TypedArray element type)) argümanlarını alır ve bir Sayı (Number) veya BigInt içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. DataView örnekleri üzerindeki fonksiyonlar tarafından görünümün arabelleğinden değerleri almak için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? RequireInternalSlot(view, [[DataView]]) işlemini gerçekleştir.

  2. Assert: view bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.

  3. getIndex, ? ToIndex(requestIndex) olsun.

  4. isLittleEndian değerini ToBoolean(isLittleEndian) olarak ayarla.

  5. viewOffset, view.[[ByteOffset]] olsun.

  6. viewRecord, MakeDataViewWithBufferWitnessRecord(view, unordered) olsun.

  7. NOTE: view nesnesinin arka deposu büyütülebilir bir SharedArrayBuffer olduğunda, sınır kontrolü bir eşzamanlama işlemi değildir.

  8. Eğer IsViewOutOfBounds(viewRecord) true ise, bir TypeError istisnası fırlat.

  9. viewSize, GetViewByteLength(viewRecord) olsun.

  10. elementSize, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.

  11. Eğer getIndex + elementSize > viewSize ise, bir RangeError istisnası fırlat.

  12. bufferIndex, getIndex + viewOffset olsun.

  13. GetValueFromBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, false, unordered, isLittleEndian) döndür.

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

SetViewValue soyut işlemi, view (bir ECMAScript dil değeri (ECMAScript language value)), requestIndex (bir ECMAScript dil değeri (ECMAScript language value)), isLittleEndian (bir ECMAScript dil değeri (ECMAScript language value)), type (bir TypedArray eleman türü (TypedArray element type)) ve value (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve undefined içeren bir olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. DataView örnekleri üzerindeki fonksiyonlar tarafından değerleri görünümün arabelleğine kaydetmek için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? RequireInternalSlot(view, [[DataView]]) işlemini gerçekleştir.

  2. Assert: view bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.

  3. getIndex, ? ToIndex(requestIndex) olsun.

  4. Eğer IsBigIntElementType(type) true ise, number, ? ToBigInt(value) olsun.

  5. Değilse, number, ? ToNumber(value) olsun.

  6. isLittleEndian değerini ToBoolean(isLittleEndian) olarak ayarla.

  7. viewOffset, view.[[ByteOffset]] olsun.

  8. viewRecord, MakeDataViewWithBufferWitnessRecord(view, unordered) olsun.

  9. NOTE: view nesnesinin arka deposu büyütülebilir bir SharedArrayBuffer olduğunda, sınır kontrolü bir eşzamanlama işlemi değildir.

  10. Eğer IsViewOutOfBounds(viewRecord) true ise, bir TypeError istisnası fırlat.

  11. viewSize, GetViewByteLength(viewRecord) olsun.

  12. elementSize, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.

  13. Eğer getIndex + elementSize > viewSize ise, bir RangeError istisnası fırlat.

  14. bufferIndex, getIndex + viewOffset olsun.

  15. SetValueInBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, number, false, unordered, isLittleEndian) işlemini gerçekleştir.

  16. undefined döndür.

25.3.2 DataView Yapıcısı (The DataView Constructor)

DataView yapıcısı (constructor):

  • %DataView% nesnesidir.

  • global nesnenin (global object) "DataView" özelliğinin ilk değeridir.

  • bir yapıcı (constructor) olarak çağrıldığında yeni bir DataView oluşturur ve başlatır.

  • fonksiyon olarak çağrılması amaçlanmamıştır ve bu şekilde çağrıldığında bir istisna fırlatır.

  • bir sınıf tanımının extends ifadesinin değeri olarak kullanılabilir. Belirtilen DataView davranışını miras almayı amaçlayan alt sınıf yapıcıları (constructors) alt sınıf örneklerini oluşturmak ve başlatmak için DataView yapıcısına (constructor) bir super çağrısı içermelidir.

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

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.

  2. ? RequireInternalSlot(buffer, [[ArrayBufferData]]) işlemini gerçekleştir.

  3. offset, ? ToIndex(byteOffset) olsun.

  4. Eğer IsDetachedBuffer(buffer) true ise, bir TypeError istisnası fırlat.

  5. bufferByteLength, ArrayBufferByteLength(buffer, seq-cst) olsun.

  6. Eğer offset > bufferByteLength ise, bir RangeError istisnası fırlat.

  7. bufferIsFixedLength, IsFixedLengthArrayBuffer(buffer) olsun.

  8. Eğer byteLength undefined ise, o zaman

    1. Eğer bufferIsFixedLength true ise, o zaman

      1. viewByteLength, bufferByteLength - offset olsun.
    2. Değilse,

      1. viewByteLength, auto olsun.
  9. Değilse,

    1. viewByteLength, ? ToIndex(byteLength) olsun.

    2. Eğer offset + viewByteLength > bufferByteLength ise, bir RangeError istisnası fırlat.

  10. obj, ? OrdinaryCreateFromConstructor(NewTarget, "%DataView.prototype%", « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] ») olsun.

  11. Eğer IsDetachedBuffer(buffer) true ise, bir TypeError istisnası fırlat.

  12. bufferByteLength değerini ArrayBufferByteLength(buffer, seq-cst) olarak ayarla.

  13. Eğer offset > bufferByteLength ise, bir RangeError istisnası fırlat.

  14. Eğer byteLength undefined değilse, o zaman

    1. Eğer offset + viewByteLength > bufferByteLength ise, bir RangeError istisnası fırlat.
  15. obj.[[ViewedArrayBuffer]] değerini buffer olarak ayarla.

  16. obj.[[ByteLength]] değerini viewByteLength olarak ayarla.

  17. obj.[[ByteOffset]] değerini offset olarak ayarla.

  18. obj döndür.

25.3.3 DataView Yapıcısının Özellikleri (Properties of the DataView Constructor)

DataView yapıcısı (constructor):

  • değeri %Function.prototype% olan bir [[Prototype]] dahili yuvasına sahiptir.

  • aşağıdaki özelliklere sahiptir:

25.3.3.1 DataView.prototype

DataView.prototype özelliğinin ilk değeri DataView prototip nesnesidir (DataView prototype object).

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } özniteliklerine sahiptir.

25.3.4 DataView Prototip Nesnesinin Özellikleri (Properties of the DataView Prototype Object)

DataView prototip nesnesi:

25.3.4.1 get DataView.prototype.buffer

DataView.prototype.buffer, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[DataView]]) işlemini gerçekleştir.

  3. Assert: obj bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.

  4. buffer, obj.[[ViewedArrayBuffer]] olsun.

  5. buffer döndür.

25.3.4.2 get DataView.prototype.byteLength

DataView.prototype.byteLength, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[DataView]]) işlemini gerçekleştir.

  3. Assert: obj bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.

  4. viewRecord, MakeDataViewWithBufferWitnessRecord(obj, seq-cst) olsun.

  5. Eğer IsViewOutOfBounds(viewRecord) true ise, bir TypeError istisnası fırlat.

  6. size, GetViewByteLength(viewRecord) olsun.

  7. 𝔽(size) döndür.

25.3.4.3 get DataView.prototype.byteOffset

DataView.prototype.byteOffset, set erişimci fonksiyonu undefined olan bir erişimci özelliktir (accessor property). Get erişimci fonksiyonu çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. obj, this değeri olsun.

  2. ? RequireInternalSlot(obj, [[DataView]]) işlemini gerçekleştir.

  3. Assert: obj bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.

  4. viewRecord, MakeDataViewWithBufferWitnessRecord(obj, seq-cst) olsun.

  5. Eğer IsViewOutOfBounds(viewRecord) true ise, bir TypeError istisnası fırlat.

  6. offset, obj.[[ByteOffset]] olsun.

  7. 𝔽(offset) döndür.

25.3.4.4 DataView.prototype.constructor

DataView.prototype.constructor özelliğinin ilk değeri %DataView% yapıcısıdır.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. ? GetViewValue(view, byteOffset, littleEndian, bigint64) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. ? GetViewValue(view, byteOffset, littleEndian, biguint64) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? GetViewValue(view, byteOffset, littleEndian, float16) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? GetViewValue(view, byteOffset, littleEndian, float32) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? GetViewValue(view, byteOffset, littleEndian, float64) döndür.

25.3.4.10 DataView.prototype.getInt8 ( byteOffset )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. ? GetViewValue(view, byteOffset, true, int8) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? GetViewValue(view, byteOffset, littleEndian, int16) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? GetViewValue(view, byteOffset, littleEndian, int32) döndür.

25.3.4.13 DataView.prototype.getUint8 ( byteOffset )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. ? GetViewValue(view, byteOffset, true, uint8) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? GetViewValue(view, byteOffset, littleEndian, uint16) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? GetViewValue(view, byteOffset, littleEndian, uint32) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. ? SetViewValue(view, byteOffset, littleEndian, bigint64, value) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. ? SetViewValue(view, byteOffset, littleEndian, biguint64, value) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? SetViewValue(view, byteOffset, littleEndian, float16, value) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? SetViewValue(view, byteOffset, littleEndian, float32, value) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? SetViewValue(view, byteOffset, littleEndian, float64, value) döndür.

25.3.4.21 DataView.prototype.setInt8 ( byteOffset, value )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. ? SetViewValue(view, byteOffset, true, int8, value) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? SetViewValue(view, byteOffset, littleEndian, int16, value) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? SetViewValue(view, byteOffset, littleEndian, int32, value) döndür.

25.3.4.24 DataView.prototype.setUint8 ( byteOffset, value )

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. ? SetViewValue(view, byteOffset, true, uint8, value) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? SetViewValue(view, byteOffset, littleEndian, uint16, value) döndür.

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

Bu metot çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. view, this değeri olsun.

  2. Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.

  3. ? SetViewValue(view, byteOffset, littleEndian, uint32, value) döndür.

25.3.4.27 DataView.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%(07_sec-ecmascript-data-types-and-values.md#sec-well-known-symbols) özelliğinin ilk değeri "DataView" dizgisidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

25.3.5 DataView Örneklerinin Özellikleri (Properties of DataView Instances)

DataView örnekleri, DataView prototip nesnesinden (DataView prototype object) miras alan sıradan nesnelerdir (ordinary objects). Her DataView örneği; [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]] ve [[ByteOffset]] dahili yuvalarına sahiptir.

25.4 Atomics Nesnesi (The Atomics Object)

Atomics nesnesi:

Atomics nesnesi, paylaşılan bellek dizi hücreleri üzerinde bölünemez (atomik) şekilde çalışan fonksiyonların yanı sıra aracıların (agents) ilkel olayları beklemesini ve göndermesini sağlayan fonksiyonlar sunar. Atomics fonksiyonları disiplinli kullanıldığında, paylaşılan bellek aracılığıyla iletişim kuran çok-[aracılı (agent)] programların paralel CPU'larda bile iyi anlaşılan bir sırayla çalışmasını sağlar. Paylaşılan bellek iletişimini yöneten kurallar aşağıda tanımlanan bellek modeli (memory model) tarafından sağlanır.

25.4.1 Garson Kaydı (Waiter Record)

Bir Garson Kaydı (Waiter Record), Atomics.wait veya Atomics.waitAsync çağrılarını belirtmek için kullanılan bir Kayıt (Record) değeridir.

Bir Garson Kaydı, Tablo 73 içinde listelenen alanlara sahiptir.

Tablo 73: Garson Kaydı Alanları

Alan Adı Değer Anlamı
[[AgentSignifier]] bir aracı belirteci (agent signifier) Atomics.wait veya Atomics.waitAsync metodunu çağıran aracı (agent).
[[PromiseCapability]] bir PromiseCapability Kaydı (PromiseCapability Record) veya blocking Eğer bir Atomics.waitAsync çağrısını belirtiyorsa elde edilen promise, aksi takdirde blocking.
[[TimeoutTime]] negatif olmayan bir genişletilmiş matematiksel değer (extended mathematical value) Zaman aşımının tetiklenebileceği en erken zaman; zaman değerleri (time values) kullanılarak hesaplanır.
[[Result]] "ok" veya "timed-out" Çağrının dönüş değeri.

25.4.2 WaiterList Kayıtları (WaiterList Records)

Bir WaiterList Kaydı, aracıların (agents) Atomics.wait, Atomics.waitAsync ve Atomics.notify aracılığıyla beklemesini ve bildirilmesini açıklamak için kullanılır.

Bir WaiterList Kaydı, Tablo 74 içinde listelenen alanlara sahiptir.

Tablo 74: WaiterList Kaydı Alanları

Alan Adı Değer Anlamı
[[Waiters]] Garson Kayıtlarının bir Listesi (List) Bu WaiterList'in ilişkili olduğu konumda bekleyen Atomics.wait veya Atomics.waitAsync çağrıları.
[[MostRecentLeaveEvent]] bir Eşzamanlama olayı (Synchronize event) veya empty Kritik bölümünden (critical section) en son çıkış olayı veya kritik bölümüne (critical section) hiç girilmemişse empty.

Bir WaiterList içinde aynı aracı belirtecine (agent signifier) sahip birden fazla Garson Kaydı bulunabilir.

Aracı kümesi (agent cluster), WaiterList Kayıtları deposuna sahiptir; bu depo (block, i) ikilisi ile indekslenir; burada block bir Paylaşılan Veri Bloğu (Shared Data Block) ve i ise block belleğindeki bir bayt ofsetidir. WaiterList Kayıtları aracıdan (agent) bağımsızdır: WaiterList Kayıtları deposunda (block, i) ile yapılacak bir arama, aracı kümesindeki (agent cluster) herhangi bir aracıda (agent) aynı WaiterList Kaydını döndürür.

Her WaiterList Kaydı, değerlendirme sırasında o WaiterList Kaydına özel erişimi kontrol eden bir kritik bölüme (critical section) sahiptir. Bir WaiterList Kaydının kritik bölümüne aynı anda yalnızca tek bir aracı (agent) girebilir. Bir WaiterList Kaydının kritik bölümüne girilmesi ve çıkılması, EnterCriticalSection ve LeaveCriticalSection soyut işlemleri (abstract operations) tarafından kontrol edilir. Bir WaiterList Kaydı üzerindeki işlemler—bekleyen aracıların (agents) eklenmesi ve çıkarılması, aracı (agent) listesinin taranması, listedeki aracıların (agents) askıya alınması ve bildirilmesi, Eşzamanlama olayının (Synchronize event) ayarlanması ve alınması—yalnızca o WaiterList Kaydının kritik bölümüne girmiş olan aracılar (agents) tarafından gerçekleştirilebilir.

25.4.3 Atomics İçin Soyut İşlemler (Abstract Operations for Atomics)

25.4.3.1 ValidateIntegerTypedArray ( ta, waitable )

ValidateIntegerTypedArray soyut işlemi, ta (bir ECMAScript dil değeri (ECMAScript language value)) ve waitable (bir Boolean) argümanlarını alır ve bir TypedArray With Buffer Witness Record içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. taRecord, ? ValidateTypedArray(ta, unordered) olsun.

  2. NOTE: ta nesnesinin arka deposu büyütülebilir bir SharedArrayBuffer olduğunda, sınır kontrolü bir eşzamanlama işlemi değildir.

  3. Eğer waitable true ise, o zaman

    1. Eğer ta.[[TypedArrayName]] ne "Int32Array" ne de "BigInt64Array" ise, bir TypeError istisnası fırlat.
  4. Değilse,

    1. type, TypedArrayElementType(ta) olsun.

    2. Eğer IsUnclampedIntegerElementType(type) false ise ve IsBigIntElementType(type) false ise, bir TypeError istisnası fırlat.

  5. taRecord döndür.

25.4.3.2 ValidateAtomicAccess ( taRecord, requestIndex )

ValidateAtomicAccess soyut işlemi, taRecord (bir TypedArray With Buffer Witness Record) ve requestIndex (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve negatif olmayan bir tamsayı (integer) içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. length, TypedArrayLength(taRecord) olsun.

  2. accessIndex, ? ToIndex(requestIndex) olsun.

  3. Assert: accessIndex ≥ 0.

  4. Eğer accessIndexlength ise, bir RangeError istisnası fırlat.

  5. ta, taRecord.[[Object]] olsun.

  6. elementSize, TypedArrayElementSize(ta) olsun.

  7. offset, ta.[[ByteOffset]] olsun.

  8. (accessIndex × elementSize) + offset döndür.

25.4.3.3 ValidateAtomicAccessOnIntegerTypedArray ( ta, requestIndex )

ValidateAtomicAccessOnIntegerTypedArray soyut işlemi, ta (bir ECMAScript dil değeri (ECMAScript language value)) ve requestIndex (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve negatif olmayan bir tamsayı (integer) içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. taRecord, ? ValidateIntegerTypedArray(ta, false) olsun.

  2. ? ValidateAtomicAccess(taRecord, requestIndex) döndür.

25.4.3.4 RevalidateAtomicAccess ( ta, byteIndexInBuffer )

RevalidateAtomicAccess soyut işlemi, ta (bir TypedArray) ve byteIndexInBuffer (negatif olmayan bir tamsayı (integer)) argümanlarını alır ve unused içeren bir olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Bu işlem, Atomics metotlarında tüm argüman dönüşümleri gerçekleştirildikten sonra atomik işlemler için arka depodaki indeksi yeniden doğrular; çünkü argüman dönüşümleri arabelleğin sınır dışına çıkmasına neden olabilecek keyfi yan etkilere sahip olabilir. Bu işlem, ta nesnesinin arka deposu bir SharedArrayBuffer olduğunda hata fırlatmaz. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. taRecord, MakeTypedArrayWithBufferWitnessRecord(ta, unordered) olsun.

  2. NOTE: ta nesnesinin arka deposu büyütülebilir bir SharedArrayBuffer olduğunda, sınır kontrolü bir eşzamanlama işlemi değildir.

  3. Eğer IsTypedArrayOutOfBounds(taRecord) true ise, bir TypeError istisnası fırlat.

  4. Assert: byteIndexInBufferta.[[ByteOffset]].

  5. Eğer byteIndexInBuffertaRecord.[[CachedBufferByteLength]] ise, bir RangeError istisnası fırlat.

  6. unused döndür.

25.4.3.5 GetWaiterList ( block, i )

GetWaiterList soyut işlemi, block (bir Paylaşılan Veri Bloğu (Shared Data Block)) ve i (4 ile kalansız bölünebilen, negatif olmayan bir tamsayı (integer)) argümanlarını alır ve bir WaiterList Kaydı (WaiterList Record) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: i ve i + 3, block belleği içinde geçerli bayt ofsetleridir.

  2. (block, i) çifti tarafından başvurulan WaiterList Kaydını (WaiterList Record) döndür.

25.4.3.6 EnterCriticalSection ( waiterList )

EnterCriticalSection soyut işlemi, waiterList (bir WaiterList Kaydı) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: Çevreleyen aracı (surrounding agent) herhangi bir WaiterList Kaydı için kritik bölümde (critical section) değildir.

  2. waiterList için kritik bölümde hiçbir aracı (agent) kalmayana kadar bekle, ardından waiterList için kritik bölüme gir (başka hiçbir aracının (agent) girmesine izin vermeden).

  3. Eğer waiterList.[[MostRecentLeaveEvent]] empty değilse, o zaman

    1. NOTE: Kritik bölümüne en az bir kez girilmiş olan bir waiterList, LeaveCriticalSection tarafından ayarlanmış bir Eşzamanlama olayına (Synchronize event) sahiptir.

    2. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

    3. execution, agentRecord.[[CandidateExecution]] olsun.

    4. eventsRecord, execution.[[EventsRecords]] içindeki [[AgentSignifier]] değeri AgentSignifier() olan Aracı Olayları Kaydı (Agent Events Record) olsun.

    5. enterEvent, yeni bir Eşzamanlama olayı (Synchronize event) olsun.

    6. enterEvent olayını eventsRecord.[[EventList]] listesine ekle.

    7. (waiterList.[[MostRecentLeaveEvent]], enterEvent) çiftini eventsRecord.[[AgentSynchronizesWith]] listesine ekle.

  4. unused döndür.

EnterCriticalSection, kritik bölüme (critical section) girmeye çalışan bir aracının (agent), başka bir aracının (agent) oradan çıkmasını beklemek zorunda kaldığı durumlarda çekişmeye (contention) sahiptir. Çekişme olmadığında, EnterCriticalSection çağrılarının FIFO sırası gözlemlenebilirdir. Çekişme olduğunda, bir uygulama keyfi bir sıra seçebilir ancak bir aracının (agent) süresiz olarak beklemesine neden olamaz.

25.4.3.7 LeaveCriticalSection ( waiterList )

LeaveCriticalSection soyut işlemi, waiterList (bir WaiterList Kaydı) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: Çevreleyen aracı (surrounding agent), waiterList için kritik bölümün (critical section) içindedir.

  2. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

  3. execution, agentRecord.[[CandidateExecution]] olsun.

  4. eventsRecord, execution.[[EventsRecords]] içindeki [[AgentSignifier]] değeri AgentSignifier() olan Aracı Olayları Kaydı (Agent Events Record) olsun.

  5. leaveEvent, yeni bir Eşzamanlama olayı (Synchronize event) olsun.

  6. leaveEvent olayını eventsRecord.[[EventList]] listesine ekle.

  7. waiterList.[[MostRecentLeaveEvent]] değerini leaveEvent olarak ayarla.

  8. waiterList için kritik bölümden (critical section) çık.

  9. unused döndür.

25.4.3.8 AddWaiter ( waiterList, waiterRecord )

AddWaiter soyut işlemi, waiterList (bir WaiterList Kaydı) ve waiterRecord (bir Garson Kaydı) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: Çevreleyen aracı (surrounding agent), waiterList için kritik bölümün (critical section) içindedir.

  2. Assert: waiterList.[[Waiters]] içinde, [[PromiseCapability]] alanı waiterRecord.[[PromiseCapability]] ile ve [[AgentSignifier]] alanı waiterRecord.[[AgentSignifier]] ile aynı olan bir Garson Kaydı (Waiter Record) yoktur.

  3. waiterRecord kaydını waiterList.[[Waiters]] listesinin sonuna ekle.

  4. unused döndür.

25.4.3.9 RemoveWaiter ( waiterList, waiterRecord )

RemoveWaiter soyut işlemi, waiterList (bir WaiterList Kaydı) ve waiterRecord (bir Garson Kaydı) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: Çevreleyen aracı (surrounding agent), waiterList için kritik bölümün (critical section) içindedir.

  2. Assert: waiterList.[[Waiters]], waiterRecord kaydını içermektedir.

  3. waiterRecord kaydını waiterList.[[Waiters]] listesinden çıkar.

  4. unused döndür.

25.4.3.10 RemoveWaiters ( waiterList, count )

RemoveWaiters soyut işlemi, waiterList (bir WaiterList Kaydı) ve count (negatif olmayan bir tamsayı (integer) or +∞) argümanlarını alır ve Garson Kayıtlarının bir Listesini (List) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: Çevreleyen aracı (surrounding agent), waiterList için kritik bölümün (critical section) içindedir.

  2. length, waiterList.[[Waiters]] listesindeki eleman sayısı olsun.

  3. count değerini min(count, length) olarak ayarla.

  4. waiters, elemanları waiterList.[[Waiters]] listesinin ilk count elemanı olan bir Liste (List) olsun.

  5. waiterList.[[Waiters]] listesinin ilk count elemanını çıkar.

  6. waiters döndür.

25.4.3.11 SuspendThisAgent ( waiterList, waiterRecord )

SuspendThisAgent soyut işlemi, waiterList (bir WaiterList Kaydı) ve waiterRecord (bir Garson Kaydı) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: Çevreleyen aracı (surrounding agent), waiterList için kritik bölümün (critical section) içindedir.

  2. Assert: waiterList.[[Waiters]], waiterRecord kaydını içermektedir.

  3. thisAgent, AgentSignifier() olsun.

  4. Assert: waiterRecord.[[AgentSignifier]] değeri thisAgent belirtecidir.

  5. Assert: waiterRecord.[[PromiseCapability]] değeri blockingdir.

  6. Assert: AgentCanSuspend() true değeridir.

  7. LeaveCriticalSection(waiterList) işlemini gerçekleştir ve çevreleyen aracıyı (surrounding agent) zaman waiterRecord.[[TimeoutTime]] olana kadar askıya al; bu birleşik işlemi, kritik bölümden çıkıldıktan sonra fakat askıya alma yürürlüğe girmeden önce ulaşan bir bildirimin kaybolmayacağı şekilde gerçekleştir. Çevreleyen aracı (surrounding agent) askıdan yalnızca bir zaman aşımı nedeniyle veya başka bir aracının (agent) waiterList ve thisAgent argümanlarıyla NotifyWaiter çağırmasıyla (yani bir Atomics.notify çağrısı aracılığıyla) uyanabilir.

  8. EnterCriticalSection(waiterList) işlemini gerçekleştir.

  9. unused döndür.

25.4.3.12 NotifyWaiter ( waiterList, waiterRecord )

NotifyWaiter soyut işlemi, waiterList (bir WaiterList Kaydı) ve waiterRecord (bir Garson Kaydı) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: Çevreleyen aracı (surrounding agent), waiterList için kritik bölümün (critical section) içindedir.

  2. Eğer waiterRecord.[[PromiseCapability]] değeri blocking ise, o zaman

    1. Belirteci waiterRecord.[[AgentSignifier]] olan aracıyı (agent) askıdan uyandır.

    2. NOTE: Bu durum, aracının (agent) SuspendThisAgent içinde yürütmeye devam etmesini sağlar.

  3. Değilse eğer AgentSignifier() değeri waiterRecord.[[AgentSignifier]] ile aynıysa, o zaman

    1. promiseCapability, waiterRecord.[[PromiseCapability]] olsun.

    2. ! Call(promiseCapability.[[Resolve]], undefined, « waiterRecord.[[Result]] ») işlemini gerçekleştir.

  4. Değilse,

    1. EnqueueResolveInAgentJob(waiterRecord.[[AgentSignifier]], waiterRecord.[[PromiseCapability]], waiterRecord.[[Result]]) işlemini gerçekleştir.
  5. unused döndür.

25.4.3.13 EnqueueResolveInAgentJob ( agentSignifier, promiseCapability, resolution )

EnqueueResolveInAgentJob soyut işlemi, agentSignifier (bir aracı belirteci (agent signifier)), promiseCapability (bir PromiseCapability Kaydı (PromiseCapability Record)) ve resolution ("ok" veya "timed-out") argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. resolveJob, parametresi olmayan, agentSignifier, promiseCapability ve resolution değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir İş (Job) Soyut Kapatması (Abstract Closure) olsun:

    1. Assert: AgentSignifier() değeri agentSignifier belirtecidir.

    2. ! Call(promiseCapability.[[Resolve]], undefined, « resolution ») işlemini gerçekleştir.

    3. unused döndür.

  2. realmInTargetAgent, ! GetFunctionRealm(promiseCapability.[[Resolve]]) olsun.

  3. Assert: agentSignifier, realmInTargetAgent.[[AgentSignifier]] değeridir.

  4. HostEnqueueGenericJob(resolveJob, realmInTargetAgent) işlemini gerçekleştir.

  5. unused döndür.

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

DoWait soyut işlemi, mode (sync veya async), ta (bir ECMAScript dil değeri (ECMAScript language value)), index (bir ECMAScript dil değeri (ECMAScript language value)), value (bir ECMAScript dil değeri (ECMAScript language value)) ve timeout (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve bir Nesne, "not-equal", "timed-out" veya "ok" içeren bir olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. taRecord, ? ValidateIntegerTypedArray(ta, true) olsun.

  2. buffer, taRecord.[[Object]].[[ViewedArrayBuffer]] olsun.

  3. Eğer IsSharedArrayBuffer(buffer) false ise, bir TypeError istisnası fırlat.

  4. byteIndexInBuffer, ? ValidateAtomicAccess(taRecord, index) olsun.

  5. arrayTypeName, ta.[[TypedArrayName]] olsun.

  6. Eğer arrayTypeName "BigInt64Array" ise, expected, ? ToBigInt64(value) olsun.

  7. Değilse, expected, ? ToInt32(value) olsun.

  8. timeoutNumber, ? ToNumber(timeout) olsun.

  9. Eğer timeoutNumber NaN veya +∞𝔽 ise, realTimeout değerini +∞ olarak ayarla.

  10. Değilse eğer timeoutNumber -∞𝔽 ise, realTimeout değerini 0 olarak ayarla.

  11. Değilse, realTimeout değerini max((timeoutNumber), 0) olarak ayarla.

  12. Eğer mode sync ise ve AgentCanSuspend() false ise, bir TypeError istisnası fırlat.

  13. block, buffer.[[ArrayBufferData]] olsun.

  14. waiterList, GetWaiterList(block, byteIndexInBuffer) olsun.

  15. Eğer mode sync ise, o zaman

    1. promiseCapability, blocking olsun.

    2. resultObj, undefined olsun.

  16. Değilse,

    1. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

    2. resultObj, OrdinaryObjectCreate(%Object.prototype%) olsun.

  17. EnterCriticalSection(waiterList) işlemini gerçekleştir.

  18. elementType, TypedArrayElementType(ta) olsun.

  19. witness, GetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst) olsun.

  20. Eğer expectedwitness ise, o zaman

    1. LeaveCriticalSection(waiterList) işlemini gerçekleştir.

    2. Eğer mode sync ise, "not-equal" döndür.

    3. ! CreateDataPropertyOrThrow(resultObj, "async", false) işlemini gerçekleştir.

    4. ! CreateDataPropertyOrThrow(resultObj, "value", "not-equal") işlemini gerçekleştir.

    5. resultObj döndür.

  21. Eğer realTimeout = 0 ve mode async ise, o zaman

    1. NOTE: Senkron anında zaman aşımı durumları için özel bir işlem yoktur. Asenkron anında zaman aşımı durumları, hızlı şekilde başarısız olması ve gereksiz Promise işlerini (Promise jobs) önlemek için özel olarak ele alınır.

    2. LeaveCriticalSection(waiterList) işlemini gerçekleştir.

    3. ! CreateDataPropertyOrThrow(resultObj, "async", false) işlemini gerçekleştir.

    4. ! CreateDataPropertyOrThrow(resultObj, "value", "timed-out") işlemini gerçekleştir.

    5. resultObj döndür.

  22. thisAgent, AgentSignifier() olsun.

  23. now, geçerli zamanı belirten zaman değeri (time value) (UTC) olsun.

  24. additionalTimeout, uygulama tarafından tanımlanmış (implementation-defined) negatif olmayan bir matematiksel değer (mathematical value) olsun.

  25. timeoutTime, (now) + realTimeout + additionalTimeout olsun.

  26. NOTE: realTimeout +∞ olduğunda, timeoutTime da +∞ olur.

  27. waiterRecord, yeni bir Garson Kaydı (Waiter Record) { [[AgentSignifier]]: thisAgent, [[PromiseCapability]]: promiseCapability, [[TimeoutTime]]: timeoutTime, [[Result]]: "ok" } olsun.

  28. AddWaiter(waiterList, waiterRecord) işlemini gerçekleştir.

  29. Eğer mode sync ise, o zaman

    1. SuspendThisAgent(waiterList, waiterRecord) işlemini gerçekleştir.
  30. Değilse eğer timeoutTime sonluysa (finite), o zaman

    1. EnqueueAtomicsWaitAsyncTimeoutJob(waiterList, waiterRecord) işlemini gerçekleştir.
  31. LeaveCriticalSection(waiterList) işlemini gerçekleştir.

  32. Eğer mode sync ise, waiterRecord.[[Result]] döndür.

  33. ! CreateDataPropertyOrThrow(resultObj, "async", true) işlemini gerçekleştir.

  34. ! CreateDataPropertyOrThrow(resultObj, "value", promiseCapability.[[Promise]]) işlemini gerçekleştir.

  35. resultObj döndür.

25.4.3.15 EnqueueAtomicsWaitAsyncTimeoutJob ( waiterList, waiterRecord )

EnqueueAtomicsWaitAsyncTimeoutJob soyut işlemi, waiterList (bir WaiterList Kaydı) ve waiterRecord (bir Garson Kaydı) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. timeoutJob, parametresi olmayan, waiterList ve waiterRecord değerlerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir İş (Job) Soyut Kapatması (Abstract Closure) olsun:

    1. EnterCriticalSection(waiterList) işlemini gerçekleştir.

    2. Eğer waiterList.[[Waiters]], waiterRecord kaydını içeriyorsa, o zaman

      1. timeOfJobExecution, geçerli zamanı belirten zaman değeri (time value) (UTC) olsun.

      2. Assert: (timeOfJobExecution) ≥ waiterRecord.[[TimeoutTime]] (zaman değerlerinin olası monotonik olmama durumu göz ardı edilerek).

      3. waiterRecord.[[Result]] değerini "timed-out" olarak ayarla.

      4. RemoveWaiter(waiterList, waiterRecord) işlemini gerçekleştir.

      5. NotifyWaiter(waiterList, waiterRecord) işlemini gerçekleştir.

    3. LeaveCriticalSection(waiterList) işlemini gerçekleştir.

    4. unused döndür.

  2. now, geçerli zamanı belirten zaman değeri (time value) (UTC) olsun.

  3. currentRealm, geçerli Realm Kaydı (current Realm Record) olsun.

  4. HostEnqueueTimeoutJob(timeoutJob, currentRealm, 𝔽(waiterRecord.[[TimeoutTime]]) - now) işlemini gerçekleştir.

  5. unused döndür.

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

AtomicCompareExchangeInSharedBlock soyut işlemi, block (bir Paylaşılan Veri Bloğu (Shared Data Block)), byteIndexInBuffer (bir tamsayı (integer)), elementSize (negatif olmayan bir tamsayı (integer)), expectedBytes (bayt değerlerinin bir Listesi (List)) ve replacementBytes (bayt değerlerinin bir Listesi (List)) argümanlarını alır ve bayt değerlerinin bir Listesini (List) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

  2. execution, agentRecord.[[CandidateExecution]] olsun.

  3. eventsRecord, execution.[[EventsRecords]] içindeki [[AgentSignifier]] değeri AgentSignifier() olan Aracı Olayları Kaydı (Agent Events Record) olsun.

  4. rawBytesRead, elemanları deterministik olmayan şekilde seçilmiş bayt değerleri (byte values) olan, elementSize uzunluğunda bir Liste (List) olsun.

  5. NOTE: Uygulamalarda rawBytesRead, alt donanımdaki load-link, load-exclusive veya bir oku-değiştir-yaz talimatının işleneninin (operand) sonucudur. Belirsizlik (nondeterminism), zayıf tutarlılığa sahip donanımın gözlemlenebilir davranışını tanımlamak için bellek modelinin (memory model) semantik bir yönergesidir.

  6. NOTE: Beklenen değer ile okunan değerin karşılaştırılması, beklenen değer okunan değere eşit olmadığında gereksiz yere güçlü eşzamanlamayı önlemek amacıyla oku-değiştir-yaz değişiklik fonksiyonunun dışında gerçekleştirilir.

  7. Eğer ByteListEqual(rawBytesRead, expectedBytes) true ise, o zaman

    1. second, hiçbir şey yakalamayan ve çağrıldığında aşağıdaki adımları atomik olarak gerçekleştiren, (oldBytes, newBytes) parametrelerine sahip yeni bir oku-değiştir-yaz değişiklik fonksiyonu olsun:

      1. newBytes döndür.
    2. event, ReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize, [[Payload]]: replacementBytes, [[ModifyOp]]: second } olsun.

  8. Değilse,

    1. event, ReadSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize } olsun.
  9. event olayını eventsRecord.[[EventList]] listesine ekle.

  10. Chosen Value Record { [[Event]]: event, [[ChosenValue]]: rawBytesRead } kaydını execution.[[ChosenValues]] listesine ekle.

  11. rawBytesRead döndür.

25.4.3.17 AtomicReadModifyWrite ( ta, index, value, op )

AtomicReadModifyWrite soyut işlemi, ta (bir ECMAScript dil değeri (ECMAScript language value)), index (bir ECMAScript dil değeri (ECMAScript language value)), value (bir ECMAScript dil değeri (ECMAScript language value)) ve op (bir oku-değiştir-yaz değişiklik fonksiyonu) argümanlarını alır ve bir Sayı (Number) veya BigInt içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. op iki bayt değeri Listesi (List) argümanı alır ve bayt değerlerinin bir Listesini (List) döndürür. Bu işlem atomik olarak bir değeri yükler, başka bir değerle birleştirir ve birleşimi kaydeder. Yüklenen değeri döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. byteIndexInBuffer, ? ValidateAtomicAccessOnIntegerTypedArray(ta, index) olsun.

  2. Eğer ta.[[ContentType]] değeri bigint ise, coerced, ? ToBigInt(value) olsun.

  3. Değilse, coerced, 𝔽(? ToIntegerOrInfinity(value)) olsun.

  4. ? RevalidateAtomicAccess(ta, byteIndexInBuffer) işlemini gerçekleştir.

  5. buffer, ta.[[ViewedArrayBuffer]] olsun.

  6. elementType, TypedArrayElementType(ta) olsun.

  7. GetModifySetValueInBuffer(buffer, byteIndexInBuffer, elementType, coerced, op) döndür.

25.4.3.18 ByteListBitwiseOp ( op, xBytes, yBytes )

ByteListBitwiseOp soyut işlemi, op (&, ^ veya |), xBytes (bayt değerlerinin bir Listesi (List)) ve yBytes (bayt değerlerinin bir Listesi (List)) argümanlarını alır ve bayt değerlerinin bir Listesini (List) döndürür. İşlem atomik olarak argümanların tüm bayt değerleri üzerinde bit düzeyinde (bitwise) bir işlem gerçekleştirir ve bayt değerlerinin bir Listesini (List) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: xBytes ve yBytes aynı sayıda elemana sahiptir.

  2. result, yeni ve boş bir Liste (List) olsun.

  3. i değeri 0 olsun.

  4. xBytes listesinin her bir xByte elemanı için sırayla yap:

    1. yByte, yBytes[i] olsun.

    2. Eğer op & ise, o zaman

      1. resultByte, xByte ve yByte değerlerine bit düzeyinde AND işleminin uygulanmasıyla elde edilen sonuç olsun.
    3. Değilse eğer op ^ ise, o zaman

      1. resultByte, xByte ve yByte değerlerine bit düzeyinde özel VEYA (XOR) işleminin uygulanmasıyla elde edilen sonuç olsun.
    4. Değilse,

      1. Assert: op | değeridir.

      2. resultByte, xByte ve yByte değerlerine bit düzeyinde kapsayıcı VEYA (OR) işleminin uygulanmasıyla elde edilen sonuç olsun.

    5. i değerini i + 1 olarak ayarla.

    6. resultByte değerini result listesine ekle.

  5. result döndür.

25.4.3.19 ByteListEqual ( xBytes, yBytes )

ByteListEqual soyut işlemi, xBytes (bayt değerlerinin bir Listesi (List)) ve yBytes (bayt değerlerinin bir Listesi (List)) argümanlarını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer xBytes ve yBytes aynı sayıda elemana sahip değilse, false döndür.

  2. i değeri 0 olsun.

  3. xBytes listesinin her bir xByte elemanı için sırayla yap:

    1. yByte, yBytes[i] olsun.

    2. Eğer xByteyByte ise, false döndür.

    3. i değerini i + 1 olarak ayarla.

  4. true döndür.

25.4.4 Atomics.add ( ta, index, value )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. add, ta nesnesini yakalayan ve çağrıldığında aşağıdaki adımları atomik olarak gerçekleştiren, (xBytes, yBytes) parametrelerine sahip yeni bir oku-değiştir-yaz değişiklik fonksiyonu olsun:

    1. type, TypedArrayElementType(ta) olsun.

    2. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

    3. isLittleEndian, agentRecord.[[LittleEndian]] olsun.

    4. x, RawBytesToNumeric(type, xBytes, isLittleEndian) olsun.

    5. y, RawBytesToNumeric(type, yBytes, isLittleEndian) olsun.

    6. Eğer x bir Sayı (Number) ise, o zaman

      1. sum, Number::add(x, y) olsun.
    7. Değilse,

      1. Assert: x bir BigInt'tir.

      2. sum, BigInt::add(x, y) olsun.

    8. sumBytes, NumericToRawBytes(type, sum, isLittleEndian) olsun.

    9. Assert: sumBytes, xBytes ve yBytes aynı sayıda elemana sahiptir.

    10. sumBytes döndür.

  2. ? AtomicReadModifyWrite(ta, index, value, add) döndür.

25.4.5 Atomics.and ( ta, index, value )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. and, hiçbir şey yakalamayan ve çağrıldığında aşağıdaki adımları atomik olarak gerçekleştiren, (xBytes, yBytes) parametrelerine sahip yeni bir oku-değiştir-yaz değişiklik fonksiyonu olsun:

    1. ByteListBitwiseOp(&, xBytes, yBytes) döndür.
  2. ? AtomicReadModifyWrite(ta, index, value, and) döndür.

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

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. byteIndexInBuffer, ? ValidateAtomicAccessOnIntegerTypedArray(ta, index) olsun.

  2. buffer, ta.[[ViewedArrayBuffer]] olsun.

  3. block, buffer.[[ArrayBufferData]] olsun.

  4. Eğer ta.[[ContentType]] değeri bigint ise, o zaman

    1. expected, ? ToBigInt(expectedValue) olsun.

    2. replacement, ? ToBigInt(replacementValue) olsun.

  5. Değilse,

    1. expected, 𝔽(? ToIntegerOrInfinity(expectedValue)) olsun.

    2. replacement, 𝔽(? ToIntegerOrInfinity(replacementValue)) olsun.

  6. ? RevalidateAtomicAccess(ta, byteIndexInBuffer) işlemini gerçekleştir.

  7. elementType, TypedArrayElementType(ta) olsun.

  8. elementSize, TypedArrayElementSize(ta) olsun.

  9. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

  10. isLittleEndian, agentRecord.[[LittleEndian]] olsun.

  11. expectedBytes, NumericToRawBytes(elementType, expected, isLittleEndian) olsun.

  12. replacementBytes, NumericToRawBytes(elementType, replacement, isLittleEndian) olsun.

  13. Eğer IsSharedArrayBuffer(buffer) true ise, o zaman

    1. rawBytesRead, AtomicCompareExchangeInSharedBlock(block, byteIndexInBuffer, elementSize, expectedBytes, replacementBytes) olsun.
  14. Değilse,

    1. rawBytesRead, uzunluğu elementSize olan ve elemanları block[byteIndexInBuffer] konumundan başlayan elementSize baytlık dizi olan bir Liste (List) olsun.

    2. Eğer ByteListEqual(rawBytesRead, expectedBytes) true ise, o zaman

      1. replacementBytes listesinin bireysel baytlarını, block[byteIndexInBuffer] konumundan başlayarak block içine kaydet.
  15. RawBytesToNumeric(elementType, rawBytesRead, isLittleEndian) döndür.

25.4.7 Atomics.exchange ( ta, index, value )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. second, hiçbir şey yakalamayan ve çağrıldığında aşağıdaki adımları atomik olarak gerçekleştiren, (oldBytes, newBytes) parametrelerine sahip yeni bir oku-değiştir-yaz değişiklik fonksiyonu olsun:

    1. newBytes döndür.
  2. ? AtomicReadModifyWrite(ta, index, value, second) döndür.

25.4.8 Atomics.isLockFree ( size )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. n, ? ToIntegerOrInfinity(size) olsun.

  2. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

  3. Eğer n = 1 ise, agentRecord.[[IsLockFree1]] döndür.

  4. Eğer n = 2 ise, agentRecord.[[IsLockFree2]] döndür.

  5. Eğer n = 4 ise, true döndür.

  6. Eğer n = 8 ise, agentRecord.[[IsLockFree8]] döndür.

  7. false döndür.

25.4.9 Atomics.load ( ta, index )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. byteIndexInBuffer, ? ValidateAtomicAccessOnIntegerTypedArray(ta, index) olsun.

  2. ? RevalidateAtomicAccess(ta, byteIndexInBuffer) işlemini gerçekleştir.

  3. buffer, ta.[[ViewedArrayBuffer]] olsun.

  4. elementType, TypedArrayElementType(ta) olsun.

  5. GetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst) döndür.

25.4.10 Atomics.or ( ta, index, value )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. or, hiçbir şey yakalamayan ve çağrıldığında aşağıdaki adımları atomik olarak gerçekleştiren, (xBytes, yBytes) parametrelerine sahip yeni bir oku-değiştir-yaz değişiklik fonksiyonu olsun:

    1. ByteListBitwiseOp(|, xBytes, yBytes) döndür.
  2. ? AtomicReadModifyWrite(ta, index, value, or) döndür.

25.4.11 Atomics.store ( ta, index, value )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. byteIndexInBuffer, ? ValidateAtomicAccessOnIntegerTypedArray(ta, index) olsun.

  2. Eğer ta.[[ContentType]] değeri bigint ise, coerced, ? ToBigInt(value) olsun.

  3. Değilse, coerced, 𝔽(? ToIntegerOrInfinity(value)) olsun.

  4. ? RevalidateAtomicAccess(ta, byteIndexInBuffer) işlemini gerçekleştir.

  5. buffer, ta.[[ViewedArrayBuffer]] olsun.

  6. elementType, TypedArrayElementType(ta) olsun.

  7. SetValueInBuffer(buffer, byteIndexInBuffer, elementType, coerced, true, seq-cst) işlemini gerçekleştir.

  8. coerced döndür.

25.4.12 Atomics.sub ( ta, index, value )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. subtract, ta nesnesini yakalayan ve çağrıldığında aşağıdaki adımları atomik olarak gerçekleştiren, (xBytes, yBytes) parametrelerine sahip yeni bir oku-değiştir-yaz değişiklik fonksiyonu olsun:

    1. type, TypedArrayElementType(ta) olsun.

    2. agentRecord, çevreleyen aracının (surrounding agent) Aracı Kaydı (Agent Record) olsun.

    3. isLittleEndian, agentRecord.[[LittleEndian]] olsun.

    4. x, RawBytesToNumeric(type, xBytes, isLittleEndian) olsun.

    5. y, RawBytesToNumeric(type, yBytes, isLittleEndian) olsun.

    6. Eğer x bir Sayı (Number) ise, o zaman

      1. difference, Number::subtract(x, y) olsun.
    7. Değilse,

      1. Assert: x bir BigInt'tir.

      2. difference, BigInt::subtract(x, y) olsun.

    8. differenceBytes, NumericToRawBytes(type, difference, isLittleEndian) olsun.

    9. Assert: differenceBytes, xBytes ve yBytes aynı sayıda elemana sahiptir.

    10. differenceBytes döndür.

  2. ? AtomicReadModifyWrite(ta, index, value, subtract) döndür.

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

Bu fonksiyon çevreleyen aracıyı (surrounding agent) bir bekleme kuyruğuna (wait queue) sokar ve bildirilene kadar veya bekleme süresi dolana kadar askıya alır; bu durumları ayırt eden bir Karakter Dizisi (String) döndürür.

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? DoWait(sync, ta, index, value, timeout) döndür.

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

Bu fonksiyon, çağıran aracı (agent) bildirildiğinde veya zaman aşımına ulaşıldığında çözümlenen (resolved) bir Promise döndürür.

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? DoWait(async, ta, index, value, timeout) döndür.

25.4.15 Atomics.notify ( ta, index, count )

Bu fonksiyon bekleme kuyruğunda (wait queue) uyuyan bazı aracıları (agents) bildirir.

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. taRecord, ? ValidateIntegerTypedArray(ta, true) olsun.

  2. byteIndexInBuffer, ? ValidateAtomicAccess(taRecord, index) olsun.

  3. Eğer count undefined ise, o zaman

    1. count değerini +∞ olarak ayarla.
  4. Değilse,

    1. intCount, ? ToIntegerOrInfinity(count) olsun.

    2. count değerini max(intCount, 0) olarak ayarla.

  5. buffer, ta.[[ViewedArrayBuffer]] olsun.

  6. block, buffer.[[ArrayBufferData]] olsun.

  7. Eğer IsSharedArrayBuffer(buffer) false ise, +0𝔽 döndür.

  8. waiterList, GetWaiterList(block, byteIndexInBuffer) olsun.

  9. EnterCriticalSection(waiterList) işlemini gerçekleştir.

  10. waiters, RemoveWaiters(waiterList, count) olsun.

  11. waiters listesinin her bir waiterRecord elemanı için sırayla yap:

    1. NotifyWaiter(waiterList, waiterRecord) işlemini gerçekleştir.
  12. LeaveCriticalSection(waiterList) işlemini gerçekleştir.

  13. waitersCount, waiters listesindeki eleman sayısı olsun.

  14. 𝔽(waitersCount) döndür.

25.4.16 Atomics.pause ( )

Bu fonksiyon, CPU'ya programın bir değer beklerken döngü içinde döndüğüne dair (spin looping) bir ipucu (hint) sağlar.

Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer ECMAScript uygulamasının yürütme ortamı, işletim sistemine veya CPU'ya şu anda yürütülen kodun bir spin-wait döngüsünde olduğunu bildirmeyi destekliyorsa, bu sinyali gönder.

  2. undefined döndür.

25.4.17 Atomics.xor ( ta, index, value )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. xor, hiçbir şey yakalamayan ve çağrıldığında aşağıdaki adımları atomik olarak gerçekleştiren, (xBytes, yBytes) parametrelerine sahip yeni bir oku-değiştir-yaz değişiklik fonksiyonu olsun:

    1. ByteListBitwiseOp(^, xBytes, yBytes) döndür.
  2. ? AtomicReadModifyWrite(ta, index, value, xor) döndür.

25.4.18 Atomics [ %Symbol.toStringTag% ]

%Symbol.toStringTag%(07_sec-ecmascript-data-types-and-values.md#sec-well-known-symbols) özelliğinin ilk değeri "Atomics" dizgisidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.

25.5 JSON Nesnesi (The JSON Object)

JSON nesnesi:

JSON Veri Değişim Formatı (JSON Data Interchange Format) ECMA-404 içinde tanımlanmıştır. Bu belirtimde kullanılan JSON değişim formatı tam olarak ECMA-404'te açıklanan formatın aynısıdır. Uyumlu JSON.parse ve JSON.stringify uygulamaları, format üzerinde herhangi bir eksiltme veya ekleme yapmaksızın ECMA-404 belirtiminde açıklanan tam değişim formatını desteklemelidir.

25.5.1 JSON.isRawJSON ( obj )

Bu fonksiyon çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer obj bir Nesne ise (is an Object) ve obj nesnesinin bir [[IsRawJSON]] dahili yuvası varsa, true döndür.

  2. Return false.

25.5.2 JSON.parse ( text [ , reviver ] )

Bu fonksiyon, bir JSON metnini (JSON formatlı bir Karakter Dizisini) çözümler ve bir ECMAScript dil değeri (ECMAScript language value) üretir. JSON formatı; sabit değerleri (literals), dizileri (arrays) ve nesneleri (objects), ECMAScript sabit değerleri, Dizi Başlatıcıları (Array Initializers) ve Nesne Başlatıcılarının (Object Initializers) sözdizimine benzer bir sözdizimi ile temsil eder. Çözümlemeden sonra, JSON nesneleri ECMAScript nesneleri olarak gerçekleştirilir. JSON dizileri, ECMAScript Dizi (Array) örnekleri olarak gerçekleştirilir. JSON karakter dizileri, sayıları, boolean değerleri ve null ise sırasıyla ECMAScript Karakter Dizileri (Strings), Sayıları (Numbers), Boolean Değerleri ve null olarak gerçekleştirilir.

İsteğe bağlı reviver parametresi, sonuçları filtreleyebilen ve dönüştürebilen bir fonksiyondur. Çözümleme tarafından üretilen her bir değer için, reviver üç argümanla (ilişkili özellik anahtarı (property key), değer ve bir bağlam nesnesi) çağrılır. Eğer özellik değiştirilmemişse ve değeri ilkel ise, sağlanan bağlam nesnesi karşılık gelen Ayrıştırma Düğümünün (Parse Node) kaynak metnini içeren bir "source" özelliğine sahiptir. Eğer çağrı undefined döndürürse, özellik silinir. Aksi takdirde, özellik dönüş değerini kullanacak şekilde yeniden tanımlanır.

  1. Let jsonString be ? ToString(text).

  2. Let parseResult be ? ParseJSON(jsonString).

  3. Let unfiltered be parseResult.[[Value]].

  4. If IsCallable(reviver) is false, return unfiltered.

  5. Let root be OrdinaryObjectCreate(%Object.prototype%).

  6. Let rootName be the empty String.

  7. Perform ! CreateDataPropertyOrThrow(root, rootName, unfiltered).

  8. Let snapshot be CreateJSONParseRecord(parseResult.[[ParseNode]], rootName, unfiltered).

  9. Return ? InternalizeJSONProperty(root, rootName, reviver, snapshot).

Bu fonksiyonun "length" özelliğinin ilk değeri 2𝔽 şeklindedir.

25.5.2.1 ParseJSON ( text )

ParseJSON soyut işlemi, text (bir Karakter Dizisi) argümanını alır ve [[ParseNode]] (bir Ayrıştırma Düğümü (Parse Node)) ve [[Value]] (bir ECMAScript dil değeri (ECMAScript language value)) alanlarına sahip bir Kayıt (Record) içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer StringToCodePoints(text), ECMA-404'te belirtildiği gibi geçerli bir JSON metni değilse, bir SyntaxError istisnası fırlat.

  2. Let scriptString be the string-concatenation of "(", text, and ");".

  3. Let script be ParseText(scriptString, Script).

  4. NOTE: 13.2.5.1 içinde tanımlanan erken hata (early error) kuralları, yukarıdaki ParseText çağrısı için özel işlemlere sahiptir.

  5. Assert: script bir Ayrıştırma Düğümüdür (Parse Node).

  6. Let result be ! Evaluation of script.

  7. NOTE: 13.2.5.6 içinde tanımlanan PropertyDefinitionEvaluation semantikleri, yukarıdaki değerlendirme için özel işlemlere sahiptir.

  8. Assert: result; ya bir Karakter Dizisi, ya bir Sayı, ya bir Boolean, ya ArrayLiteral veya ObjectLiteral tarafından tanımlanan bir Nesne, ya da null değeridir.

  9. Kayıt (Record) { [[ParseNode]]: script, [[Value]]: result } döndür.

Uyumlu bir JSON.parse uygulamasının JSON dilbilgisini genişletmesine izin verilmez. Bir uygulama değiştirilmiş veya genişletilmiş bir JSON değişim formatını desteklemek isterse, bunu farklı bir çözümleme fonksiyonu tanımlayarak yapmalıdır.

25.5.2.2 JSON Çözümleme Kaydı (JSON Parse Record)

Bir JSON Çözümleme Kaydı (JSON Parse Record), JSON metninden çözümlenen bir değerin başlangıç durumunu tanımlamak için kullanılan bir Kayıt (Record) değeridir.

JSON Çözümleme Kayıtları, Tablo 75 içinde listelenen alanlara sahiptir.

Tablo 75: JSON Çözümleme Kaydı Alanları

Alan Adı Değer Anlamı
[[ParseNode]] bir Ayrıştırma Düğümü (Parse Node) Bağlam Ayrıştırma Düğümü (Parse Node).
[[Key]] bir özellik adı (property name) [[Value]] değerinin ilişkili olduğu özellik adı (property name).
[[Value]] bir ECMAScript dil değeri (ECMAScript language value) [[ParseNode]] düğümünün değerlendirilmesi (evaluation) ile üretilen değer.
[[Elements]] JSON Çözümleme Kayıtlarının bir Listesi (List) Eğer [[Value]] bir Dizi (Array) ise, bu liste [[Value]] elemanlarına karşılık gelen JSON Çözümleme Kayıtlarını içerir. Aksi takdirde, bu boş bir Listeden (List) ibarettir.
[[Entries]] JSON Çözümleme Kayıtlarının bir Listesi (List) Eğer [[Value]] Dizi olmayan bir Nesne ise, bu liste [[Value]] girdilerine (entries) karşılık gelen JSON Çözümleme Kayıtlarını içerir. Aksi takdirde, bu boş bir Listeden (List) ibarettir.

25.5.2.3 CreateJSONParseRecord ( parseNode, key, value )

CreateJSONParseRecord soyut işlemi, parseNode (bir Ayrıştırma Düğümü (Parse Node)), key (bir özellik adı (property name)) ve value (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve bir JSON Çözümleme Kaydı döndürür. JSON metninden çözümlenen bir parseNode ile onun değerlendirilmesi sonucu üretilen value değerini özyinelemeli (recursive) olarak birleştirir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. typedValueNode, ShallowestContainedJSONValue(parseNode) olsun.

  2. Assert: typedValueNode empty değildir.

  3. elements, yeni ve boş bir Liste (List) olsun.

  4. entries, yeni ve boş bir Liste (List) olsun.

  5. Eğer value bir Nesne ise (is an Object), o zaman

    1. isArray, ! IsArray(value) olsun.

    2. Eğer isArray true ise, o zaman

      1. Assert: typedValueNode bir ArrayLiteral Ayrıştırma Düğümüdür (Parse Node).

      2. contentNodes, typedValueNode düğümünün JSONArrayLiteralContentNodes semantiği olsun.

      3. length, contentNodes listesindeki eleman sayısı olsun.

      4. valueLength, ! LengthOfArrayLike(value) olsun.

      5. Assert: valueLength değeri length ile aynıdır.

      6. index değeri 0 olsun.

      7. index < length olduğu sürece tekrarla:

         1. *propertyName*, ! [ToString](08_sec-abstract-operations.md#sec-tostring)([𝔽](06_sec-notational-conventions.md#𝔽)(*index*)) olsun.
        
         2. *elementParseRecord*, [CreateJSONParseRecord](#sec-createjsonparserecord)(*contentNodes*[*index*], *propertyName*, ! [Get](08_sec-abstract-operations.md#sec-get-o-p)(*value*, *propertyName*)) olsun.
        
         3. *elementParseRecord* kaydını *elements* listesine ekle.
        
         4. *index* değerini *index* + 1 olarak ayarla.
    3. Değilse,

      1. Assert: typedValueNode bir ObjectLiteral Ayrıştırma Düğümüdür (Parse Node).

      2. propertyNodes, typedValueNode düğümünün PropertyDefinitionNodes semantiği olsun.

      3. NOTE: value JSON metninden üretildiği ve değiştirilmediği için tüm özellik anahtarları (property keys) Karakter Dizisidir ve kapsamlı bir şekilde sıralanacaktır.

      4. keys, ! EnumerableOwnProperties(value, key) olsun.

      5. keys listesindeki her bir String propertyKey elemanı için sırayla yap:

         1. [NOTE](06_sec-notational-conventions.md#note-step): Tek bir nesne için aynı ada sahip birden fazla ad/değer çiftini belirten JSON metni durumunda (örneğin `{"a":"lost","a":"kept"}`), elde edilen ECMAScript nesnesinin karşılık gelen özelliğinin değeri, bu ada sahip son çift tarafından belirtilir.
        
         2. *propertyDefinition*, `empty` olsun.
        
         3. *propertyNodes* listesindeki her bir [Ayrıştırma Düğümü (Parse Node)](06_sec-notational-conventions.md#sec-syntactic-grammar) *propertyNode* elemanı için sırayla yap:
           
                    1. *propertyName*, *propertyNode* düğümünün [PropName](09_sec-syntax-directed-operations.md#sec-static-semantics-propname) semantiği olsun.
           
                    2. Eğer *propertyName* değeri *propertyKey* ile aynıysa, *propertyDefinition* değerini *propertyNode* olarak ayarla.
        
         4. [Assert](06_sec-notational-conventions.md#assert): *propertyDefinition* düğümü,
           
           
           
           *PropertyDefinition* *[PropertyDefinition](14_sec-ecmascript-language-expressions.md#prod-PropertyDefinition)*  :    *[PropertyName](14_sec-ecmascript-language-expressions.md#prod-PropertyName)* **:** *[AssignmentExpression](14_sec-ecmascript-language-expressions.md#prod-AssignmentExpression)*  
           
           şeklindedir.
        
         5. *propertyValueNode*, *propertyDefinition* tanımının *[AssignmentExpression](14_sec-ecmascript-language-expressions.md#prod-AssignmentExpression)* semantiği olsun.
        
         6. *entryParseRecord*, [CreateJSONParseRecord](#sec-createjsonparserecord)(*propertyValueNode*, *propertyKey*, ! [Get](08_sec-abstract-operations.md#sec-get-o-p)(*value*, *propertyKey*)) olsun.
        
         7. *entryParseRecord* kaydını *entries* listesine ekle.
  6. Değilse,

    1. Assert: typedValueNode ne bir ArrayLiteral Ayrıştırma Düğümü (Parse Node) ne de bir ObjectLiteral Ayrıştırma Düğümüdür (Parse Node).
  7. JSON Çözümleme Kaydını { [[ParseNode]]: typedValueNode, [[Key]]: key, [[Value]]: value, [[Elements]]: elements, [[Entries]]: entries } döndür.

25.5.2.4 InternalizeJSONProperty ( holder, name, reviver, parseRecord )

InternalizeJSONProperty soyut işlemi, holder (bir Nesne), name (bir Karakter Dizisi), reviver (bir fonksiyon nesnesi (function object)) ve parseRecord (bir JSON Çözümleme Kaydı veya empty) argümanlarını alır ve bir ECMAScript dil değeri (ECMAScript language value) içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür.

Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. value, ? Get(holder, name) olsun.

  2. context, OrdinaryObjectCreate(%Object.prototype%) olsun.

  3. Eğer parseRecord bir JSON Çözümleme Kaydı ise ve SameValue(parseRecord.[[Value]], value) true ise, o zaman

    1. Eğer value bir Nesne değilse (is not an Object), o zaman

      1. parseNode, parseRecord.[[ParseNode]] olsun.

      2. Assert: parseNode ne bir ArrayLiteral Ayrıştırma Düğümü (Parse Node) ne de bir ObjectLiteral Ayrıştırma Düğümüdür (Parse Node).

      3. sourceText, parseNode tarafından eşleşen kaynak metin olsun.

      4. ! CreateDataPropertyOrThrow(context, "source", CodePointsToString(sourceText)) işlemini gerçekleştir.

    2. elementRecords, parseRecord.[[Elements]] olsun.

    3. entryRecords, parseRecord.[[Entries]] olsun.

  4. Değilse,

    1. elementRecords, yeni ve boş bir Liste (List) olsun.

    2. entryRecords, yeni ve boş bir Liste (List) olsun.

  5. Eğer value bir Nesne ise (is an Object), o zaman

    1. isArray, ? IsArray(value) olsun.

    2. Eğer isArray true ise, o zaman

      1. elementRecordsLength, elementRecords listesindeki eleman sayısı olsun.

      2. length, ? LengthOfArrayLike(value) olsun.

      3. index değeri 0 olsun.

      4. index < length olduğu sürece tekrarla:

         1. *propertyKey*, ! [ToString](08_sec-abstract-operations.md#sec-tostring)([𝔽](06_sec-notational-conventions.md#𝔽)(*index*)) olsun.
        
         2. Eğer *index* < *elementRecordsLength* ise, *elementRecord*, *elementRecords*[*index*] olsun; aksi takdirde *elementRecord*, `empty` olsun.
        
         3. *newElement*, ? [InternalizeJSONProperty](#sec-internalizejsonproperty)(*value*, *propertyKey*, *reviver*, *elementRecord*) olsun.
        
         4. Eğer *newElement* `undefined` ise, o zaman
           
                    1. ? *value*.*[[Delete]]*(*propertyKey*) işlemini gerçekleştir.
        
         5. Değilse,
           
                    1. ? [CreateDataProperty](08_sec-abstract-operations.md#sec-createdataproperty)(*value*, *propertyKey*, *newElement*) işlemini gerçekleştir.
        
         6. *index* değerini *index* + 1 olarak ayarla.
    3. Değilse,

      1. keys, ? EnumerableOwnProperties(value, key) olsun.

      2. keys listesindeki her bir String propertyKey elemanı için sırayla yap:

         1. Eğer *entryRecords* içinde *entry*.*[[Key]]* değeri *propertyKey* ile aynı olan bir *entry* elemanı varsa, *entryRecord*, *entry* olsun; aksi takdirde *entryRecord*, `empty` olsun.
        
         2. *newElement*, ? [InternalizeJSONProperty](#sec-internalizejsonproperty)(*value*, *propertyKey*, *reviver*, *entryRecord*) olsun.
        
         3. Eğer *newElement* `undefined` ise, o zaman
           
                    1. ? *value*.*[[Delete]]*(*propertyKey*) işlemini gerçekleştir.
        
         4. Değilse,
           
                    1. ? [CreateDataProperty](08_sec-abstract-operations.md#sec-createdataproperty)(*value*, *propertyKey*, *newElement*) işlemini gerçekleştir.
  6. ? Call(reviver, holder, « name, value, context ») döndür.

25.5.2.5 Static Semantics: ShallowestContainedJSONValue ( root )

ShallowestContainedJSONValue soyut işlemi, root (bir Ayrıştırma Düğümü (Parse Node)) argümanını alır ve bir Ayrıştırma Düğümü (Parse Node) veya empty döndürür. root köklü ayrıştırma ağacında genişlik öncelikli arama (breadth-first search) gerçekleştirir ve bir JSON değerine karşılık gelen terminal olmayan (nonterminal) bir düğümün ilk örneğini döndürür; eğer böyle bir düğüm yoksa empty döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. activeFunc, etkin fonksiyon nesnesi (active function object) olsun.

  2. Assert: activeFunc, yerleşik bir JSON.parse fonksiyon nesnesidir (function object) (bakınız JSON.parse).

  3. types, « NullLiteral, BooleanLiteral, NumericLiteral, StringLiteral, ArrayLiteral, ObjectLiteral, UnaryExpression » olsun.

  4. unaryExpr, empty olsun.

  5. queue, « root » olsun.

  6. queue boş olmadığı sürece tekrarla:

    1. candidate, queue listesinin ilk elemanı olsun.

    2. queue listesinin ilk elemanını çıkar.

    3. queuedChildren değerini false olarak ayarla.

    4. types listesindeki her bir terminal olmayan (nonterminal) type elemanı için sırayla yap:

      1. Eğer candidate düğümü type tipinin bir örneği ise, o zaman

         1. [NOTE](06_sec-notational-conventions.md#note-step): JSON dilbilgisinde, bir `number` (sayı) belirteci (token) negatif bir değeri temsil edebilir. ECMAScript'te olumsuzlama, bir *[UnaryExpression](14_sec-ecmascript-language-expressions.md#prod-UnaryExpression)*'ın bir `-` ve ardından türetilmiş bir *[UnaryExpression](14_sec-ecmascript-language-expressions.md#prod-UnaryExpression)* olarak ayrıştırıldığı tekli bir işlem (unary operation) olarak temsil edilir.
        
         2. Eğer *type* bir *[UnaryExpression](14_sec-ecmascript-language-expressions.md#prod-UnaryExpression)* ise, o zaman
           
                    1. Eğer *candidate* düğümünün üst düğümü (parent) bir *[UnaryExpression](14_sec-ecmascript-language-expressions.md#prod-UnaryExpression)* [Ayrıştırma Düğümü (Parse Node)](06_sec-notational-conventions.md#sec-syntactic-grammar) değilse, *unaryExpr* değerini *candidate* olarak ayarla.
        
         3. Değilse eğer *type* bir *[NumericLiteral](13_sec-ecmascript-language-lexical-grammar.md#prod-NumericLiteral)* ise, o zaman
           
                    1. [Assert](06_sec-notational-conventions.md#assert): *candidate* düğümü *unaryExpr* içinde yer almaktadır.
           
                    2. *unaryExpr* döndür.
        
         4. Değilse,
           
                    1. *candidate* döndür.
      2. Eğer queuedChildren false ise, candidate terminal olmayan (nonterminal) bir düğümün örneğiyse ve candidate Contains type değeri true ise, o zaman

         1. *children*, sırayla *candidate* düğümünün her bir alt düğümünü içeren bir [Liste (List)](07_sec-ecmascript-data-types-and-values.md#sec-list-and-record-specification-type) olsun.
        
         2. *queue* listesini, *queue* ve *children* listelerinin [liste birleşimi (list-concatenation)](07_sec-ecmascript-data-types-and-values.md#list-concatenation) olarak ayarla.
        
         3. *queuedChildren* değerini `true` olarak ayarla.
  7. empty döndür.

25.5.2.6 Statik Semantik: JSONArrayLiteralContentNodes

Sözdizim odaklı işlem (syntax-directed operation) JSONArrayLiteralContentNodes hiçbir argüman almaz ve Ayrıştırma Düğümlerinin (Parse Nodes) bir Listesini (List) döndürür. Aşağıdaki üretimler (productions) üzerinden parça parça tanımlanmıştır:

ArrayLiteral ArrayLiteral : [ Elisionopt ] [ ElementList ] [ ElementList , Elisionopt ]

  1. Assert: Elision mevcut değildir.

  2. Eğer ElementList mevcut değilse, yeni ve boş bir Liste (List) döndür.

  3. ElementList düğümünün JSONArrayLiteralContentNodes semantiğini döndür.

ElementList ElementList : Elisionopt AssignmentExpression

  1. Assert: Elision mevcut değildir.

  2. « AssignmentExpression » döndür.

ElementList ElementList : ElementList , Elisionopt AssignmentExpression

  1. Assert: Elision mevcut değildir.

  2. elements, türetilmiş ElementList listesinin JSONArrayLiteralContentNodes semantiği olsun.

  3. *elements ve « AssignmentExpression » listelerinin liste birleşimini (list-concatenation) döndür.

ElementList ElementList : Elisionopt SpreadElement ElementList , Elisionopt SpreadElement

  1. NOTE: ECMA-404'te belirtildiği gibi JSON metni, SpreadElement içermez.

  2. Assert: Bu adıma hiçbir zaman ulaşılmaz.

25.5.3 JSON.rawJSON ( text )

Bu fonksiyon, bir karakter dizisi, sayı, boolean veya null değerinin ham (raw) JSON metnini temsil eden bir nesne döndürür.

  1. jsonString, ? ToString(text) olsun.

  2. Eğer jsonString boş Karakter Dizisi ise, bir SyntaxError istisnası fırlat.

  3. Eğer jsonString karakter dizisinin ilk kod birimi (code unit); bir ASCII küçük harf kod birimi (dahil olmak üzere 0x0061 ile 0x007A arası), bir ASCII rakam kod birimi (dahil olmak üzere 0x0030 ile 0x0039 arası), 0x0022 (QUOTATION MARK) veya 0x002D (HYPHEN-MINUS) değerlerinden biri değilse, bir SyntaxError istisnası fırlat.

  4. Eğer jsonString karakter dizisinin son kod birimi (code unit); bir ASCII küçük harf kod birimi (dahil olmak üzere 0x0061 ile 0x007A arası), bir ASCII rakam kod birimi (dahil olmak üzere 0x0030 ile 0x0039 arası) veya 0x0022 (QUOTATION MARK) değerlerinden biri değilse, bir SyntaxError istisnası fırlat.

  5. parseResult, ? ParseJSON(jsonString) olsun.

  6. Assert: parseResult.[[Value]] değeri; ya bir Karakter Dizisi, ya bir Sayı, ya bir Boolean, ya da null değeridir.

  7. internalSlotsList, « [[IsRawJSON]] » olsun.

  8. obj, OrdinaryObjectCreate(null, internalSlotsList) olsun.

  9. ! CreateDataPropertyOrThrow(obj, "rawJSON", jsonString) işlemini gerçekleştir.

  10. ! SetIntegrityLevel(obj, frozen) işlemini gerçekleştir.

  11. obj döndür.

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

Bu fonksiyon, bir ECMAScript dil değerini (ECMAScript language value) temsil eden UTF-16 kodlu JSON formatında bir Karakter Dizisi veya undefined döndürür. Üç parametre alabilir. value parametresi, genellikle bir nesne veya dizi olmasına rağmen bir Karakter Dizisi, Boolean, Sayı veya null da olabilen bir ECMAScript dil değeridir (ECMAScript language value). İsteğe bağlı replacer parametresi, ya nesnelerin ve dizilerin karakter dizisine dönüştürülme şeklini değiştiren bir fonksiyon, ya da karakter dizisine dönüştürülecek nesne özelliklerini seçmek için bir dahil etme listesi (inclusion list) görevi gören Karakter Dizileri ve Sayılar dizisidir. İsteğe bağlı space parametresi, insan tarafından okunabilirliği artırmak için sonuca boşluk eklenmesini sağlayan bir Karakter Dizisi veya Sayıdır.

Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. stack, yeni ve boş bir Liste (List) olsun.

  2. indent, boş Karakter Dizisi olsun.

  3. propertyList, undefined olsun.

  4. replacerFunc, undefined olsun.

  5. Eğer replacer bir Nesne ise (is an Object), o zaman

    1. Eğer IsCallable(replacer) true ise, o zaman

      1. replacerFunc değerini replacer olarak ayarla.
    2. Değilse,

      1. isArray, ? IsArray(replacer) olsun.

      2. Eğer isArray true ise, o zaman

         1. *propertyList* değerini yeni ve boş bir [Liste (List)](07_sec-ecmascript-data-types-and-values.md#sec-list-and-record-specification-type) olarak ayarla.
        
         2. *length*, ? [LengthOfArrayLike](08_sec-abstract-operations.md#sec-lengthofarraylike)(*replacer*) olsun.
        
         3. *k* değeri 0 olsun.
        
         4. *k* < *length* olduğu sürece tekrarla:
           
                   1. *propertyKey*, ! [ToString](08_sec-abstract-operations.md#sec-tostring)([𝔽](06_sec-notational-conventions.md#𝔽)(*k*)) olsun.
           
                   2. *propertyValue*, ? [Get](08_sec-abstract-operations.md#sec-get-o-p)(*replacer*, *propertyKey*) olsun.
           
                   3. *item*, `undefined` olsun.
           
                   4. Eğer *propertyValue* [bir Karakter Dizisi ise](07_sec-ecmascript-data-types-and-values.md#sec-ecmascript-language-types-string-type), o zaman
                     
                               1. *item* değerini *propertyValue* olarak ayarla.
           
                   5. Değilse eğer *propertyValue* [bir Sayı ise](07_sec-ecmascript-data-types-and-values.md#sec-ecmascript-language-types-number-type), o zaman
                     
                               1. *item* değerini ! [ToString](08_sec-abstract-operations.md#sec-tostring)(*propertyValue*) olarak ayarla.
           
                   6. Değilse eğer *propertyValue* [bir Nesne ise](07_sec-ecmascript-data-types-and-values.md#sec-object-type), o zaman
                     
                               1. Eğer *propertyValue* bir *[[StringData]]* veya *[[NumberData]]* dahili yuvasına sahipse, *item* değerini ? [ToString](08_sec-abstract-operations.md#sec-tostring)(*propertyValue*) olarak ayarla.
           
                   7. Eğer *item* `undefined` değilse ve *propertyList*, *item* değerini içermiyorsa, o zaman
                     
                               1. *item* değerini *propertyList* sonuna ekle.
           
                   8. *k* değerini *k* + 1 olarak ayarla.
  6. Eğer space bir Nesne ise (is an Object), o zaman

    1. Eğer space bir [[NumberData]] dahili yuvasına sahipse, o zaman

      1. space değerini ? ToNumber(space) olarak ayarla.
    2. Else if space bir [[StringData]] dahili yuvasına sahipse, o zaman

      1. space değerini ? ToString(space) olarak ayarla.
  7. Eğer space bir Sayı ise (is a Number), o zaman

    1. spaceMV, ! ToIntegerOrInfinity(space) olsun.

    2. spaceMV değerini min(10, spaceMV) olarak ayarla.

    3. Eğer spaceMV < 1 ise, gap boş Karakter Dizisi olsun; aksi takdirde gap, spaceMV adet 0x0020 (SPACE) kod biriminden oluşan Karakter Dizisi olsun.

  8. Değilse eğer space bir Karakter Dizisi ise (is a String), o zaman

    1. Eğer space uzunluğu ≤ 10 ise, gap, space olsun; aksi takdirde gap, space nesnesinin 0'dan 10'a kadar olan alt karakter dizisi (substring) olsun.
  9. Değilse,

    1. gap, boş Karakter Dizisi olsun.
  10. wrapper, OrdinaryObjectCreate(%Object.prototype%) olsun.

  11. ! CreateDataPropertyOrThrow(wrapper, boş Karakter Dizisi, value) işlemini gerçekleştir.

  12. state, JSON Serileştirme Kaydı (JSON Serialization Record) { [[ReplacerFunction]]: replacerFunc, [[Stack]]: stack, [[Indent]]: indent, [[Gap]]: gap, [[PropertyList]]: propertyList } olsun.

  13. ? SerializeJSONProperty(state, boş Karakter Dizisi, wrapper) döndür.

Bu fonksiyonun "length" özelliğinin ilk değeri 3𝔽 şeklindedir.

25.5.4.1 JSON Serileştirme Kaydı (JSON Serialization Record)

Bir JSON Serileştirme Kaydı (JSON Serialization Record), JSON formatına serileştirmeyi sağlamak için kullanılan bir Kayıt (Record) değeridir.

JSON Serileştirme Kayıtları, Tablo 76 içinde listelenen alanlara sahiptir.

Tablo 76: JSON Serileştirme Kaydı Alanları

Alan Adı Değer Anlamı
[[ReplacerFunction]] bir fonksiyon nesnesi veya undefined Nesne özellikleri için yedek değerler sağlayabilen bir fonksiyon (JSON.stringify'ın replacer parametresinden).
[[PropertyList]] Karakter Dizilerinin bir Listesi (List) veya undefined Dizi olmayan bir nesneyi serileştirirken dahil edilecek özelliklerin adları (JSON.stringify'ın replacer parametresinden).
[[Gap]] bir Karakter Dizisi Girintileme birimi (JSON.stringify'ın space parametresinden).
[[Stack]] Nesnelerin bir Listesi (List) Serileştirilme sürecinde olan iç içe geçmiş nesneler kümesi. Döngüsel yapıları tespit etmek için kullanılır.
[[Indent]] bir Karakter Dizisi Geçerli girintileme.

25.5.4.2 SerializeJSONProperty ( state, key, holder )

SerializeJSONProperty soyut işlemi, state (bir JSON Serileştirme Kaydı), key (bir Karakter Dizisi) ve holder (bir Nesne) argümanlarını alır ve bir Karakter Dizisi veya undefined içeren bir olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Let value be ? Get(holder, key).

  2. If value is an Object or value is a BigInt, then

    1. Let toJSON be ? GetV(value, "toJSON").

    2. If IsCallable(toJSON) is true, then

      1. Set value to ? Call(toJSON, value, « key »).
  3. If state.[[ReplacerFunction]] is not undefined, then

    1. Set value to ? Call(state.[[ReplacerFunction]], holder, « key, value »).
  4. If value is an Object, then

    1. If value has an [[IsRawJSON]] internal slot, then

      1. Let rawJSON be ! Get(value, "rawJSON").

      2. Assert: rawJSON is a String.

      3. Return rawJSON.

    2. If value has a [[NumberData]] internal slot, then

      1. Set value to ? ToNumber(value).
    3. Else if value has a [[StringData]] internal slot, then

      1. Set value to ? ToString(value).
    4. Else if value has a [[BooleanData]] internal slot, then

      1. Set value to value.[[BooleanData]].
    5. Else if value has a [[BigIntData]] internal slot, then

      1. Set value to value.[[BigIntData]].
  5. If value is null, return "null".

  6. If value is true, return "true".

  7. If value is false, return "false".

  8. If value is a String, return QuoteJSONString(value).

  9. If value is a Number, then

    1. If value is finite, return ! ToString(value).

    2. Return "null".

  10. If value is a BigInt, throw a TypeError exception.

  11. If value is an Object and IsCallable(value) is false, then

    1. Let isArray be ? IsArray(value).

    2. If isArray is true, then

      1. Return ? SerializeJSONArray(state, value).
    3. Return ? SerializeJSONObject(state, value).

  12. Return undefined.

25.5.4.3 QuoteJSONString ( value )

QuoteJSONString soyut işlemi, value (bir Karakter Dizisi) argümanını alır ve bir Karakter Dizisi döndürür. value değerini 0x0022 (QUOTATION MARK) kod birimleri ile çevreler ve içindeki diğer bazı kod birimlerini kaçış dizisine (escaped) dönüştürür. Bu işlem, 6.1.4 bölümünde açıklandığı gibi, value değerini UTF-16 kodlu kod noktalarının (code points) bir dizisi olarak yorumlar. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. product, yalnızca 0x0022 (QUOTATION MARK) kod biriminden oluşan Karakter Dizisi değeri olsun.

  2. StringToCodePoints(value) listesinin her bir codePoint kod noktası için sırayla yap:

    1. Eğer codePoint Tablo 77 içindeki "Code Point" sütununda listelenmişse, o zaman

      1. product değerini, product ve karşılık gelen satırın "Escape Sequence" sütununda belirtilen codePoint kaçış dizisinin karakter dizisi birleşimi (string-concatenation) olarak ayarla.
    2. Değilse eğer codePoint sayısal değeri 0x0020 (SPACE) değerinden küçükse veya codePoint bir öncü yedek (leading surrogate) veya artçı yedek (trailing surrogate) ile aynı sayısal değere sahipse, o zaman

      1. unit, sayısal değeri codePoint sayısal değeri olan kod birimi olsun.

      2. product değerini, product ve UnicodeEscape(unit) değerinin karakter dizisi birleşimi (string-concatenation) olarak ayarla.

    3. Değilse,

      1. product değerini, product ve UTF16EncodeCodePoint(codePoint) değerinin karakter dizisi birleşimi (string-concatenation) olarak ayarla.
  3. product değerini, product ve 0x0022 (QUOTATION MARK) kod biriminin karakter dizisi birleşimi (string-concatenation) olarak ayarla.

  4. product döndür.

Tablo 77: JSON Tek Karakter Kaçış Dizileri (JSON Single Character Escape Sequences)

Kod Noktası (Code Point) Unicode Karakter Adı Kaçış Dizisi (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 \\

25.5.4.4 UnicodeEscape ( codeUnit )

UnicodeEscape soyut işlemi, codeUnit (bir kod birimi) argümanını alır ve bir Karakter Dizisi döndürür. codeUnit değerini bir Unicode kaçış dizisi olarak temsil eder. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Let n be the numeric value of codeUnit.

  2. Assert: n ≤ 0xFFFF.

  3. Let hex be the String representation of n, formatted as a lowercase hexadecimal number.

  4. Return the string-concatenation of the code unit 0x005C (REVERSE SOLIDUS), "u", and StringPad(hex, 4, "0", start).

25.5.4.5 SerializeJSONObject ( state, value )

SerializeJSONObject soyut işlemi, state (bir JSON Serileştirme Kaydı) ve value (bir Nesne) argümanlarını alır ve bir Karakter Dizisi içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Bir nesneyi serileştirir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer state.[[Stack]], value değerini içeriyorsa, yapı döngüsel (cyclical) olduğu için bir TypeError istisnası fırlat.

  2. value değerini state.[[Stack]] listesine ekle.

  3. stepBack, state.[[Indent]] olsun.

  4. state.[[Indent]] değerini, state.[[Indent]] ve state.[[Gap]] değerlerinin karakter dizisi birleşimi (string-concatenation) olarak ayarla.

  5. Eğer state.[[PropertyList]] değeri undefined değilse, o zaman

    1. Let keys be state.[[PropertyList]].
  6. Değilse,

    1. Let keys be ? EnumerableOwnProperties(value, key).
  7. partial, yeni ve boş bir Liste (List) olsun.

  8. keys listesindeki her bir propertyKey elemanı için sırayla yap:

    1. stringP, ? SerializeJSONProperty(state, propertyKey, value) olsun.

    2. Eğer stringP undefined değilse, o zaman

      1. member, QuoteJSONString(propertyKey) olsun.

      2. member değerini, member ve ":" değerinin karakter dizisi birleşimi (string-concatenation) olarak ayarla.

      3. Eğer state.[[Gap]] boş Karakter Dizisi değilse, o zaman

         1. *member* değerini, *member* ve 0x0020 (SPACE) kod biriminin [karakter dizisi birleşimi (string-concatenation)](07_sec-ecmascript-data-types-and-values.md#string-concatenation) olarak ayarla.
      4. member değerini, member ve stringP değerinin karakter dizisi birleşimi (string-concatenation) olarak ayarla.

      5. member değerini partial listesine ekle.

  9. Eğer partial boş ise, o zaman

    1. final, "{}" olsun.
  10. Değilse,

    1. Eğer state.[[Gap]] boş Karakter Dizisi ise, o zaman

      1. properties, partial listesinin tüm eleman karakter dizilerinin, her bitişik karakter dizisi çifti arasına 0x002C (COMMA) kod birimi getirilerek birleştirilmesiyle elde edilen Karakter Dizisi değeri olsun. İlk karakter dizisinden önce veya son karakter dizisinden sonra virgül eklenmez.

      2. final, "{", properties ve "}" değerlerinin karakter dizisi birleşimi (string-concatenation) olsun.

    2. Değilse,

      1. separator, 0x002C (COMMA), 0x000A (LINE FEED) ve state.[[Indent]] değerlerinin karakter dizisi birleşimi (string-concatenation) olsun.

      2. properties, partial listesinin tüm eleman karakter dizilerinin, her bitişik karakter dizisi çifti arasına separator getirilerek birleştirilmesiyle elde edilen Karakter Dizisi değeri olsun. separator karakter dizisi, ilk karakter dizisinden önce veya son karakter dizisinden sonra eklenmez.

      3. final, "{", 0x000A (LINE FEED), state.[[Indent]], properties, 0x000A (LINE FEED), stepBack ve "}" değerlerinin karakter dizisi birleşimi (string-concatenation) olsun.

  11. state.[[Stack]] listesinin son elemanını çıkar.

  12. state.[[Indent]] değerini stepBack olarak ayarla.

  13. Return final.

25.5.4.6 SerializeJSONArray ( state, value )

SerializeJSONArray soyut işlemi, state (bir JSON Serileştirme Kaydı) ve value (bir Nesne) argümanlarını alır ve bir Karakter Dizisi içeren olağan tamamlanma (normal completion containing) ya da bir fırlatma tamamlanması (throw completion) döndürür. Bir diziyi serileştirir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer state.[[Stack]], value değerini içeriyorsa, yapı döngüsel (cyclical) olduğu için bir TypeError istisnası fırlat.

  2. value değerini state.[[Stack]] listesine ekle.

  3. stepBack, state.[[Indent]] olsun.

  4. state.[[Indent]] değerini, state.[[Indent]] ve state.[[Gap]] değerlerinin karakter dizisi birleşimi (string-concatenation) olarak ayarla.

  5. partial, yeni ve boş bir Liste (List) olsun.

  6. Let length be ? LengthOfArrayLike(value).

  7. index değeri 0 olsun.

  8. index < length olduğu sürece tekrarla:

    1. stringP, ? SerializeJSONProperty(state, ! ToString(𝔽(index)), value) olsun.

    2. Eğer stringP undefined ise, o zaman

      1. partial listesine "null" ekle.
    3. Değilse,

      1. stringP değerini partial listesine ekle.
    4. index değerini index + 1 olarak ayarla.

  9. Eğer partial boş ise, o zaman

    1. final, "[]" olsun.
  10. Değilse,

    1. Eğer state.[[Gap]] boş Karakter Dizisi ise, o zaman

      1. properties, partial listesinin tüm eleman karakter dizilerinin, her bitişik karakter dizisi çifti arasına 0x002C (COMMA) kod birimi getirilerek birleştirilmesiyle elde edilen Karakter Dizisi değeri olsun. İlk karakter dizisinden önce veya son karakter dizisinden sonra virgül eklenmez.

      2. final, "[", properties ve "]" değerlerinin karakter dizisi birleşimi (string-concatenation) olsun.

    2. Değilse,

      1. separator, 0x002C (COMMA), 0x000A (LINE FEED) ve state.[[Indent]] değerlerinin karakter dizisi birleşimi (string-concatenation) olsun.

      2. properties, partial listesinin tüm eleman karakter dizilerinin, her bitişik karakter dizisi çifti arasına separator getirilerek birleştirilmesiyle elde edilen Karakter Dizisi değeri olsun. separator karakter dizisi, ilk karakter dizisinden önce veya son karakter dizisinden sonra eklenmez.

      3. final, "[", the code unit 0x000A (LINE FEED), state.[[Indent]], properties, the code unit 0x000A (LINE FEED), stepBack ve "]" değerlerinin karakter dizisi birleşimi (string-concatenation) olsun.

  11. state.[[Stack]] listesinin son elemanını çıkar.

  12. state.[[Indent]] değerini stepBack olarak ayarla.

  13. Return final.

25.5.5 JSON [ %Symbol.toStringTag% ]

%Symbol.toStringTag%(07_sec-ecmascript-data-types-and-values.md#sec-well-known-symbols) özelliğinin ilk değeri "JSON" dizgisidir.

Bu özellik { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } özniteliklerine sahiptir.