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 手冊。
此模組並非完全可逆:例如,它目前僅會移除所有註解。不過,映射中條目的順序會被保留。
我們會檢查類型映射中是否有重複條目,但不會檢查 TYPEMAP
條目中是否有遺漏的 INPUTMAP
或 OUTPUTMAP
條目,因為這些條目可能隱藏在不同的類型映射中。
傳回新的類型對應物件。採用選用的 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 文件結束標記。
將給定的類型圖合併到物件中。請注意,合併作業失敗會讓物件處於不一致的狀態,因此必要時請複製它。
強制命名參數: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
使用,但它並非供一般使用。可能會隨時移除。
傳回對應 typemap 的 C 類型至其對應原型之雜湊。
{
'char **' => '$',
'bool_t' => '$',
'AV *' => '$',
'InputStream' => '$',
'double' => '$',
# ...
}
這有文件記載,因為它是由 ExtUtils::ParseXS
使用,但它並非供一般使用。可能會隨時移除。
建立並傳回完整 typemaps 物件的複製。
採用命名參數:如果 shallow
為 true,複製將共用實際的個別類型/輸入/輸出地圖物件,但不會共用其儲存空間。請小心使用。如果沒有 shallow
,複製將完全獨立。
用於(啟發式地)正規化 C 類型的函式。在某種程度上適用於 C++ 類型。
$halfway_canonical_type = tidy_type($ctype);
從 ExtUtils::ParseXS
移入。
繼承自 ExtUtils::ParseXS
的部分邪惡程式碼。
此剖析器在很大程度上受到 ExtUtils::ParseXS 中剖析器的啟發。
有關 typemaps 的詳細資訊:perlxstut、perlxs。
Steffen Mueller <smueller@cpan.org
>
著作權所有 2009、2010、2011、2012、2013 Steffen Mueller
此程式為免費軟體;您可以在與 Perl 相同的條款下重新散布或修改它。