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>
me gusta mucho conocer detalles internos de AS3/AVM2. ¡Gracias por compartir esto! – yuku
Eres maravilloso. Gracias. –
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 –