flex – 泛型(Vector)如何在AVM内部工作?

支持泛型(目前只有 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>

相关文章
相关标签/搜索