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>
Nguồn
2009-02-16 14:24:49
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
Bạn thật tuyệt vời. Cảm ơn bạn. –
Đâ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 –