Condividi tramite


Transmit_as e Represent_as

Transmit_as e represent_as condividono lo stesso layout, ad eccezione del token iniziale; il token legge FC_TRANSMIT_AS o FC_REPRESENT_AS, ma il codice sottostante è comune.

La descrizione ha il layout seguente:

FC_TRANSMIT_AS | FC_REPRESENT_AS
flags<1>
quintuple_index<2>
presented_type_memory_size<2>
transmitted_type_buffer_size<2>
transmitted_type_offset<2>

I flag<1> byte sono costituiti dalla nibble del flag superiore e dalla nibble di allineamento inferiore.

La nibble di allineamento mantiene l'allineamento del filo del tipo trasmesso. Questa operazione è necessaria quando si ridimensiona il buffer e si usano le dimensioni del tipo trasmesse dal codice di formato.

Il flag nibble può avere i flag seguenti:

#define PRESENTED_TYPE_IS_ARRAY     0x10
#define PRESENTED_TYPE_ALIGN_4      0x20
#define PRESENTED_TYPE_ALIGN_8      0x40

Il flag PRESENTED_TYPE_IS_ARRAY contrassegna un argomento di trasmissione di primo livello come (o rappresenta come) come matrice di qualcosa e passato per valore. L'interprete –Oi usa questo flag per eseguire un'istruzione di questo tipo di argomento (che in realtà è un puntatore nello stack, non la matrice). Gli altri due flag vengono usati anche solo negli interpreti precedenti per eseguire correttamente il passaggio su un tipo presentato nello stack.

L'quintuple_index<2> è un indice della routine di callback quintuple (in realtà è un'autentica) di funzioni. La tabella è comune sia per trasmettere come che per rappresentare come e esiste un mapping ovvio per la posizione delle routine, come lo stesso servizio di punti di ingresso trasmesso come e rappresenta come codici. Il mapping è from_local => to_xmit, to_local => from_xmit, free_inst => free_xmit, free_local => free_inst.

Il presented_type_memory_size<2> fornisce sempre una dimensione per il tipo presentato/locale, incluso il tipo sconosciuto rappresenta come tipi.

Il transmitted_type_buffer_size<2> è zero, quando la dimensione è variabile o la dimensione fissa effettiva. Si tratta di un'ottimizzazione che consente di ignorare alcuni callback durante il ridimensionamento del buffer.

Il transmitted_type_offset<2> è l'offset di tipo relativo consueto alla stringa di formato del tipo trasmesso.