2009-02-16 21 views
14

Generikler için destek (şu an için yalnızca Adobe tarafından Vector.<*> adı verilen ve 'postfix type parameters') Flash Player 10'a eklenmiştir, ancak yalnızca AVM2 documentation bu nesnelere nasıl erişildiğini açıklamamaktadır.Jenerikler (Vector) AVM içinde nasıl çalışır?

Özellikle, alakalı görünen yeni bir opcode (0x53) ve yeni bir çok işlevli tür (0x1D) fark ettim, ancak bunların kullanımı belgelenmiyor.

NB: Bu soru, blogumda veya Adobe Bug DB'sinde olduğundan daha kolay bulunduğu için zaten bilinen yanıtla oluşturuldu.

cevap

20

Bu konuda yaptığım ters mühendislik çalışmaları, kendi genel türlerini bildirmeyi içermiyordu, ancak bu mümkün olabilir.

Bildiri (parametresiz) jenerik türüne (Vector) yapılan başvurular, düzenli bir adla yapılır (herhangi bir multiname yapmalıdır).

Yazılan bir jenerik türüne yapılan başvurular (Vector. < int>, Vector. <> gibi), GenericName adını verdiğim yeni bir çok-isim türüyle (0x1D) yapılır.

  • [TypeDefinition]
  • [paramCount] Bir U8 (? U30) kaç tip parametrelerin olduğu multiname tabloya bir U30 geçerli:

    [Kind] [TypeDefinition] [ParamCount] [Param1] [Param2] [ParamN] 
    

    : GenericName şöyle bir biçimdedir

  • [ParamX] bir U30'dur ve çoklu isim tablosuna girer.

Açıkçası, jenerikler henüz desteklenmemektedir, bu yüzden ParamCount her zaman 1 (Vector için. < *>) olacaktır.

Diğer ilginç şey, sınıfın örneklerinin nasıl oluşturulduğudur. Flash 10'a (0x53) yeni bir işlem kodu eklendi, ki buna MakeGenericType adını vereceğim. MakeGenericType aşağıdaki yığını ile ilan edilir:

TypeDefinition, ParameterType1, ParameterTypeN -> GenericType 

Ayrıca sayıda parametre yığına üzerinde nasıl kullanılacağını belirterek bir parametre, bir U8 (U30?) Sahiptir. Genellikle MakeGenericType böyle kullanılıyor göreceksiniz: Artık Vector örneği olurdu

GetLex __AS3__.vec::Vector 
GetLex int 
MakeGeneric 1 
Coerce __AS3__.vec::Vector.<int> 
Construct 0 

sen olsaydı Yani şu

GetLex [TypeDefinitionMultiname] 
GetLex [ParameterTypeMultiname] 
MakeGeneric [ParamCount] 
Coerce [GenericNameMultiname] 
Construct [ConstructorParamCount] 

.... < int>

+2

As3/avm2'nin dahili bilgisini bilmek gerçekten hoşuma gidiyor. Bunu paylaştığın için teşekkürler! – yuku

+0

Sen harikasın. Teşekkür ederim. –

+1

Burada, "simya" projesi için yeni olan 0x32-0x38, 0x3a-0x3e, 0x50-0x52 opcodes içeren bir PDF bağlantısı bulunmaktadır. 0x39'un var olduğunu biliyorum ve yığından bir tamsayı değeri tüketiyor gibi görünüyor, ancak ne yapabileceğini bilmiyorum. Link: http://llvm.org/devmtg/2008-08/Petersen_FlashCCompiler.pdf –