2009-02-16 10 views
14

Il supporto per i generici (attualmente solo Vector.<*> e denominato 'parametri di tipo postfix' di Adobe) è stato aggiunto in Flash Player 10, ma l'unico AVM2 documentation non descrive come si accede a questi oggetti.In che modo generici (Vector) funzionano all'interno dell'AVM?

In particolare, ho notato un nuovo codice operativo (0x53) e un nuovo tipo di multiname (0x1D) che sembrano pertinenti, ma il loro utilizzo non è documentato.

NB: Questa domanda è stata creata con la risposta già nota in quanto è più facilmente reperibile qui che sul mio blog o sul DB di Adobe.

risposta

20

Il lavoro di reverse engineering ho fatto su questo non includono dichiarando i propri tipi generici, anche se è molto probabile possibile.

I riferimenti al tipo generico dichiarante (senza parametri) (Vettore) vengono effettuati tramite un nome qualificato normale (sebbene qualsiasi multiname dovrebbe fare).

I riferimenti a un tipo generico digitato (Vettore < int> contrapposto a Vector. <>) sono creati da un nuovo tipo di multiname (0x1D), che io chiamo GenericName. GenericName ha un formato in questo modo:

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

Dove:

  • [TypeDefinition] è un U30 nella tabella multiname
  • [ParamCount] è un U8 (U30?) Di come molti parametri di tipo ci sono
  • [ParamX] è un U30 nella tabella multiname.

Ovviamente i farmaci generici non sono generalmente ancora supportato, in modo ParamCount sarà sempre 1 (per vettore. < *>).

L'altra cosa interessante è come vengono create le istanze della classe. È stato aggiunto un nuovo codice operativo in Flash 10 (0x53), che chiamerò MakeGenericType. MakeGenericType è dichiarata con il seguente stack:

TypeDefinition, ParameterType1, ParameterTypeN -> GenericType 

Essa ha anche un parametro, un U8 (U30?) Specificando il numero di parametri sono in pila. È generalmente vedere MakeGenericType in uso in questo modo:

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

Quindi, se si ha la seguente ...

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

Si dovrebbe ora avere un'istanza di vettore. < int>

+2

Mi piace molto conoscere gli interni di as3/avm2. Grazie per aver condiviso questo! – yuku

+0

Sei meraviglioso. Grazie. –

+1

Ecco un link a un PDF con codici 0x35-0x38, 0x3a-0x3e, 0x50-0x52 - questi erano nuovi per il progetto "alchemy". So che 0x39 esiste e sembra consumare un valore intero fuori dallo stack, ma non so cosa potrebbe fare. Link: http://llvm.org/devmtg/2008-08/Petersen_FlashCCompiler.pdf –

Problemi correlati