Aşağıdakiler, büyütülebilir SharedArrayBuffer nesnelerini uygulayan ECMAScript uygulayıcıları için kılavuzlardır.
Büyütülebilir SharedArrayBuffer nesnelerinin, sanal bellek önceden rezerve edilerek yerinde büyüme (in-place growth) olarak uygulanmasını öneririz.
Büyütme işlemleri, büyütülebilir bir SharedArrayBuffer üzerindeki bellek erişimleriyle paralel olarak gerçekleşebileceğinden, bellek modelinin (memory model) kısıtlamaları, sıralanmamış erişimlerin bile "yırtılmamasını" (değerlerinin bitlerinin birbirine karışmamasını) gerektirir. Pratikte bu, büyütülebilir bir SharedArrayBuffer'ın altta yatan veri bloğunun dünyayı durdurmadan (stopping the world) kopyalanarak büyütülemeyeceği anlamına gelir. Dünyayı durdurmayı bir uygulama stratejisi olarak önermiyoruz çünkü bu bir serileştirme noktası oluşturur ve yavaştır.
Büyütülen bellek, paralel olarak gerçekleşen herhangi bir yarışmalı erişim de dahil olmak üzere, oluşturulduğu andan itibaren sıfırlanmış olarak görünmelidir. Bu, talep üzerine sıfırla doldurulan (zero-filled-on-demand) sanal bellek sayfaları veya bellek manuel olarak sıfırlanıyorsa dikkatli bir eşzamanlama yoluyla gerçekleştirilebilir.
Büyütülebilir SharedArrayBuffer nesnelerinin TypedArray görünümlerindeki tamsayı indeksli (integer-indexed) özellik erişiminin, büyütülebilir olmayan SharedArrayBuffer nesnelerinin TypedArray görünümlerindeki erişime benzer şekilde optimize edilebilmesi amaçlanmıştır; çünkü tamsayı indeksli (integer-indexed) özellik yüklemeleri, altta yatan arabelleğin uzunluğu üzerinde eşzamanlama yapmaz (yukarıdaki programcı kılavuzlarına bakın). Örneğin, özellik erişimleri için sınır kontrolleri yine de döngülerin dışına taşınabilir.
Pratikte, bir MMU'su olmayan gömülü cihazlarda çalışanlar gibi sanal belleği bulunmayan ana bilgisayarlarda (hosts) büyütülebilir SharedArrayBuffer nesnelerini kopyalayarak uygulamak zordur. Bu tür ana bilgisayarlardaki (hosts) büyütülebilir SharedArrayBuffer nesnelerinin bellek kullanım davranışı, sanal belleğe sahip ana bilgisayarlarınkinden (hosts) önemli ölçüde farklılık gösterebilir. Bu tür ana bilgisayarlar (hosts), bellek kullanımı beklentilerini kullanıcılara açıkça iletmelidir.
#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:
buffer, obj.[[ViewedArrayBuffer]] olsun.
Eğer IsDetachedBuffer(buffer) true ise, o zaman
- byteLength,
detached olsun.
Değilse,
- byteLength, ArrayBufferByteLength(buffer, order) olsun.
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:
Assert: IsViewOutOfBounds(viewRecord) false değeridir.
view, viewRecord.[[Object]] olsun.
Eğer view.[[ByteLength]] auto değilse, view.[[ByteLength]] değerini döndür.
Assert: IsFixedLengthArrayBuffer(view.[[ViewedArrayBuffer]]) false değeridir.
byteOffset, view.[[ByteOffset]] olsun.
byteLength, viewRecord.[[CachedBufferByteLength]] olsun.
Assert: byteLength detached değildir.
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:
view, viewRecord.[[Object]] olsun.
bufferByteLength, viewRecord.[[CachedBufferByteLength]] olsun.
Eğer IsDetachedBuffer(view.[[ViewedArrayBuffer]]) true ise, o zaman
Assert: bufferByteLength detached değeridir.
true döndür.
Assert: bufferByteLength negatif olmayan bir tamsayı (integer) değeridir.
byteOffsetStart, view.[[ByteOffset]] olsun.
Eğer view.[[ByteLength]] auto ise, o zaman
- byteOffsetEnd, bufferByteLength olsun.
Değilse,
- byteOffsetEnd, byteOffsetStart + view.[[ByteLength]] olsun.
NOTE: [[ByteOffset]] değeri bufferByteLength olan 0 uzunluğunda bir DataView sınır dışı sayılmaz.
Eğer byteOffsetStart > bufferByteLength veya byteOffsetEnd > bufferByteLength ise, true döndür.
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:
? RequireInternalSlot(view, [[DataView]]) işlemini gerçekleştir.
Assert: view bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.
getIndex, ? ToIndex(requestIndex) olsun.
isLittleEndian değerini ToBoolean(isLittleEndian) olarak ayarla.
viewOffset, view.[[ByteOffset]] olsun.
viewRecord, MakeDataViewWithBufferWitnessRecord(view, unordered) olsun.
NOTE: view nesnesinin arka deposu büyütülebilir bir SharedArrayBuffer olduğunda, sınır kontrolü bir eşzamanlama işlemi değildir.
Eğer IsViewOutOfBounds(viewRecord) true ise, bir TypeError istisnası fırlat.
viewSize, GetViewByteLength(viewRecord) olsun.
elementSize, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.
Eğer getIndex + elementSize > viewSize ise, bir RangeError istisnası fırlat.
bufferIndex, getIndex + viewOffset olsun.
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:
? RequireInternalSlot(view, [[DataView]]) işlemini gerçekleştir.
Assert: view bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.
getIndex, ? ToIndex(requestIndex) olsun.
Eğer IsBigIntElementType(type) true ise, number, ? ToBigInt(value) olsun.
Değilse, number, ? ToNumber(value) olsun.
isLittleEndian değerini ToBoolean(isLittleEndian) olarak ayarla.
viewOffset, view.[[ByteOffset]] olsun.
viewRecord, MakeDataViewWithBufferWitnessRecord(view, unordered) olsun.
NOTE: view nesnesinin arka deposu büyütülebilir bir SharedArrayBuffer olduğunda, sınır kontrolü bir eşzamanlama işlemi değildir.
Eğer IsViewOutOfBounds(viewRecord) true ise, bir TypeError istisnası fırlat.
viewSize, GetViewByteLength(viewRecord) olsun.
elementSize, Eleman Türü type için Tablo 70 içinde belirtilen Eleman Boyutu (Element Size) değeri olsun.
Eğer getIndex + elementSize > viewSize ise, bir RangeError istisnası fırlat.
bufferIndex, getIndex + viewOffset olsun.
SetValueInBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, number, false, unordered, isLittleEndian) işlemini gerçekleştir.
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:
Eğer NewTarget undefined ise, bir TypeError istisnası fırlat.
? RequireInternalSlot(buffer, [[ArrayBufferData]]) işlemini gerçekleştir.
offset, ? ToIndex(byteOffset) olsun.
Eğer IsDetachedBuffer(buffer) true ise, bir TypeError istisnası fırlat.
bufferByteLength, ArrayBufferByteLength(buffer, seq-cst) olsun.
Eğer offset > bufferByteLength ise, bir RangeError istisnası fırlat.
bufferIsFixedLength, IsFixedLengthArrayBuffer(buffer) olsun.
Eğer byteLength undefined ise, o zaman
Eğer bufferIsFixedLength true ise, o zaman
- viewByteLength, bufferByteLength - offset olsun.
Değilse,
- viewByteLength,
auto olsun.
Değilse,
viewByteLength, ? ToIndex(byteLength) olsun.
Eğer offset + viewByteLength > bufferByteLength ise, bir RangeError istisnası fırlat.
obj, ? OrdinaryCreateFromConstructor(NewTarget, "%DataView.prototype%", « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] ») olsun.
Eğer IsDetachedBuffer(buffer) true ise, bir TypeError istisnası fırlat.
bufferByteLength değerini ArrayBufferByteLength(buffer, seq-cst) olarak ayarla.
Eğer offset > bufferByteLength ise, bir RangeError istisnası fırlat.
Eğer byteLength undefined değilse, o zaman
- Eğer offset + viewByteLength > bufferByteLength ise, bir
RangeError istisnası fırlat.
obj.[[ViewedArrayBuffer]] değerini buffer olarak ayarla.
obj.[[ByteLength]] değerini viewByteLength olarak ayarla.
obj.[[ByteOffset]] değerini offset olarak ayarla.
obj döndür.
#25.3.3 DataView Yapıcısının Özellikleri (Properties of the DataView Constructor)
DataView yapıcısı (constructor):
#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:
obj, this değeri olsun.
? RequireInternalSlot(obj, [[DataView]]) işlemini gerçekleştir.
Assert: obj bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.
buffer, obj.[[ViewedArrayBuffer]] olsun.
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:
obj, this değeri olsun.
? RequireInternalSlot(obj, [[DataView]]) işlemini gerçekleştir.
Assert: obj bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.
viewRecord, MakeDataViewWithBufferWitnessRecord(obj, seq-cst) olsun.
Eğer IsViewOutOfBounds(viewRecord) true ise, bir TypeError istisnası fırlat.
size, GetViewByteLength(viewRecord) olsun.
𝔽(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:
obj, this değeri olsun.
? RequireInternalSlot(obj, [[DataView]]) işlemini gerçekleştir.
Assert: obj bir [[ViewedArrayBuffer]] dahili yuvasına sahiptir.
viewRecord, MakeDataViewWithBufferWitnessRecord(obj, seq-cst) olsun.
Eğer IsViewOutOfBounds(viewRecord) true ise, bir TypeError istisnası fırlat.
offset, obj.[[ByteOffset]] olsun.
𝔽(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:
view, this değeri olsun.
? 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:
view, this değeri olsun.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
? 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:
view, this değeri olsun.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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:
view, this değeri olsun.
Eğer littleEndian mevcut değilse, littleEndian değerini false olarak ayarla.
? 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.