ExtUtils::Typemaps - 读取/写入/修改 Perl/XS 类型映射文件
# read/create file
my $typemap = ExtUtils::Typemaps->new(file => 'typemap');
# alternatively create an in-memory typemap
# $typemap = ExtUtils::Typemaps->new();
# alternatively create an in-memory typemap by parsing a string
# $typemap = ExtUtils::Typemaps->new(string => $sometypemap);
# add a mapping
$typemap->add_typemap(ctype => 'NV', xstype => 'T_NV');
$typemap->add_inputmap(
xstype => 'T_NV', code => '$var = ($type)SvNV($arg);'
);
$typemap->add_outputmap(
xstype => 'T_NV', code => 'sv_setnv($arg, (NV)$var);'
);
$typemap->add_string(string => $typemapstring);
# will be parsed and merged
# remove a mapping (same for remove_typemap and remove_outputmap...)
$typemap->remove_inputmap(xstype => 'SomeType');
# save a typemap to a file
$typemap->write(file => 'anotherfile.map');
# merge the other typemap into this one
$typemap->merge(typemap => $another_typemap);
此模块可以读取、修改、创建和写入 Perl XS 类型映射文件。如果您不知道什么是类型映射,请参阅 perlxstut 和 perlxs 手册。
该模块并非完全双向兼容:例如,它目前只是简单地删除所有注释。但是,映射中条目的顺序将被保留。
我们检查类型映射中是否存在重复条目,但不会检查 INPUTMAP
或 OUTPUTMAP
条目是否缺少 TYPEMAP
条目,因为这些条目可能隐藏在其他类型映射中。
返回一个新的类型映射对象。接受一个可选的 file
参数。如果设置了该参数,则将读取给定的文件。如果文件不存在,则返回一个空的类型映射。
或者,如果提供了string
参数,则会解析提供的字符串而不是文件。
获取/设置当调用write
方法时类型映射写入的文件。
向类型映射添加TYPEMAP
条目。
必需的命名参数:ctype
(例如ctype => 'double'
)和xstype
(例如xstype => 'T_NV'
)。
可选命名参数:replace => 1
强制删除/替换具有相同ctype
的现有TYPEMAP
条目。skip => 1
触发“先到先得”逻辑,通过该逻辑,与现有条目冲突的新条目将被静默忽略。
作为命名参数使用方式的替代方案,您可以将ExtUtils::Typemaps::Type
对象作为第一个参数传递,该对象的副本将被添加到类型映射中。在这种情况下,只有replace
或skip
命名参数可以在对象之后使用。示例
$map->add_typemap($type_obj, replace => 1);
向类型映射添加INPUT
条目。
必需的命名参数:xstype
(例如xstype => 'T_NV'
)和与其关联的输入code
。
可选命名参数:replace => 1
强制删除/替换具有相同xstype
的现有INPUT
条目。skip => 1
触发“先到先得”逻辑,通过该逻辑,与现有条目冲突的新条目将被静默忽略。
作为命名参数使用方式的替代方案,您可以将ExtUtils::Typemaps::InputMap
对象作为第一个参数传递,该对象的副本将被添加到类型映射中。在这种情况下,只有replace
或skip
命名参数可以在对象之后使用。示例
$map->add_inputmap($type_obj, replace => 1);
向类型映射添加OUTPUT
条目。与add_inputmap
的工作方式完全相同。
将字符串解析为类型映射并将其合并到类型映射对象中。
必需的命名参数:string
,用于指定要解析的字符串。
从类型映射中删除TYPEMAP
条目。
必需的命名参数:ctype
,用于指定要从类型映射中删除的条目。
或者,您可以传递一个ExtUtils::Typemaps::Type
对象。
从类型映射中移除一个 INPUT
条目。
必需的命名参数:xstype
,用于指定要从类型映射中移除的条目。
或者,您可以传递一个 ExtUtils::Typemaps::InputMap
对象。
从类型映射中移除一个 OUTPUT
条目。
必需的命名参数:xstype
,用于指定要从类型映射中移除的条目。
或者,您可以传递一个 ExtUtils::Typemaps::OutputMap
对象。
获取类型映射 TYPEMAP 部分的条目。
必需的命名参数:条目的 ctype
。
如果找到,则返回条目的 ExtUtils::Typemaps::Type
对象。
获取类型映射 INPUT 部分的条目。
必需的命名参数:条目的 xstype
或可用于查找 xstype
的类型映射的 ctype
。也就是说,以下代码片段是等效的
my $type = $typemap->get_typemap(ctype => $ctype)
my $input_map = $typemap->get_inputmap(xstype => $type->xstype);
my $input_map = $typemap->get_inputmap(ctype => $ctype);
如果找到,则返回条目的 ExtUtils::Typemaps::InputMap
对象。
获取类型映射 OUTPUT 部分的条目。
必需的命名参数:条目的 xstype
或可用于解析 xstype
的类型映射的 ctype
。(有关示例,请参见上文。)
如果找到,则返回条目的 ExtUtils::Typemaps::InputMap
对象。
将类型映射写入文件。可以选择接受 file
参数。如果给出,类型映射将写入指定的文件。如果没有,类型映射将写入当前存储的文件名(参见上面的 "file",默认情况下为从其读取的文件,如果有)。
生成并返回类型映射的字符串形式。
生成并返回类型映射的字符串形式,并在其周围加上适当的前缀,以便将其逐字包含到 XS 文件中作为嵌入式类型映射。这将返回一个类似于以下内容的字符串
TYPEMAP: <<END_OF_TYPEMAP
... typemap here (see as_string) ...
END_OF_TYPEMAP
该方法注意不要使用出现在类型映射字符串本身中的 HERE-doc 结束标记。
将给定的类型映射合并到对象中。请注意,合并操作失败会导致对象处于不一致状态,因此如有必要请克隆它。
必填命名参数:typemap => $another_typemap_obj
或 file => $path_to_typemap_file
,但不能同时使用两者。
可选参数:replace => 1
强制替换现有类型映射条目,不发出警告;skip => 1
跳过类型映射中已存在的条目。
返回一个布尔值,指示此类型映射是否完全为空。
返回此类型映射对象可映射的 C 类型列表。
返回一个哈希表,将 C 类型映射到 XS 类型。
{
'char **' => 'T_PACKEDARRAY',
'bool_t' => 'T_IV',
'AV *' => 'T_AVREF',
'InputStream' => 'T_IN',
'double' => 'T_DOUBLE',
# ...
}
这是有文档记录的,因为它被 ExtUtils::ParseXS
使用,但它不适合一般使用。可能会随时删除。
返回一个哈希表,将 XS 类型(标识符)映射到相应的 INPUT 代码。
{
'T_CALLBACK' => ' $var = make_perl_cb_$type($arg)
',
'T_OUT' => ' $var = IoOFP(sv_2io($arg))
',
'T_REF_IV_PTR' => ' if (sv_isa($arg, \\"${ntype}\\")) {
# ...
}
这是有文档记录的,因为它被 ExtUtils::ParseXS
使用,但它不适合一般使用。可能会随时删除。
返回一个哈希表,将 XS 类型(标识符)映射到相应的 OUTPUT 代码。
{
'T_CALLBACK' => ' sv_setpvn($arg, $var.context.value().chp(),
$var.context.value().size());
',
'T_OUT' => ' {
GV *gv = (GV *)sv_newmortal();
gv_init_pvn(gv, gv_stashpvs("$Package",1),
"__ANONIO__",10,0);
if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
sv_setsv(
$arg,
sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1))
);
else
$arg = &PL_sv_undef;
}
',
# ...
}
这是有文档记录的,因为它被 ExtUtils::ParseXS
使用,但它不适合一般使用。可能会随时删除。
返回一个哈希表,将类型映射的 C 类型映射到其相应的原型。
{
'char **' => '$',
'bool_t' => '$',
'AV *' => '$',
'InputStream' => '$',
'double' => '$',
# ...
}
这是有文档记录的,因为它被 ExtUtils::ParseXS
使用,但它不适合一般使用。可能会随时删除。
创建并返回完整类型映射对象的克隆。
接受命名参数:如果 shallow
为真,克隆将共享实际的单个类型/输入/输出映射对象,但不共享其存储。谨慎使用。如果没有 shallow
,克隆将完全独立。
用于(启发式地)规范化 C 类型的函数。在一定程度上适用于 C++ 类型。
$halfway_canonical_type = tidy_type($ctype);
从 ExtUtils::ParseXS
移动。
继承了 ExtUtils::ParseXS
中的一些恶意代码。
解析器很大程度上借鉴了 ExtUtils::ParseXS 中的解析器。
Steffen Mueller <[email protected]
>
版权所有 2009, 2010, 2011, 2012, 2013 Steffen Mueller
本程序是自由软件;您可以根据与 Perl 本身相同的条款重新发布和/或修改它。