内容

名称

ExtUtils::Constant::Base - ExtUtils::Constant 对象的基类

概要

require ExtUtils::Constant::Base;
@ISA = 'ExtUtils::Constant::Base';

描述

ExtUtils::Constant::Base 提供了生成 C 代码的基类实现,以便通过命名字符串快速查找常量值。目前它主要用于 ExtUtils::Constant::XS,它为许多 XS 模块中找到的 constant() 子例程生成查找代码。

用法

ExtUtils::Constant::Base 不导出任何子例程。以下方法可用

一个返回标量的方法,包含所需的定义,通常用于 C 头文件。

memEQ_clause args_hashref

一个返回适合的 C if 语句的方法,用于检查name是否等于 C 变量name。如果定义了checked_at,则使用它来避免对短名称使用memEQ,或生成注释以突出显示switch语句中字符的位置。

如果i<checked_at>是标量的引用,则它会给出在开头预先检查的字符(以及 C 变量名称已提前的字符数。这些需要从name的前面切除)。

dump_names arg_hashref, ITEM...

一个内部函数,用于生成将重新生成常量子例程的嵌入式 perl 代码。default_typetypesITEM与 C_constant 相同。indent被视为缩进的空格数。如果declare_types为真,则在生成的 perl 代码中始终声明$types,如果定义为假则从不声明,如果未定义,则仅当types中传递的值无法从default_typesITEM中推断出来时才声明$types

assign arg_hashref, VALUE...

一个返回适合的赋值子句的方法。如果type是聚合(例如PVN期望指针和长度),则应该有多个VALUE用于组件。如果定义了prepost,则给出 C 代码片段以在赋值之前和之后执行。pre将在块的开头,因此可以在其中定义变量。

return_clause arg_hashref, ITEM

一个返回适合的#ifdef子句的方法。ITEM是一个哈希引用(如传递给C_constantmatch_clause)。indent是缩进的空格数,默认为 6。

switch_clause arg_hashref, NAMELEN, ITEMHASH, ITEM...

一个内部方法,用于生成适合的switch子句,由C_constant调用。ITEMC_constant描述中给出的哈希引用格式给出,并且必须都具有相同长度的名称,由NAMELEN给出。ITEMHASH是对哈希的引用,以名称为键,值为ITEM列表中的哈希引用。(没有参数被修改,并且ITEMHASH中可以存在不在ITEM列表中的键,而不会导致问题 - 哈希被传递进来以节省为每次调用重新生成它)。

params WHAT

一个“内部”方法,可能会发生变化,目前被调用以允许覆盖类缓存信息,这些信息随后将被传递到所有*param*调用中。(是的,必须阅读源代码才能理解这一点被认为是一个已知错误)。WHAT 是一个哈希引用,表示常量函数将返回的类型。在 ExtUtils::Constant::XS 中,此方法用于返回一个以 IV NV PV SV 为键的哈希引用,以显示在由 C_constant_other_params_definition 和 C_constant_other_params 生成的 C 参数列表中需要哪种指针组合。

dogfood arg_hashref, ITEM...

一个内部函数,用于生成将重新生成常量子例程的嵌入式 Perl 代码。参数与 C_constant 相同。

目前,基类不做任何事情并返回一个空字符串。

normalise_items args, default_type, seen_types, seen_items, ITEM...

将项目转换为规范形式。对于 8 位和 Unicode 值,将项目转换为包含 1 或 2 个项目的数组,这两个项目都以 8 位和 UTF-8 编码。

C_constant arg_hashref, ITEM...

一个函数,返回一个列表,其中包含 C 子例程定义,这些定义在 XS 包装器传递名称时返回常量的值和类型。ITEM... 给出一个常量名称列表。每个名称可以是一个字符串,它被视为一个 C 宏名称,也可以是一个对哈希的引用,该哈希具有以下键

name

常量的名称,如 Perl 代码中所见。

type

常量的类型(IVNV 等)

value

常量的值的 C 表达式,或者如果类型是聚合类型,则为 C 表达式的列表。如果没有给出,则默认为name

macro

#ifdef 中使用的 C 预处理器宏。默认为name,主要用于value 是一个enum 时。如果传递了一个对数组的引用,则第一个元素用于代替#ifdef 行,第二个元素用于代替#endif 行。这允许使用以下预处理器结构

#if defined (foo)
#if !defined (bar)
...
#endif
#endif

用于确定是否要定义一个常量。

一个“macro” 1 表示常量始终被定义,因此省略#if/#endif 测试。

default

如果宏未定义,则使用此默认值(而不是使用“您的供应商未定义...”进行croak)作为返回值。指定一个包含类型和值(s)的数组的引用。

pre

在为常量赋值之前使用的 C 代码。这允许您使用临时变量从struct的一部分中提取值,并将其作为value返回。此 C 代码放置在块的开头,因此您可以在其中声明变量。

post

在为值(到临时变量)赋值和从函数返回之间放置的 C 代码。这允许您清除pre中的任何内容。很少需要。

def_pre
def_post

prepost的默认值等效项。

utf8

内部生成。如果名称是 7 位 ASCII,则为零或未定义,如果名称是 8 位(因此应该仅在 SvUTF8() 为假时匹配),则为“no”,如果名称是 utf8 编码,则为“yes”。

内部机制会自动将任何包含 128-255 字符但没有 256+ 字符(即可以是字节或 utf8 的字符)的名称克隆到第二个条目中,该条目是 utf8 编码的。

weight

名称的可选排序权重,用于确定当多个名称落在 switch 子句的同一情况时线性测试的顺序。较高的权重排在前面,未定义的权重默认为零。

在参数 hashref 中,package 是包的名称,仅在生成的 C 代码中的注释中使用。subname 默认为constant(如果未定义)。

default_type 是由未指定类型的 ITEM 返回的类型。它默认为 default_type() 的值。types 应该以 C 子例程 subname 将生成的类型的逗号分隔列表的形式给出,或者以对哈希的引用形式给出。如果 default_type 不存在,它将被添加到列表中,ITEM 列表中给出的任何类型也将被添加到列表中。生成的列表应该是 XS_constant 所给出的相同类型列表。[否则,XS_constantC_constant 在常量函数的参数数量上可能会有所不同。indent 目前未使用且被忽略。将来它可能用于传递用于更改所用 C 缩进样式的信息。] 保持一致性的最佳方法是传递一个哈希引用,并让此函数更新它。

breakout 控制何时生成 subname 的子函数。如果有 breakout 个或更多个具有相同名称长度的 ITEM,则在它们之间切换的代码将被放置在一个名为 subname_len 的函数中,例如对于 5 个字符长的名称,则为 constant_5。默认的 breakout 为 3。单个 ITEM 始终内联。

错误

尚未记录所有内容。

可能还有其他错误。

作者

Nicholas Clark <[email protected]> 基于 Larry Wall 和其他人编写的 h2xs 中的代码