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 использует этот флаг для шага по такому аргументу (который фактически является указателем на стек, а не массив). Остальные два флага также используются только в предыдущих интерпретаторах для правильного шага над представленным типом в стеке.
Quintuple_index<2> является индексом подпрограммы обратного вызова (это фактически четверо) функций. Таблица распространена как для передачи, так и представления, и существует очевидное сопоставление для положения подпрограмм, так как одна и та же служба точек входа передает как и представляет коды. Сопоставление равно from_local => to_xmit, to_local => from_xmit, free_inst => free_xmit, free_local => free_inst.
Presented_type_memory_size<2> всегда предоставляет размер представленного или локального типа, включая неизвестные типы.
Transmitted_type_buffer_size<2> равно нулю, если размер меняется или фактический фиксированный размер. Это оптимизация, которая позволяет пропускать некоторые обратные вызовы при изменении размера буфера.
Transmitted_type_offset<2> — это обычное смещение относительного типа в строку формата переданного типа.