內容

名稱

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_typetypesITEMs 與 C_constant 相同。indent 視為縮排的空格數。如果 declare_types 為 true,則在產生的 perl 程式碼中,$types 始終會宣告,如果已定義且為 false,則永不宣告,如果未定義,則僅在無法從 default_typesITEMs 推斷傳入 types 中的值時,才宣告 $types

指定 arg_hashref,VALUE...

傳回適當指定子句的方法。如果 type 是聚合(例如 PVN 預期指標和長度),則應該有多個 VALUEs 供組件使用。如果已定義 prepost,則提供 C 程式碼片段,用於執行指定前和後的動作。pre 會出現在區塊的開頭,因此可以在其中定義變數。

傳回子句 arg_hashref,ITEM

傳回適當 #ifdef 子句的方法。ITEM 是雜湊參照(傳遞給 C_constantmatch_clause)。indent 是縮排的空格數,預設為 6。

switch_clause arg_hashref,NAMELEN,ITEMHASH,ITEM...

產生適當 switch 子句的內部方法,由 C_constant 呼叫。ITEMs 採用雜湊參照格式,如 C_constant 的說明中所述,且所有名稱的長度都必須相同,由 NAMELEN 指定。ITEMHASH 是雜湊的參照,以名稱為鍵,值為 ITEM 清單中的雜湊參照。(不會修改任何參數,且 ITEMHASH 中可以有不在 ITEMs 清單中的鍵,而不會造成問題 - 傳入雜湊以避免為每次呼叫重新產生雜湊)。

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...

一個函式,當 XS wrapper 傳遞名稱時,會傳回一個 C 子常式定義的清單,其中包含常數的值和類型。ITEM... 會提供一個常數名稱清單。每個名稱可以是字串(視為 C 巨集名稱),或具有下列金鑰的雜湊參考

name

常數的名稱,如同 Perl 程式碼所見。

type

常數的類型(IVNV 等)

value

常數值的 C 運算式,或如果類型是聚合,則為 C 運算式的清單。如果未提供,則預設為name

macro

#ifdef 中使用的 C 預處理器巨集。預設為name,主要用於valueenum 的情況。如果傳遞一個陣列參考,則第一個元素會用於取代 #ifdef 行,而第二個元素會用於取代 #endif。這允許使用預處理器結構,例如

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

來判斷是否要定義常數。

「巨集」1 表示常數總是定義,因此會省略 #if/#endif 測試。

default

預設值(取代使用「您的供應商尚未定義...」來 croak),用於在未定義巨集時傳回。指定一個陣列參考,其中包含類型,後接值。

pre

在指派常數值之前使用的 C 程式碼。這允許您使用暫時變數從 struct 的一部分中萃取值,並將其回傳為 value。此 C 程式碼置於區塊的開頭,因此您可以在其中宣告變數。

post

在指派值(給暫時變數)與從函式回傳之間置入的 C 程式碼。這允許您清除 pre 中的任何內容。很少需要。

def_pre
def_post

prepost 的等價值,用於預設值。

utf8

內部產生。如果名稱是 7 位元 ASCII,則為零或未定義;如果名稱是 8 位元(因此僅在 SvUTF8() 為 false 時才應符合),則為「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 的子函數何時產生。如果有多個長度相同的 ITEM 且數量等於或多於 breakout,則會將在它們之間切換的程式碼置於名為 subname_len 的函數中,例如名稱長度為 5 個字元的 constant_5。預設的 breakout 為 3。單一 ITEM 始終會內嵌。

BUGS

尚未記載所有內容。

可能還有其他事項。

作者

Nicholas Clark <nick@ccl4.org>,根據 Larry Wall 等人在 h2xs 中的程式碼