代码之家  ›  专栏  ›  技术社区  ›  Richard Szalay

泛型(向量)如何在AVM中工作?

  •  14
  • Richard Szalay  · 技术社区  · 17 年前

    对泛型的支持(目前仅限于 Vector.<*> ,并被Adobe称为“后缀类型参数”)添加到Flash Player 10中,但 AVM2 documentation 不描述如何访问这些对象。

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

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

    1 回复  |  直到 15 年前
        1
  •  21
  •   Richard Szalay    17 年前

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

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

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

    哪里:

    • [TypeDefinition]是多名称表中的U30
    • [ParamCount]是有多少类型参数的U8(U30?)
    • [ParamX]是多名称表中的U30。

    显然,一般还不支持泛型,因此ParamCount将始终为1(对于Vector<*>)。

    另一件有趣的事情是如何创建类的实例。Flash10中添加了一个新的操作码(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
    

    推荐文章