支持泛型(目前只有
Vector.<*>,Adobe称之为“后缀类型参数”)被添加到Flash Player 10中,但唯一的
AVM2 documentation没有描述如何访问这些对象.
具体来说,我注意到一个新的操作码(0x53)和一个新的多媒体类(0x1D)似乎相关,但它们的用法没有记录.
注意:这个问题是用已知的答案创建的,因为它比我的博客或Adobe Bug DB更容易找到.
解决方法
我所做的逆向工程工作并不包括声明自己的通用类型,尽管这很可能.
声明(无参数)泛型类型(Vector)的引用通过常规限定名(通过任何多任务应该执行)来进行.
引用类型通用类型(Vector.< int>而不是Vector.)是由一个新的多媒体类(0x1D),我称之为GenericName. GenericName具有如下格式:
[Kind] [TypeDefinition] [ParamCount] [Param1] [Param2] [ParamN]
哪里:
> [TypeDefinition]是一个U30到multiname表
> [ParamCount]是U8(U30?)有多少个类型参数
> [ParamX]是一个U30进入多任务表.
显然泛型似乎一般不被支持,因此ParamCount将始终为1(对于Vector.< *>).
另一个有趣的事情是如何创建类的实例.在Flash 10(0x53)中添加了一个新的操作码,我将调用MakeGenericType. MakeGenericType使用以下堆栈声明:
TypeDefinition,ParameterType1,ParameterTypeN -> GenericType
它还有一个参数,U8(U30?)指定堆栈中有多少个参数.通常会看到MakeGenericType被使用如下:
GetLex [TypeDefinitionMultiname] GetLex [ParameterTypeMultiname] MakeGeneric [ParamCount] Coerce [GenericNameMultiname] Construct [ConstructorParamCount]
所以如果你有以下的…
GetLex __AS3__.vec::Vector GetLex int MakeGeneric 1 Coerce __AS3__.vec::Vector.<int> Construct 0
你现在将有一个Vector的实例.< int>