FIDL 词典

本文档定义了在 FIDL 中具有特定含义的一般术语 上下文。如需详细了解具体的 FIDL 主题,请参阅 FIDL traihead

类型、布局、约束条件

类型用于对 FIDL 类型系统中的值进行分类。类型会显示在 FIDL 语法中定义的 type-constructor 位置。例如: uint32string:10vector<bool> 是类型。

布局是类型的可参数化描述。它不是指 但表示的是通过实例化 零个或零个以上布局参数的布局。例如,vector 是 一个布局,它接受一个布局参数,例如 vector<bool> 本身的类型, 类型。再举一例,array 就是一个布局,它接受两个布局参数: 例如 array<bool, 3>

布局和类型之间的区别可能并不明显。例如,语句 上面的 uint32 是一个类型并不严格正确。相反,它是一个布局, 采用零参数,不同于通过将其实例化获得的类型。 FIDL 语法无法体现这种区别,因此在uint32 类型位置(例如 alias uint = uint32;),实际上就是引用布局。 uint32 并使用零布局参数隐式实例化它。

限制条件将类型限制为仅允许满足谓词的值。 例如,类型 string:10 约束条件为 length <= 10 缩写 为 10,表示字符串长度不能超过 10 个字节。

布局和布局参数会影响字节在 FIDL 线中的布局方式 格式,而限制条件会影响验证,这会限制 (请参阅 RFC-050 了解详情)。 从语法上讲,布局参数只能应用于布局,并且约束条件 只能应用于类型。例如:

alias Bools = vector<bool>;       // ok: layout parameter applied to layout
alias MaxTenBools = Bools:10;     // ok: constraint applied to type
alias MaxTenBytes = Bools<byte>;  // INVALID: layout parameter applied to type
alias MaxTen = vector:10;         // INVALID: constraint applied to layout

类型实例化的一般形式是

L<L_1, L_2, ..., L_n>:<C_1, C_2, ..., C_n>

其中 L 是布局,L_1L_n 是布局参数,C_1C_n 都是约束条件。

成员、字段、变体

声明的成员是属于某个 声明,即由零个、一个或多个成员组成。

Mode 位声明为例:

type Mode = strict bits {
    READ = 1;
    WRITE = 2;
};

READWRITE 都是成员。

在引用结构体或表的成员时,我们可以更具体地引用 作为字段提供给这些成员。

在提到联盟成员时,我们可以更具体地指代这些成员 成员作为变体

Command 联合声明为例:

type Command = strict union {
    1: create_resource CreateResource;
    2: release_resource ReleaseResource;
};

这两个变体为 create_resourcerelease_resource

此外,并集实例的选定变体是当前的 获取该集合的权重值。

标记和序数

标记是目标语言变体判别器,即 结构体采用目标语言,该结构用于指明 并集思广益例如,对于 Command 并集:

enum CommandTag {
    Create,
    Release,
}

interface Command {
    tag: CommandTag,
    data: CreateResource | ReleaseResource,
}

Command 的标记是 Command.tag,类型为 CommandTag。实际 表示 Command 各个变体的值和类型不得超过 实施。

请注意,某些语言不需要使用 标记。例如,某些语言会使用 模式匹配到并集变体上的分支,而不是 明确标记值。

ordinal 是线上变体判别器,即用于 以 FIDL 线缆格式表示并集的变体。通过 序数在 FIDL 定义中明确指定(在此示例中,1 表示 create_resource 和 2 表示 release_resource)。

编码

编码是指将目标语言的值序列化为 FIDL 传输格式。

对于 C 系列绑定(HLCPP、LLPP),编码可能具有更具体的 表示获取与 FIDL 有线格式布局匹配的字节并进行修补 指针和句柄 FIDL_ALLOC_PRESENT/FIDL_ALLOC_ABSENTFIDL_HANDLE_PRESENT/FIDL_HANDLE_ABSENT 就位,正在将手柄移动到 带外句柄表。

解码

解码是指将 将 FIDL 传输格式转换为目标语言的值。

对于 C 系列绑定(HLCPP、LLPP),解码可能具有更具体的 表示获取与 FIDL 有线格式布局匹配的字节并进行修补 (通过替换 FIDL_ALLOC_PRESENT/FIDL_ALLOC_ABSENTFIDL_HANDLE_PRESENT/FIDL_HANDLE_ABSENT,具有“真实”指针/手柄 值,请将标识名移出带外标识名表。

验证

验证是检查是否符合 FIDL 定义中的限制条件的过程 条件满足条件。在对值进行编码时,验证都会进行 发送之前,或者在接收值后对值进行解码时。示例 约束条件包括矢量边界、手柄约束条件,以及 编码为 UTF-8。

如果验证失败,绑定会通过以下任一方式向用户显示错误 直接返回或通过错误回调返回。

结果/错误类型

对于指定了错误类型的方法:

DoWork() -> (struct { result Data; }) error uint32

结果类型是指 (即由任意一个 Datauint32 错误。在本例中,错误类型为 uint32,而 Data 可以称为响应类型,也可以称为成功类型。