15

Flash Player 10 中添加了对泛型的支持(目前只有Vector.<*>,并且被 Adob​​e 称为“后缀类型参数”),但唯一的AVM2 文档没有描述如何访问这些对象。

具体来说,我注意到一个新的操作码 (0x53) 和一个新的多名称类型 (0x1D) 似乎相关,但它们的用法没有记录。

注意:这个问题是用已知的答案创建的,因为在这里比在我的博客或 Adob​​e Bug DB 上更容易找到。

4

1 回答 1

21

我在这方面所做的逆向工程工作不包括声明您自己的泛型类型,尽管这很有可能。

对声明(无参数)泛型类型(Vector)的引用是通过常规限定名称进行的(尽管任何多名称都应该这样做)。

对类型化泛型类型(Vector.<int> 与 Vector.<> 相对)的引用是由一种新的多名称类型 (0x1D) 进行的,我称之为 GenericName。GenericName 的格式如下:

[Kind] [TypeDefinition] [ParamCount] [Param1] [Param2] [ParamN]

在哪里:

  • [TypeDefinition] 是一个 U30 入多名表
  • [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> 的实例

于 2009-02-16T14:24:49.400 回答