Adım 3.a'da oluşturulabilecek nesneye, yukarıdaki soyut işlemin ve sıradan nesne [[Set]] iç yönteminin dışında erişilemez. Bir gerçekleştirim, bu nesnenin fiilen oluşturulmasından kaçınmayı seçebilir.
#6.2.5.7 GetThisValue ( refRecord )
Soyut işlem GetThisValue, refRecord (bir Reference Record) argümanını alır ve bir ECMAScript dil değeri döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Assert: IsPropertyReference(refRecord) true'dur.
Eğer IsSuperReference(refRecord) true ise, refRecord.[[ThisValue]] döndür.
refRecord.[[Base]] döndür.
#6.2.5.8 InitializeReferencedBinding ( refRecord, value )
Soyut işlem InitializeReferencedBinding, refRecord (bir Reference Record) ve value (bir ECMAScript dil değeri) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir ani tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Assert: IsUnresolvableReference(refRecord) false'dır.
base = refRecord.[[Base]] olsun.
Assert: base bir Environment Record'dır.
? base.InitializeBinding(refRecord.[[ReferencedName]], value) döndür.
#6.2.5.9 MakePrivateReference ( baseValue, privateIdentifier )
Soyut işlem MakePrivateReference, baseValue (bir ECMAScript dil değeri) ve privateIdentifier (bir String) argümanlarını alır ve bir Reference Record döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
privateEnv, çalışan yürütme bağlamının PrivateEnvironment'ı olsun.
Assert: privateEnv null değildir.
privateName = ResolvePrivateIdentifier(privateEnv, privateIdentifier) olsun.
Reference Record { [[Base]]: baseValue, [[ReferencedName]]: privateName, [[Strict]]: true, [[ThisValue]]: empty } döndür.
#6.2.6 Property Descriptor Belirtim Türü
Property Descriptor türü, Object özelliği niteliklerinin işlenmesini ve şeyleştirilmesini açıklamak için kullanılır. Bir Property Descriptor, her alanın adının bir nitelik adı ve değerinin 6.1.7.1'de belirtilen karşılık gelen bir nitelik değeri olduğu, sıfır veya daha fazla alanı olan bir Record'dır. Bu belirtim içerisinde Property Descriptor record'larının değişmez açıklamalarını etiketlemek için kullanılan şema adı “PropertyDescriptor”dır.
Property Descriptor değerleri, belirli alanların varlığına veya kullanımına bağlı olarak, veri Property Descriptor'ları ve erişimci Property Descriptor'ları olarak daha da sınıflandırılabilir. Bir veri Property Descriptor'ı, [[Value]] veya [[Writable]] adlı alanlardan herhangi birini içerendir. Bir erişimci Property Descriptor'ı, [[Get]] veya [[Set]] adlı alanlardan herhangi birini içerendir. Herhangi bir Property Descriptor, [[Enumerable]] ve [[Configurable]] adlı alanlara sahip olabilir. Bir Property Descriptor değeri, hem bir veri Property Descriptor'ı hem de bir erişimci Property Descriptor'ı olamaz; ancak, ikisi de olmayabilir (bu durumda genel bir Property Descriptor'dır). Tam olarak doldurulmuş bir Property Descriptor, ya bir erişimci Property Descriptor'ı ya da bir veri Property Descriptor'ı olan ve Tablo 3'te tanımlanan karşılık gelen alanların tümüne sahip olandır.
Aşağıdaki soyut işlemler, bu belirtimde Property Descriptor değerleri üzerinde işlem yapmak için kullanılır:
#6.2.6.1 IsAccessorDescriptor ( propertyDesc )
Soyut işlem IsAccessorDescriptor, propertyDesc (bir Property Descriptor) argümanını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer propertyDesc'in bir [[Get]] alanı varsa, true döndür.
Eğer propertyDesc'in bir [[Set]] alanı varsa, true döndür.
false döndür.
#6.2.6.2 IsDataDescriptor ( propertyDesc )
Soyut işlem IsDataDescriptor, propertyDesc (bir Property Descriptor) argümanını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer propertyDesc'in bir [[Value]] alanı varsa, true döndür.
Eğer propertyDesc'in bir [[Writable]] alanı varsa, true döndür.
false döndür.
#6.2.6.3 IsGenericDescriptor ( propertyDesc )
Soyut işlem IsGenericDescriptor, propertyDesc (bir Property Descriptor) argümanını alır ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer IsAccessorDescriptor(propertyDesc) true ise, false döndür.
Eğer IsDataDescriptor(propertyDesc) true ise, false döndür.
true döndür.
#6.2.6.4 FromPropertyDescriptor ( propertyDesc )
Soyut işlem FromPropertyDescriptor, propertyDesc (bir Property Descriptor veya undefined) argümanını alır ve bir Object veya undefined döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer propertyDesc undefined ise, undefined döndür.
obj = OrdinaryObjectCreate(%Object.prototype%) olsun.
Assert: obj, kendi özelliği olmayan genişletilebilir bir sıradan nesnedir.
Eğer propertyDesc'in bir [[Value]] alanı varsa,
- ! CreateDataPropertyOrThrow(obj,
"value", propertyDesc.[[Value]]) işlemini gerçekleştir.
Eğer propertyDesc'in bir [[Writable]] alanı varsa,
- ! CreateDataPropertyOrThrow(obj,
"writable", propertyDesc.[[Writable]]) işlemini gerçekleştir.
Eğer propertyDesc'in bir [[Get]] alanı varsa,
- ! CreateDataPropertyOrThrow(obj,
"get", propertyDesc.[[Get]]) işlemini gerçekleştir.
Eğer propertyDesc'in bir [[Set]] alanı varsa,
- ! CreateDataPropertyOrThrow(obj,
"set", propertyDesc.[[Set]]) işlemini gerçekleştir.
Eğer propertyDesc'in bir [[Enumerable]] alanı varsa,
- ! CreateDataPropertyOrThrow(obj,
"enumerable", propertyDesc.[[Enumerable]]) işlemini gerçekleştir.
Eğer propertyDesc'in bir [[Configurable]] alanı varsa,
- ! CreateDataPropertyOrThrow(obj,
"configurable", propertyDesc.[[Configurable]]) işlemini gerçekleştir.
obj döndür.
#6.2.6.5 ToPropertyDescriptor ( obj )
Soyut işlem ToPropertyDescriptor, obj (bir ECMAScript dil değeri) argümanını alır ve ya bir Property Descriptor içeren normal tamamlanma ya da bir throw tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer obj bir Object değilse, bir TypeError kuraldışı durumu fırlat.
propertyDesc, başlangıçta hiçbir alanı olmayan yeni bir Property Descriptor olsun.
hasEnumerable = ? HasProperty(obj, "enumerable") olsun.
Eğer hasEnumerable true ise,
enumerable = ToBoolean(? Get(obj, "enumerable")) olsun.
propertyDesc.[[Enumerable]]'i enumerable olarak ayarla.
hasConfigurable = ? HasProperty(obj, "configurable") olsun.
Eğer hasConfigurable true ise,
configurable = ToBoolean(? Get(obj, "configurable")) olsun.
propertyDesc.[[Configurable]]'ı configurable olarak ayarla.
hasValue = ? HasProperty(obj, "value") olsun.
Eğer hasValue true ise,
value = ? Get(obj, "value") olsun.
propertyDesc.[[Value]]'ı value olarak ayarla.
hasWritable = ? HasProperty(obj, "writable") olsun.
Eğer hasWritable true ise,
writable = ToBoolean(? Get(obj, "writable")) olsun.
propertyDesc.[[Writable]]'ı writable olarak ayarla.
hasGet = ? HasProperty(obj, "get") olsun.
Eğer hasGet true ise,
getter = ? Get(obj, "get") olsun.
Eğer IsCallable(getter) false ise ve getter undefined değilse, bir TypeError kuraldışı durumu fırlat.
propertyDesc.[[Get]]'i getter olarak ayarla.
hasSet = ? HasProperty(obj, "set") olsun.
Eğer hasSet true ise,
setter = ? Get(obj, "set") olsun.
Eğer IsCallable(setter) false ise ve setter undefined değilse, bir TypeError kuraldışı durumu fırlat.
propertyDesc.[[Set]]'i setter olarak ayarla.
Eğer propertyDesc'in bir [[Get]] alanı varsa veya propertyDesc'in bir [[Set]] alanı varsa,
- Eğer propertyDesc'in bir [[Value]] alanı varsa veya propertyDesc'in bir [[Writable]] alanı varsa, bir
TypeError kuraldışı durumu fırlat.
propertyDesc döndür.
#6.2.6.6 CompletePropertyDescriptor ( propertyDesc )
Soyut işlem CompletePropertyDescriptor, propertyDesc (bir Property Descriptor) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
like, Record { [[Value]]: undefined, [[Writable]]: false, [[Get]]: undefined, [[Set]]: undefined, [[Enumerable]]: false, [[Configurable]]: false } olsun.
Eğer IsGenericDescriptor(propertyDesc) true ise veya IsDataDescriptor(propertyDesc) true ise,
Eğer propertyDesc'in bir [[Value]] alanı yoksa, propertyDesc.[[Value]]'ı like.[[Value]] olarak ayarla.
Eğer propertyDesc'in bir [[Writable]] alanı yoksa, propertyDesc.[[Writable]]'ı like.[[Writable]] olarak ayarla.
Değilse,
Eğer propertyDesc'in bir [[Get]] alanı yoksa, propertyDesc.[[Get]]'i like.[[Get]] olarak ayarla.
Eğer propertyDesc'in bir [[Set]] alanı yoksa, propertyDesc.[[Set]]'i like.[[Set]] olarak ayarla.
Eğer propertyDesc'in bir [[Enumerable]] alanı yoksa, propertyDesc.[[Enumerable]]'i like.[[Enumerable]] olarak ayarla.
Eğer propertyDesc'in bir [[Configurable]] alanı yoksa, propertyDesc.[[Configurable]]'ı like.[[Configurable]] olarak ayarla.
unused döndür.
#6.2.7 Environment Record Belirtim Türü
Environment Record türü, iç içe işlevlerde ve bloklarda ad çözümlemenin davranışını açıklamak için kullanılır. Bu tür ve üzerindeki işlemler 9.1'de tanımlanmıştır.
#6.2.8 Abstract Closure Belirtim Türü
Abstract Closure belirtim türü, bir değerler topluluğu ile birlikte algoritma adımlarına atıfta bulunmak için kullanılır. Abstract Closure'lar üst-değerlerdir ve closure(arg1, arg2) gibi işlev uygulama biçemi kullanılarak çağrılırlar. Soyut işlemler gibi, çağrılar da Abstract Closure tarafından tanımlanan algoritma adımlarını gerçekleştirir.
Bir Abstract Closure oluşturan algoritma adımlarında, değerler “capture” eylemi ve ardından bir takma ad listesi ile yakalanır. Bir Abstract Closure oluşturulduğunda, o anda her takma adla ilişkili değeri yakalar. Bir Abstract Closure çağrıldığında gerçekleştirilecek algoritmayı belirten adımlarda, yakalanan her değere, değeri yakalamak için kullanılan takma ad ile atıfta bulunulur.
Eğer bir Abstract Closure bir Completion Record döndürürse, bu Completion Record ya bir normal tamamlanma ya da bir throw tamamlanması olmak zorundadır.
Abstract Closure'lar, aşağıdaki örnekte gösterildiği gibi, diğer algoritmaların bir parçası olarak satır içinde oluşturulur.
addend 41 olsun.
closure, addend'i yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, (x) parametreli yeni bir Abstract Closure olsun:
- x + addend döndür.
value = closure(1) olsun.
Assert: value 42'dir.
#6.2.9 Veri Blokları
Data Block belirtim türü, bayt boyutlu (8 bit) sayısal değerlerin farklı ve değişebilir bir dizisini tanımlamak için kullanılır. Bir bayt değeri, 0 ile 255 dahil aralığında bir tamsayıdır. Bir Data Block değeri, her biri başlangıç değeri 0 olan sabit sayıda baytla oluşturulur.
Bu belirtim içerisinde gösterim kolaylığı için, bir Data Block değerinin bireysel baytlarına erişmek üzere dizi benzeri bir sözdizimi kullanılabilir. Bu gösterim, bir Data Block değerini, 0 tabanlı tamsayı indisli bir bayt dizisi olarak sunar. Örneğin, eğer db 5 baytlık bir Data Block değeri ise, db[2] onun 3üncü baytına erişmek için kullanılabilir.
Birden fazla etmen tarafından eşzamanlı olarak başvurulabilen bellekte yer alan bir veri bloğu, Paylaşımlı Veri Bloğu olarak adlandırılır. Bir Paylaşımlı Veri Bloğu, (Paylaşımlı Veri Bloğu değerlerinin eşitlik sınaması amacıyla) adresten bağımsız bir kimliğe sahiptir: bu, bloğun herhangi bir süreçte eşlendiği sanal adreslere değil, bloğun temsil ettiği bellekteki konumlar kümesine bağlıdır. İki veri bloğu, yalnızca içerdikleri konumların kümeleri eşitse eşittir; aksi takdirde eşit değildirler ve içerdikleri konum kümelerinin kesişimi boştur. Son olarak, Paylaşımlı Veri Blokları, Veri Bloklarından ayırt edilebilir.
Paylaşımlı Veri Bloklarının anlambilimi, bellek modeli tarafından Paylaşımlı Veri Bloğu olayları kullanılarak tanımlanır. Aşağıdaki soyut işlemler, Paylaşımlı Veri Bloğu olaylarını tanıtır ve değerlendirme anlambilimi ile bellek modelinin olay anlambilimi arasındaki arayüz görevi görür. Olaylar, bellek modelinin bir süzgeç olarak etki ettiği bir aday yürütme oluşturur. Tam anlambilim için lütfen bellek modeline başvurun.
Paylaşımlı Veri Bloğu olayları, bellek modelinde tanımlanan Record'lar ile modellenir.
Aşağıdaki soyut işlemler, bu belirtimde Data Block değerleri üzerinde işlem yapmak için kullanılır:
#6.2.9.1 CreateByteDataBlock ( size )
Soyut işlem CreateByteDataBlock, size (negatif olmayan bir tamsayı) argümanını alır ve ya bir Data Block içeren normal tamamlanma ya da bir throw tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Eğer size > 253 - 1 ise, bir RangeError kuraldışı durumu fırlat.
db, size bayttan oluşan yeni bir Data Block değeri olsun. Eğer böyle bir Data Block oluşturmak olanaksızsa, bir RangeError kuraldışı durumu fırlat.
db'nin tüm baytlarını 0 olarak ayarla.
db döndür.
#6.2.9.2 CreateSharedByteDataBlock ( size )
Soyut işlem CreateSharedByteDataBlock, size (negatif olmayan bir tamsayı) argümanını alır ve ya bir Shared Data Block içeren normal tamamlanma ya da bir throw tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
db, size bayttan oluşan yeni bir Shared Data Block değeri olsun. Eğer böyle bir Shared Data Block oluşturmak olanaksızsa, bir RangeError kuraldışı durumu fırlat.
agentRecord, çevreleyen etmenin Agent Record'ı olsun.
execution = agentRecord.[[CandidateExecution]] olsun.
eventsRecord, [[AgentSignifier]] değeri AgentSignifier() olan execution.[[EventsRecords]]'ın Agent Events Record'ı olsun.
zero = « 0 » olsun.
db'nin her index indisi için,
- eventsRecord.[[EventList]]'e WriteSharedMemory { [[Order]]:
init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: index, [[ElementSize]]: 1, [[Payload]]: zero } ekle.
db döndür.
#6.2.9.3 CopyDataBlockBytes ( toBlock, toIndex, fromBlock, fromIndex, count )
Soyut işlem CopyDataBlockBytes, toBlock (bir Data Block veya bir Shared Data Block), toIndex (negatif olmayan bir tamsayı), fromBlock (bir Data Block veya bir Shared Data Block), fromIndex (negatif olmayan bir tamsayı) ve count (negatif olmayan bir tamsayı) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:
Assert: fromBlock ve toBlock farklı değerlerdir.
fromSize, fromBlock'taki bayt sayısı olsun.
Assert: fromIndex + count ≤ fromSize.
toSize, toBlock'taki bayt sayısı olsun.
Assert: toIndex + count ≤ toSize.
count > 0 olduğu sürece tekrar et,
Eğer fromBlock bir Shared Data Block ise,
agentRecord, çevreleyen etmenin Agent Record'ı olsun.
execution = agentRecord.[[CandidateExecution]] olsun.
eventsRecord, [[AgentSignifier]] değeri AgentSignifier() olan execution.[[EventsRecords]]'ın Agent Events Record'ı olsun.
bytes, yegane öğesi, belirlenimci olmayan bir şekilde seçilmiş bir bayt değeri olan bir Liste olsun.
NOTE: Gerçekleştirimlerde, bytes, altta yatan donanım üzerindeki atomik olmayan bir okuma talimatının sonucudur. Belirlenimsizlik, zayıf tutarlılığa sahip donanımın gözlemlenebilir davranışını tanımlamak için bellek modelinin anlambilimsel bir reçetesidir.
readEvent, ReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 } olsun.
eventsRecord.[[EventList]]'e readEvent'i ekle.
execution.[[ChosenValues]]'a Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes } ekle.
Eğer toBlock bir Shared Data Block ise,
1. *eventsRecord*.*[[EventList]]*'e [WriteSharedMemory](30_sec-memory-model.md#sec-memory-model-fundamentals) { *[[Order]]*: `unordered`, *[[NoTear]]*: `true`, *[[Block]]*: *toBlock*, *[[ByteIndex]]*: *toIndex*, *[[ElementSize]]*: 1, *[[Payload]]*: *bytes* } ekle.
Değilse,
1. *toBlock*[*toIndex*]'i *bytes*[0] olarak ayarla.
Değilse,
Assert: toBlock bir Shared Data Block değildir.
toBlock[toIndex]'i fromBlock[fromIndex] olarak ayarla.
toIndex = toIndex + 1 olarak ayarla.
fromIndex = fromIndex + 1 olarak ayarla.
count = count - 1 olarak ayarla.
unused döndür.
#6.2.10 PrivateElement Belirtim Türü
PrivateElement türü, özel sınıf alanları, yöntemleri ve erişimcilerinin belirtiminde kullanılan bir Record'dır. Özel öğeler için Property Descriptor'ları kullanılmamakla birlikte, özel alanlar yapılandırılamaz, numaralandırılamaz, yazılabilir veri özelliklerine benzer davranır; özel yöntemler yapılandırılamaz, numaralandırılamaz, yazılamaz veri özelliklerine benzer davranır ve özel erişimciler yapılandırılamaz, numaralandırılamaz erişimci özelliklerine benzer davranır.
PrivateElement türünün değerleri, alanları Tablo 9 ile tanımlanan Record değerleridir. Bu tür değerler PrivateElement'ler olarak anılır.
Tablo 9: PrivateElement Alanları
| Alan Adı |
Bulunduğu [[Kind]] alanının değerleri |
Değer |
Anlamı |
| [[Key]] |
Tümü |
bir Private Name |
Alanın, yöntemin veya erişimcinin adı. |
| [[Kind]] |
Tümü |
field, method veya accessor |
Öğenin türü. |
| [[Value]] |
field ve method |
bir ECMAScript dil değeri |
Alanın değeri. |
| [[Get]] |
accessor |
bir işlev nesnesi veya undefined |
Özel erişimci için getter. |
| [[Set]] |
accessor |
bir işlev nesnesi veya undefined |
Özel erişimci için setter. |
#6.2.11 ClassFieldDefinition Record Belirtim Türü
ClassFieldDefinition türü, sınıf alanlarının belirtiminde kullanılan bir Record'dır.
ClassFieldDefinition türünün değerleri, alanları Tablo 10 ile tanımlanan Record değerleridir. Bu tür değerler ClassFieldDefinition Record'ları olarak anılır.
Tablo 10: ClassFieldDefinition Record Alanları
| Alan Adı |
Değer |
Anlamı |
| [[Name]] |
bir Private Name, bir String veya bir Symbol |
Alanın adı. |
| [[Initializer]] |
bir ECMAScript işlev nesnesi veya empty |
Alanın ilklendiricisi, varsa. |
#6.2.12 Özel Adlar
Private Name belirtim türü, özel bir sınıf öğesinin (alan, yöntem veya erişimci) anahtarını temsil eden küresel olarak benzersiz bir değeri (başka herhangi bir Private Name'den, aksi takdirde ayırt edilemez olsalar bile, farklı olan) tanımlamak için kullanılır. Her Private Name, bir String olan değiştirilemez bir [[Description]] iç yuvasına sahiptir. Bir Private Name, herhangi bir ECMAScript nesnesine PrivateFieldAdd veya PrivateMethodOrAccessorAdd ile yüklenebilir ve daha sonra PrivateGet ve PrivateSet kullanılarak okunabilir veya yazılabilir.
#6.2.13 ClassStaticBlockDefinition Record Belirtim Türü
Bir ClassStaticBlockDefinition Record, bir sınıf statik ilklendirme bloğu için yürütülebilir kodu kapsüllemek üzere kullanılan bir Record değeridir.
ClassStaticBlockDefinition Record'ları, Tablo 11'de listelenen alanlara sahiptir.
Tablo 11: ClassStaticBlockDefinition Record Alanları
| Alan Adı |
Değer |
Anlamı |
| [[BodyFunction]] |
bir ECMAScript işlev nesnesi |
Bir sınıfın statik ilklendirilmesi sırasında çağrılacak işlev nesnesi. |