Flash Player 10 中添加了对泛型的支持(目前只有Vector.<*>,并且被 Adobe 称为“后缀类型参数”),但唯一的AVM2 文档没有描述如何访问这些对象。
具体来说,我注意到一个新的操作码 (0x53) 和一个新的多名称类型 (0x1D) 似乎相关,但它们的用法没有记录。
注意:这个问题是用已知的答案创建的,因为在这里比在我的博客或 Adobe Bug DB 上更容易找到。
Flash Player 10 中添加了对泛型的支持(目前只有Vector.<*>,并且被 Adobe 称为“后缀类型参数”),但唯一的AVM2 文档没有描述如何访问这些对象。
具体来说,我注意到一个新的操作码 (0x53) 和一个新的多名称类型 (0x1D) 似乎相关,但它们的用法没有记录。
注意:这个问题是用已知的答案创建的,因为在这里比在我的博客或 Adobe Bug DB 上更容易找到。
我在这方面所做的逆向工程工作不包括声明您自己的泛型类型,尽管这很有可能。
对声明(无参数)泛型类型(Vector)的引用是通过常规限定名称进行的(尽管任何多名称都应该这样做)。
对类型化泛型类型(Vector.<int> 与 Vector.<> 相对)的引用是由一种新的多名称类型 (0x1D) 进行的,我称之为 GenericName。GenericName 的格式如下:
[Kind] [TypeDefinition] [ParamCount] [Param1] [Param2] [ParamN]
在哪里:
显然,泛型通常还不被支持,所以 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> 的实例