flex - ¿Cómo funcionan los genéricos(Vector) dentro del AVM?
generics avm2 (1)
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 genérico de declaración (sin parámetros) (Vector) se realizan a través de un nombre calificado habitual (aunque cualquier multinacional debería hacerlo).
Las referencias a un tipo genérico tipeado (Vector. <Int> en oposición a Vector. <>) Están hechas por un nuevo tipo de multiname (0x1D), que llamo GenericName. GenericName tiene un formato como ese:
[Kind] [TypeDefinition] [ParamCount] [Param1] [Param2] [ParamN]
Dónde:
- [TypeDefinition] es un U30 en la tabla de la multinacional
- [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 generalmente no son aún compatibles, por lo que ParamCount siempre será 1 (para Vector. <*>).
El otro aspecto 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 siguiente pila:
TypeDefinition, ParameterType1, ParameterTypeN -> GenericType
También tiene un parámetro, un U8 (U30?) Que especifica cuántos parámetros hay en la pila. Generalmente verás que MakeGenericType se usa así:
GetLex [TypeDefinitionMultiname]
GetLex [ParameterTypeMultiname]
MakeGeneric [ParamCount]
Coerce [GenericNameMultiname]
Construct [ConstructorParamCount]
Entonces, si tuvieras lo siguiente ...
GetLex __AS3__.vec::Vector
GetLex int
MakeGeneric 1
Coerce __AS3__.vec::Vector.<int>
Construct 0
Ahora tendría una instancia de Vector. <Int>
El soporte para genéricos (actualmente solo Vector. <*> , Y llamados ''parámetros de tipo postfix'' por Adobe) se agregó en Flash Player 10, pero la única documentación de AVM2 no describe cómo se accede a estos objetos.
Específicamente, noté un nuevo opcode (0x53) y un nuevo tipo de multiname (0x1D) que parecen relevantes, pero su uso no está documentado.
NB: esta pregunta se creó con la respuesta ya conocida, ya que se puede encontrar más fácilmente aquí que en mi blog o Adobe Bug DB.