加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 02:15:06 所属栏目:百科 来源:网络整理
导读:支持泛型(目前只有 Vector.*,Adobe称之为“后缀类型参数”)被添加到Flash Player 10中,但唯一的 AVM2 documentation没有描述如何访问这些对象. 具体来说,我注意到一个新的操作码(0x53)和一个新的多媒体类(0x1D)似乎相关,但它们的用法没有记录. 注意:这个问
支持泛型(目前只有 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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读