15

ジェネリックスのサポート(現在はVector。<*>のみで、Adobeでは「postfixtypeparameters」と呼ばれます)がFlash Player 10で追加されましたが、AVM2のドキュメントのみがこれらのオブジェクトへのアクセス方法を説明していません。

具体的には、新しいオペコード(0x53)と新しいマルチネームの種類(0x1D)が関連しているように見えますが、それらの使用法は文書化されていません。

注意:この質問は、私のブログやAdobe Bug DBよりも簡単に見つけられるため、すでに知られている回答を使用して作成されました。

4

1 に答える 1

21

私がこれに対して行ったリバースエンジニアリング作業には、独自のジェネリック型の宣言は含まれていませんでしたが、可能性は非常に高いです。

宣言する(パラメーターのない)ジェネリック型(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>のインスタンスが作成されます。

于 2009-02-16T14:24:49.400 に答える