2009-02-16 18 views
14

Soporte para genéricos (actualmente sólo Vector.<*>, y llamados 'parámetros de tipo de sufijo' por Adobe) en Flash Player 10, pero la única AVM2 documentation no describe cómo se accede a estos objetos.¿Cómo funcionan los genéricos (Vector) dentro del AVM? se añadió

Específicamente, me di cuenta de un nuevo código de operación (0x53) y un nuevo tipo multiname (0x1D) que parecen relevantes, pero su uso no está documentada.

NB: Esta pregunta se ha creado con la respuesta ya conocida, ya que se puede encontrar más fácilmente aquí que en mi blog o Adobe Bug DB.

Respuesta

20

El trabajo de ingeniería inversa que hice en esto no incluyó la declaración de sus propios tipos genéricos, aunque es muy posible.

Las referencias al tipo declarando (sin parámetros) genérico (vector) se realizan a través de un nombre cualificado regulares (aunque cualquier multiname debe hacer).

Las referencias a un tipo genérico tipeado (Vector < int> a diferencia del Vector <>) están hechas por un nuevo tipo de multiname (0x1D), al que llamo GenericName. GenericName tiene un formato de esta manera:

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

Dónde:

  • [TypeDefinition] es un U30 en la tabla multiname
  • [ParamCount] es un U8 (U30?) De cuántos parámetros de tipo hay
  • [ParamX] es un U30 en la tabla de la multinacional.

Obviamente los genéricos no son compatibles en general, sin embargo, por lo que siempre será ParamCount 1 (por vector. < *>).

La otra cosa interesante es cómo se crean instancias de la clase. Se agregó un nuevo código de operación en Flash 10 (0x53), que llamaré MakeGenericType. MakeGenericType se declara con la pila siguiente:

TypeDefinition, ParameterType1, ParameterTypeN -> GenericType 

También tiene un parámetro, un U8 (U30?) Que especifica el número de parámetros en la pila. Por lo general, ver MakeGenericType siendo utilizado como esto:

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

Así que si usted tenía la siguiente ...

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

ahora tendría una instancia de Vector. < int>

+2

me gusta mucho conocer detalles internos de AS3/AVM2. ¡Gracias por compartir esto! – yuku

+0

Eres maravilloso. Gracias. –

+1

Aquí hay un enlace a un PDF con códigos de operación 0x35-0x38, 0x3a-0x3e, 0x50-0x52 - estos eran nuevos para el proyecto "Alchemy". Sé que existe 0x39 y parece consumir un valor entero de la pila, pero no sé lo que podría hacer. Enlace: http://llvm.org/devmtg/2008-08/Petersen_FlashCCompiler.pdf –

Cuestiones relacionadas