私がこれに対して行ったリバースエンジニアリング作業には、独自のジェネリック型の宣言は含まれていませんでしたが、可能性は非常に高いです。
宣言する(パラメーターのない)ジェネリック型(Vector)への参照は、通常の修飾名を介して行われます(ただし、任意のマルチネームで行う必要があります)。
型付きジェネリック型(Vector。<>ではなくVector。<int>)への参照は、GenericNameと呼ばれる新しいマルチネームの種類(0x1D)によって行われます。GenericNameの形式は次のようになります。
[Kind] [TypeDefinition] [ParamCount] [Param1] [Param2] [ParamN]
どこ:
- [TypeDefinition]はマルチネームテーブルへのU30です
- [ParamCount]は、型パラメーターがいくつあるかを示すU8(U30?)です。
- [ParamX]はマルチネームテーブルへのU30です。
明らかに、ジェネリックはまだ一般的にサポートされていないため、ParamCountは常に1になります(Vector。<*>の場合)。
もう1つの興味深い点は、クラスのインスタンスがどのように作成されるかです。新しいオペコードがFlash10(0x53)に追加されました。これを、MakeGenericTypeと呼びます。MakeGenericTypeは、次のスタックで宣言されています。
TypeDefinition, ParameterType1, ParameterTypeN -> GenericType
また、スタックにあるパラメーターの数を指定するU8(U30?)という1つのパラメーターもあります。通常、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>のインスタンスが作成されます。