Transmit_asとRepresent_as

Transmit_asとrepresent_asは、先頭のトークンを除き、同じレイアウトを共有します。トークンはFC_TRANSMIT_ASまたはFC_REPRESENT_ASを読み取りますが、基になるコードは一般的です。

説明のレイアウトは次のとおりです。

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>

フラグ<1> バイトは、上位フラグニブルと下位アラインメントニブルで構成されます。

アラインメントニブルは、送信されたタイプのワイヤアラインメントを維持します。 これは、バッファーのサイズを変更し、フォーマット コードから送信された型サイズを使用する場合に必要です。

フラグニブルには、次のフラグを含めることができます。

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

PRESENTED_TYPE_IS_ARRAY フラグは、最上位レベルの送信を引数としてマーク (またはとして表します) が何かの配列であり、渡された値としてマークされます。 –Oi インタープリターは、このフラグを使用して、このような引数をステップオーバーします (実際には配列ではなく、スタック上のポインターです)。 他の 2 つのフラグは、スタック上の提示された型を正しくステップ実行するために、前のインタープリターでのみ使用されます。

quintuple_index<2> は、コールバック ルーチンの 5 分の 1 (これは実際には 4 倍) の関数のインデックスです。 テーブルは として送信され、 として表されるのが一般的であり、同じエントリ ポイント サービスがコードとして送信およびコードとして表すので、ルーチンの位置に対する明らかなマッピングがあります。 マッピングは、from_local => to_xmit、to_local => from_xmit、free_inst => free_xmit、free_local => free_instです。

presented_type_memory_size<2> は、常に、表示される/ローカル型のサイズを提供します。たとえば、unknown は型として表されます。

transmitted_type_buffer_size<2> は、サイズが変化している場合は 0 か、実際の固定サイズです。 これは、バッファーのサイズを変更するときにコールバックをスキップできるようにする最適化です。

transmitted_type_offset<2> は、送信される型書式指定文字列に対する通常の相対型オフセットです。