本文档定义了在 FIDL 中具有特定含义的一般术语 上下文。如需详细了解具体的 FIDL 主题,请参阅 FIDL traihead。
类型、布局、约束条件
类型用于对 FIDL 类型系统中的值进行分类。类型会显示在
FIDL 语法中定义的 type-constructor
位置。例如:
uint32
、string:10
和 vector<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_1
到 L_n
是布局参数,C_1
到 C_n
都是约束条件。
成员、字段、变体
声明的成员是属于某个 声明,即由零个、一个或多个成员组成。
以 Mode
位声明为例:
type Mode = strict bits {
READ = 1;
WRITE = 2;
};
READ
和 WRITE
都是成员。
在引用结构体或表的成员时,我们可以更具体地引用 作为字段提供给这些成员。
在提到联盟成员时,我们可以更具体地指代这些成员 成员作为变体。
以 Command
联合声明为例:
type Command = strict union {
1: create_resource CreateResource;
2: release_resource ReleaseResource;
};
这两个变体为 create_resource
和 release_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_ABSENT
或
FIDL_HANDLE_PRESENT
/FIDL_HANDLE_ABSENT
就位,正在将手柄移动到
带外句柄表。
解码
解码是指将 将 FIDL 传输格式转换为目标语言的值。
对于 C 系列绑定(HLCPP、LLPP),解码可能具有更具体的
表示获取与 FIDL 有线格式布局匹配的字节并进行修补
(通过替换 FIDL_ALLOC_PRESENT
/FIDL_ALLOC_ABSENT
或
FIDL_HANDLE_PRESENT
/FIDL_HANDLE_ABSENT
,具有“真实”指针/手柄
值,请将标识名移出带外标识名表。
验证
验证是检查是否符合 FIDL 定义中的限制条件的过程 条件满足条件。在对值进行编码时,验证都会进行 发送之前,或者在接收值后对值进行解码时。示例 约束条件包括矢量边界、手柄约束条件,以及 编码为 UTF-8。
如果验证失败,绑定会通过以下任一方式向用户显示错误 直接返回或通过错误回调返回。
结果/错误类型
对于指定了错误类型的方法:
DoWork() -> (struct { result Data; }) error uint32
结果类型是指
(即由任意一个
Data
或 uint32
错误。在本例中,错误类型为 uint32
,而
Data
可以称为响应类型,也可以称为成功类型。