2009-02-16 17 views
14

Hỗ trợ cho generics (hiện tại chỉ Vector.<*> và được gọi là 'tham số kiểu postfix' của Adobe) đã được thêm vào Flash Player 10, nhưng chỉ AVM2 documentation không mô tả cách thức các đối tượng này được truy cập.Làm thế nào để generics (Vector) làm việc bên trong AVM?

Cụ thể, tôi nhận thấy một mã vạch mới (0x53) và một loại đa quốc gia mới (0x1D) có vẻ phù hợp, nhưng cách sử dụng của chúng không được ghi lại.

NB: Câu hỏi này được tạo bằng câu trả lời đã được biết đến vì nó dễ tìm thấy ở đây hơn là trên blog của tôi hoặc Adobe Bug DB.

Trả lời

20

Công việc kỹ thuật đảo ngược mà tôi đã thực hiện trên điều này không bao gồm việc khai báo các loại chung của riêng bạn, mặc dù rất có khả năng.

Tham chiếu đến loại generic (không có tham số) khai báo (Vector) được thực hiện thông qua một tên đủ điều kiện thông thường (mặc dù bất kỳ tên đa quốc gia nào cũng nên làm).

Tham chiếu đến loại chung được nhập (Vector. < int> như trái ngược với Vector. <>) được tạo bởi loại đa mới (0x1D), mà tôi gọi GenericName. GenericName có định dạng như sau:

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

đâu:

  • [TypeDefinition] là một U30 vào bảng multiname
  • [ParamCount] là một U8 (U30?) Có bao nhiêu tham số kiểu có
  • [ParamX] là U30 trong bảng đa danh.

Rõ ràng generics thường không được hỗ trợ, vì vậy ParamCount sẽ luôn là 1 (đối với Vector. < *>).

Điều thú vị khác là cách các phiên bản của lớp được tạo. Một opcode mới đã được thêm vào trong Flash 10 (0x53), mà tôi sẽ gọi MakeGenericType. MakeGenericType được khai báo với chồng sau:

TypeDefinition, ParameterType1, ParameterTypeN -> GenericType 

Nó cũng có một tham số, một U8 (U30?) Xác định có bao nhiêu thông số trên stack. Bạn thường sẽ thấy MakeGenericType đang được sử dụng như thế này:

GetLex [TypeDefinitionMultiname] 
GetLex [ParameterTypeMultiname] 
MakeGeneric [ParamCount] 
Coerce [GenericNameMultiname] 
Construct [ConstructorParamCount] 

Vì vậy, nếu bạn đã có sau ...

GetLex __AS3__.vec::Vector 
GetLex int 
MakeGeneric 1 
Coerce __AS3__.vec::Vector.<int> 
Construct 0 

Bây giờ bạn sẽ có một thể hiện của Vector. < int>

+2

Tôi thực sự thích biết nội bộ của as3/avm2. Cảm ơn bạn đã chia sẻ điều này! – yuku

+0

Bạn thật tuyệt vời. Cảm ơn bạn. –

+1

Đây là một liên kết tới một tệp PDF có mã opcodes 0x35-0x38, 0x3a-0x3e, 0x50-0x52 - đây là liên kết mới cho dự án "giả kim thuật". Tôi biết rằng 0x39 tồn tại và nó xuất hiện để tiêu thụ một giá trị số nguyên ra khỏi ngăn xếp, nhưng tôi không biết những gì nó có thể làm. Liên kết: http://llvm.org/devmtg/2008-08/Petersen_FlashCCompiler.pdf –

Các vấn đề liên quan