perlintern - 純粹 內部 Perl 函式的自動產生文件
本文件是 Perl 解譯器中使用 Perl 內部文件格式記錄的函式的自動產生文件,但並未標記為 Perl API 的一部分。換句話說,它們不適用於擴展!
它與 perlapi 具有相同的部分,但有些部分可能是空的。
av_fetch_simple
這是 av_fetch 的簡化版本,假設數組非常簡單 - 沒有魔法,不是唯讀的,並且 AvREAL - 並且 key
不是負數。在任何這些假設可能不成立的情況下,絕對不能使用此函式。
返回數組中指定索引的 SV。 key
是索引。如果 lval 為真,則保證可以得到一個真正的 SV(如果以前不是真實的),然後可以修改它。在將其解引用為 SV*
之前,請檢查返回值是否非空。
粗略的 Perl 等效形式是 $myarray[$key]
。
SV ** av_fetch_simple(AV *av, SSize_t key, I32 lval)
AvFILLp
如果數組 av
為空,則返回 -1;否則返回當前在 av
中定義的所有數組元素的索引的最大值。它不處理魔法,因此在其名稱中有 p
私有標記。
SSize_t AvFILLp(AV* av)
av_new_alloc
這實現了 perlapi 中的 "newAV_alloc_x
" 和 perlapi 中的 "newAV_alloc_xz
",這些是此功能的公共 API。
創建一個新的 AV 並分配其 SV* 數組。
這與執行相似,但效率更高:
AV *av = newAV();
av_extend(av, key);
大小參數用於預先分配足夠大的 SV* 數組,以容納至少元素 0..(size-1)
。 size
必須至少為 1。
zeroflag
參數控制數組是否為 NULL 初始化。
AV * av_new_alloc(SSize_t size, bool zeroflag)
av_store_simple
這是 av_store 的簡化版本,假設數組非常簡單 - 沒有任何魔法,不是只讀的,而且是 AvREAL - 並且 key
不是負數。在這些假設可能不成立的情況下,絕對不應該使用此函數。
將 SV 存儲在數組中。數組索引由 key
指定。可以對其進行解引用,以獲取存儲在那裡的 SV*
(= val
)。
注意,在調用之前,調用方負責適當地增加 val
的引用計數。
Perl 的近似等效: splice(@myarray, $key, 1, $val)
。
SV ** av_store_simple(AV *av, SSize_t key, SV *val)
dowantarray
已棄用!
計劃在未來的 Perl 版本中移除 dowantarray
。不要在新代碼中使用它;從現有代碼中刪除它。
實現了已棄用的 "GIMME
" in perlapi。
U8 dowantarray()
leave_scope
實現了 LEAVE_SCOPE
,您應該使用它。
void leave_scope(I32 base)
magic_freedestruct
此函數通過魔法調用以實現 mortal_destructor_sv()
和 mortal_destructor_x()
函數。不應直接調用此函數,並且沒有任何用戶可維護的部分。
int magic_freedestruct(SV *sv, MAGIC *mg)
mortal_svfunc_x
此函數安排在 當前語句結束時 調用一個 C 函數引用,並提供所需的參數。它是 mortal_destructor_sv()
的包裝器,確保後者被適當地調用。
請注意,在 當前語句結束時 和 當前虛假區塊結束時 之間存在顯著的時間差異。如果您正在尋找一種在 當前虛假區塊結束時 觸發函數的機制,則應該查看而不是此函數。
void mortal_svfunc_x(SVFUNC_t f, SV *p)
pop_scope
void pop_scope()
push_scope
在 perlapi 中實現 "ENTER
"。
void push_scope()
save_adelete
實現 SAVEADELETE
。
void save_adelete(AV *av, SSize_t key)
save_freercpv
實現 SAVEFREERCPV
。
保存並釋放引用計數的字符串。當當前偽塊完成時,將調用 rcpv_free()。
void save_freercpv(char *rcpv)
save_generic_pvref
實現 SAVEGENERICPV
。
類似於 save_pptr(),但如果新值與舊值不同,還會 Safefree() 新值。可用於將全局 char* 恢復為其先前內容,釋放新值。
void save_generic_pvref(char **str)
save_generic_svref
實現 SAVEGENERICSV
。
類似於 save_sptr(),但還會 SvREFCNT_dec() 新值。可用於將全局 SV 恢復為其先前內容,釋放新值。
void save_generic_svref(SV **sptr)
save_hdelete
實現 SAVEHDELETE
。
void save_hdelete(HV *hv, SV *keysv)
save_hints
實現 SAVEHINTS
。
void save_hints()
save_op
實現 SAVEOP
。
void save_op()
save_padsv_and_mortalize
實現 SAVEPADSVANDMORTALIZE
。
void save_padsv_and_mortalize(PADOFFSET off)
save_pushptr
將對象 ptr
的引用計數在當前偽塊結束時減少。 type
表示 ptr
的類型,表示為 scope.h 中以 SAVEt_
開頭的常量之一。
這是幾個宏的基礎實現,如 SAVEFREESV
。
void save_pushptr(void * const ptr, const int type)
save_rcpv
實現 SAVERCPV
。
保存並恢復引用計數的字符串,類似於 save_generic_svref 對 SV* 做的操作。可用於將引用計數的字符串恢復為其以前的狀態。執行適當的引用計數計算,以確保沒有泄漏或過早釋放。
void save_rcpv(char **prcpv)
save_scalar_at
用於區域化由 *sptr
引用的 SV 的輔助函數。
如果在 flags
中設置了 SAVEf_KEEPOLDELEM
,則該函數將返回原始的標量。
否則,它將使用新的undef
標量替換*sptr
,並返回該標量。新的標量將複製舊的魔法(如果有的話)。如果有這樣的魔法,並且在flags
中設置了SAVEf_SETMAGIC
,則將對新標量執行 'set' 魔法。如果未設置,將跳過 'set' 魔法。後者通常意味著很快將會有賦值操作(例如,'local $x = $y'
),然後這將處理魔法。
SV * save_scalar_at(SV **sptr, const U32 flags)
save_set_svflags
實現SAVESETSVFLAGS
。
將由遮罩指定的SvFLAGS設置為val中的值
void save_set_svflags(SV *sv, U32 mask, U32 val)
實現SAVESHAREDPV
。
類似於save_generic_pvref(),但使用PerlMemShared_free()而不是Safefree()。可用於將共享全局char*恢復到其先前的內容,釋放新值。
void save_shared_pvref(char **str)
save_vptr
實現SAVEVPTR
。
void save_vptr(void *ptr)
目前在轉換中沒有內部API項目
目前在字符大小寫轉換中沒有內部API項目
目前在字符分類中沒有內部API項目
目前在編譯器和預處理器信息中沒有內部API項目
目前在編譯器指令中沒有內部API項目
BhkENTRY
注意:BhkENTRY
是實驗性的,可能會在不通知的情況下更改或移除。
從BHK結構返回一個條目。which
是一個預處理器標記,指示返回哪個條目。如果未設置相應的標誌,則會返回NULL
。返回值的類型取決於您請求的條目。
void * BhkENTRY(BHK *hk, token which)
BhkFLAGS
注意:BhkFLAGS
是實驗性的,可能會在不通知的情況下更改或移除。
傳回 BHK 的旗標。
U32 BhkFLAGS(BHK *hk)
CALL_BLOCK_HOOKS
注意:CALL_BLOCK_HOOKS
是實驗性的,可能會在不事先通知的情況下更改或移除。
呼叫所有已註冊的區塊鉤子,用於類型 which
。 which
是一個預處理標記;arg
的類型取決於 which
。
void CALL_BLOCK_HOOKS(token which, arg)
CXt_BLOCK
CXt_EVAL
CXt_FORMAT
CXt_GIVEN
CXt_LOOP_ARY
CXt_LOOP_LAZYIV
CXt_LOOP_LAZYSV
CXt_LOOP_LIST
CXt_LOOP_PLAIN
CXt_NULL
CXt_SUB
CXt_SUBST
CXt_WHEN
在perlguts中有描述。
my_fork
這是用於將 PerlProc_fork
作為 C 库 fork(2) 在某些平台上的封裝器,以隱藏一些平台特異性的使用。它不應該直接使用,除非通過 PerlProc_fork
。
Pid_t my_fork()
目前在 COPs 和提示哈希中沒有內部 API 項目。
core_prototype
此函式將指定核心函式的原型分配給 sv
,或者如果 sv
為 NULL
,則分配給新的有限制生命期的 SV。它會返回修改後的 sv
,如果核心函式沒有原型則返回 NULL
。 code
是由 keyword()
返回的代碼。它不能等於 0。
SV * core_prototype(SV *sv, const char *name, const int code,
int * const opnum)
CvREFCOUNTED_ANYSV
若為真,表示 CvXSUBANY(cv).any_sv
成員包含一個 SV 指針,當 CV 本身被釋放時,其引用計數應該減少。此外,如果設置了此標誌,cv_clone()
會增加引用計數,sv_dup()
如果設置了此標誌,將複製整個指向的 SV。
任何包裹 XSUB 的 CV 都有一個 ANY
聯合,XSUB 函式可自由使用。可能的情況是代碼希望將 SV 存儲在此聯合的 any_sv
成員中。通過設置此標誌,當 CV 本身被回收或複製時,此 SV 引用將被妥善回收或複製。
bool CvREFCOUNTED_ANYSV(CV *cv)
CvREFCOUNTED_ANYSV_off
關閉 CvREFCOUNTED_ANYSV
標誌的輔助巨集。
void CvREFCOUNTED_ANYSV_off(CV *cv)
CvREFCOUNTED_ANYSV_on
打開 CvREFCOUNTED_ANYSV
標誌的輔助巨集。
void CvREFCOUNTED_ANYSV_on(CV *cv)
CvWEAKOUTSIDE
每個 CV 都有一個指針,CvOUTSIDE()
,指向其語法上封閉的 CV(如果有的話)。因為將匿名子原型的指針存儲在 &
填充插槽中,可能會出現循環引用,父項指向子項,反之亦然。為了避免隨之而來的內存洩漏,我們在父項有一個指向我們的 &
填充插槽的情況下,在 特定的一個情況 中不增加由 CvOUTSIDE
指向的 CV 的引用計數。在這種情況下,我們在子項中設置了 CvWEAKOUTSIDE
標誌。這使我們能夠確定在何種情況下在釋放子項時我們應該減少父項的引用計數。
對於非閉包匿名子(即不引用任何在該子項之外的語法)存在進一步的問題。在這種情況下,匿名原型是共享的而不是被克隆的。這導致父項可能在仍然有活躍的子項時被釋放,例如,
BEGIN { $a = sub { eval '$x' } }
在這種情況下,由於沒有任何活動參考指向它,因此 BEGIN 在執行後立即被釋放:匿名子程式的原型設置了 CvWEAKOUTSIDE,因為它不是一個閉包,而 $a 指向相同的 CV,因此它也不會增加 BEGIN 的引用計數。當 $a 被執行時,eval '$x' 導致追蹤 CvOUTSIDE 鏈,並且被釋放的 BEGIN 被訪問。
為了避免這種情況,每當釋放一個 CV 及其相關的 pad 時,pad 中的任何 & 項目都會被明確地從 pad 中刪除,並且如果指向的匿名子程式的引用計數仍然為正,則該子代的 CvOUTSIDE 會被設置為指向其父代。這僅在一個特定情況下發生,即非閉包匿名原型具有一個或多個活動引用(如上面的 $a)時才會發生。
還要考慮的另一件事是,CV 可能僅僅是未定義的,而不是被釋放,例如 undef &foo。在這種情況下,它的引用計數可能尚未達到零,但我們仍然刪除它的 pad 和它的 CvROOT 等。由於各種子代仍然可能將它們的 CvOUTSIDE 指向這個未定義的 CV,我們暫時保留它自己的 CvOUTSIDE,以保持詞法範圍鏈的連續性。例如,以下內容應該打印 123
my $x = 123;
sub tmp { sub { eval '$x' } }
my $a = tmp();
undef &tmp;
print $a->();
bool CvWEAKOUTSIDE(CV *cv)
docatch
介入,針對當前操作和 RUNOPS 循環,
- a new JMPENV stack catch frame, and
- an inner RUNOPS loop to run all the remaining ops following the
current PL_op.
然後處理在該循環中引發的任何異常。對於此級別的捕獲 eval,使用指定的重啟操作(即 OP_LEAVETRY 之後的操作)重新進入循環;否則重新引發異常。
docatch() 預期用法如下
PP(pp_entertry)
{
if (CATCH_GET)
return docatch(Perl_pp_entertry);
... rest of function ...
return PL_op->op_next;
}
如果不需要新的捕獲框架,則操作表現正常。否則,它調用 docatch(),後者遞歸調用 pp_entertry(),這次使用 CATCH_GET() 為 false,因此運行 entertry 餘下的內容。然後 docatch() 調用 CALLRUNOPS(),它執行所有 entertry 之後的操作。當循環最終完成時,控制返回到 docatch(),後者彈出 JMPENV 並返回到父 pp_entertry(),後者立即返回。請注意,*所有*後續操作都在內部 RUNOPS 循環中運行,而不僅僅是 eval 的主體。例如,在
sub TIEARRAY { eval {1}; my $x }
tie @a, "main";
在執行 'my' 的時候,C 堆棧會看起來像
#10 main()
#9 perl_run() # JMPENV_PUSH level 1 here
#8 S_run_body()
#7 Perl_runops_standard() # main RUNOPS loop
#6 Perl_pp_tie()
#5 Perl_call_sv()
#4 Perl_runops_standard() # unguarded RUNOPS loop: no new JMPENV
#3 Perl_pp_entertry()
#2 S_docatch() # JMPENV_PUSH level 2 here
#1 Perl_runops_standard() # docatch()'s RUNOPs loop
#0 Perl_pp_padsv()
基本上,perl 核心的任何部分開始一個 RUNOPS 循環都可以承諾捕獲任何異常並在必要時重新啟動循環。如果它沒有準備好這樣做(例如 call_sv() 沒有這樣做),則將 CATCH_GET() 設置為 true,以便稍後的類似 eval 的代碼知道設置新的處理程序和循環(通過 docatch())。
請參閱 "perlinterp 中的異常處理" 以獲取更多詳細信息。
OP * docatch(Perl_ppaddr_t firstpp)
comma_aDEPTH
在 DEBUGGING 模式下編譯的某些函數會多接受一個額外的最終參數,名為 depth
,表示 C 堆疊深度。否則會省略此參數。此宏在 DEBUGGING 模式下會展開為 ,depth
,在非 DEBUGGING 模式下則不展開,以減少代碼中的 #ifdef
。
程序負責維護正確的 depth
值。
comma_aDEPTH
comma_pDEPTH
用於接受一個"comma_aDEPTH
" 最終參數的函數原型聲明,類似於接受線程上下文初始參數的函數使用 pTHX_
。
debop
在 OP o
上實現 -Dt perl 命令行選項。
I32 debop(const OP *o)
debprof
用於指示已執行 o
,以便在 -DP
命令行選項下進行分析。
void debprof(const OP *o)
debprofdump
將由 -DP
perl 命令行選項收集的數據內容轉儲。
void debprofdump()
debug_aDEPTH
與"comma_aDEPTH
"相同,但沒有前導參數。用於沒有常規參數的函數,並被"comma_aDEPTH
"本身使用。
debug_aDEPTH
debug_pDEPTH
與"comma_pDEPTH
"相同,但沒有前導參數。用於沒有常規參數的函數,並被"comma_pDEPTH
"本身使用。
debug_pDEPTH
free_c_backtrace
釋放從 get_c_backtrace 接收的回溯。
void free_c_backtrace(Perl_c_backtrace *bt)
get_c_backtrace
將回溯(又稱“堆疊跟踪”)收集到單個線性 malloced 緩衝區中,調用者必須Perl_free_c_backtrace()
。
通過depth + skip
掃描框架,然後刪除最內層的skip
,最多返回depth
框架。
Perl_c_backtrace * get_c_backtrace(int max_depth, int skip)
PL_DBsingle
當 Perl 在調試模式下運行時,使用-d開關,此 SV 是一個布林值,表示是否正在逐步執行子程序。在每個步驟之後,逐步執行都會自動打開。這是對應於 Perl 的 $DB::single 變量的 C 變量。參見"PL_DBsub"
。
在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。
SV * PL_DBsingle
PL_DBsub
當以調試模式運行 Perl,使用 -d 開關時,此 GV 包含持有正在進行調試的子例程名稱的 SV。這是對應於 Perl 的 $DB::sub 變數的 C 變數。請參閱 "PL_DBsingle"
。
在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。
GV * PL_DBsub
PL_DBtrace
當以調試模式運行 Perl,使用 -d 開關時使用的跟踪變數。這是對應於 Perl 的 $DB::trace 變數的 C 變數。請參閱 "PL_DBsingle"
。
在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。
SV * PL_DBtrace
sv_peek
實現 SvPEEK
char * sv_peek(SV *sv)
cv_dump
轉儲 CV 的內容
void cv_dump(const CV *cv, const char *title)
cv_forget_slab
當 CV 在其板上具有引用計數(CvSLABBED
)時,它負責確保它被釋放。 (因此,兩個 CV 永遠不應該在同一塊板上具有引用計數。)CV 只需要在編譯期間引用板。一旦它編譯完成並且附加了 CvROOT
,它就完成了其工作,因此可以忘記板。
void cv_forget_slab(CV *cv)
do_dump_pad
轉儲 padlist 的內容
void do_dump_pad(I32 level, PerlIO *file, PADLIST *padlist,
int full)
get_context
實現 perlapi 中的 "PERL_GET_CONTEXT
",您應該使用它。
void * get_context()
pad_alloc_name
在當前編譯的 pad 中分配一個位置(通過 perlapi 中的 "pad_alloc")然後為該項目存儲名稱。 name
被採納並成為名稱項目;它必須已經包含名稱字符串。 typestash
和 ourstash
以及 padadd_STATE
標誌被添加到 name
中。不會進行 perlapi 中的 "pad_add_name_pvn" 的其他處理。返回分配的 pad 槽的偏移量。
PADOFFSET pad_alloc_name(PADNAME *name, U32 flags, HV *typestash,
HV *ourstash)
pad_block_start
在進入新塊時更新 pad 編譯狀態變數。
void pad_block_start(int full)
pad_check_dup
檢查重複聲明:報告任何
* a 'my' in the current scope with the same name;
* an 'our' (anywhere in the pad) with the same name and the
same stash as 'ourstash'
is_our
表示要檢查的名稱是一個 "our"
聲明。
void pad_check_dup(PADNAME *name, U32 flags, const HV *ourstash)
pad_findlex
在嵌套的 pad 鏈中找到具名的語彙。如果在外部找到,則在內部的 pad 中添加虛擬項目。
返回 lex 或虛擬 lex 在底層 pad 中的偏移。 cv
是開始搜索的 CV,seq 是要匹配的當前 cop_seq
。如果 warn
為 true,則打印相應的警告。 out_
* 變數返回值,因此是指向返回值應存儲的位置的指針。如果 out_capture
為非空,則請求捕獲語彙的最內層實例;out_name
設置為最內層匹配的 pad 名稱或虛擬 pad 名稱;out_flags
返回與虛擬 pad 名稱的 PARENT_FAKELEX_FLAGS
字段通常關聯的標誌。
請注意,pad_findlex()
是遞歸的;它向上遞歸到 CV 鏈,然後返回,添加虛擬條目。必須這樣做,因為匿名原型中的虛擬名稱必須在 xpadn_low
中存儲對父 pad 的索引。
PADOFFSET pad_findlex(const char *namepv, STRLEN namelen,
U32 flags, const CV *cv, U32 seq, int warn,
SV **out_capture, PADNAME **out_name,
int *out_flags)
pad_fixup_inner_anons
對於 pad 中的任何匿名 CV,如果需要,將該 CV 的 CvOUTSIDE
從 old_cv
更改為 new_cv
。當新編譯的 CV 必須移動到預先存在的 CV 結構時需要。
void pad_fixup_inner_anons(PADLIST *padlist, CV *old_cv,
CV *new_cv)
pad_free
釋放當前 pad 中偏移為 po 的 SV。
void pad_free(PADOFFSET po)
pad_leavemy
編譯結束時的清理:設置該作用域中語彙的最大序列號,並警告任何未被引入的語彙。
OP * pad_leavemy()
padlist_dup
複製 pad。
PADLIST * padlist_dup(PADLIST *srcpad, CLONE_PARAMS *param)
padname_dup
複製 pad 名稱。
PADNAME * padname_dup(PADNAME *src, CLONE_PARAMS *param)
padnamelist_dup
複製 pad 名稱列表。
PADNAMELIST * padnamelist_dup(PADNAMELIST *srcpad,
CLONE_PARAMS *param)
pad_push
將新的 pad 框推送到 padlist 上,除非已經存在該深度的 pad,在這種情況下不要創建新的。然後在 slot zero 中給新的 pad 一個 @_
。
void pad_push(PADLIST *padlist, int depth)
pad_reset
標記所有當前的臨時變量以便重用
void pad_reset()
pad_setsv
在當前(編譯或執行)的 pad 中設置偏移為 po
的值。請使用宏 PAD_SETSV()
而不是直接調用此函數。
void pad_setsv(PADOFFSET po, SV *sv)
pad_sv
獲取當前(編譯或執行)的 pad 中偏移為 po
的值。請使用宏 PAD_SV
而不是直接調用此函數。
SV * pad_sv(PADOFFSET po)
pad_swipe
在偏移 po
的當前 pad 中放棄 tmp,並以新的取代之。
void pad_swipe(PADOFFSET po, bool refadjust)
set_context
實現 "PERL_SET_CONTEXT
" 在 perlapi 中,應改用此。
void set_context(void *t)
si_dup
複製一個堆疊資訊結構,返回指向克隆對象的指針。
PERL_SI * si_dup(PERL_SI *si, CLONE_PARAMS *param)
ss_dup
複製保存堆疊,返回指向克隆對象的指針。
ANY * ss_dup(PerlInterpreter *proto_perl, CLONE_PARAMS *param)
dSAVEDERRNO
聲明保存 errno
和任何操作系統特定錯誤號碼所需的變量。
void dSAVEDERRNO
dSAVE_ERRNO
聲明保存 errno
和任何操作系統特定錯誤號碼所需的變量,並將它們保存以供稍後由 RESTORE_ERRNO
選擇性還原。
void dSAVE_ERRNO
RESTORE_ERRNO
還原由 dSAVE_ERRNO
或 RESTORE_ERRNO
保存的 errno
和任何操作系統特定錯誤號碼。
void RESTORE_ERRNO
SAVE_ERRNO
保存 errno
和任何操作系統特定錯誤號碼以供稍後由 RESTORE_ERRNO
選擇性還原。 需要範圍內有 dSAVEDERRNO
或 dSAVE_ERRNO
。
void SAVE_ERRNO
SETERRNO
設置 errno
,在 VMS 上設置 vaxc$errno
。
void SETERRNO(int errcode, int vmserrcode)
當前沒有異常處理(簡單)宏中的內部 API 項目
當前沒有檔案系統配置值中的內部 API 項目
當前沒有浮點數中的內部 API 項目
當前沒有一般配置中的內部 API 項目
當前沒有全局變量中的內部 API 項目
amagic_applies
檢查 sv
是否適用於重載(活動魔法)操作 method
。 如果 sv 不是 SvROK 或不是對象,則返回 false,否則檢查對象是否被祝福為支持重載操作的類,如果調用 amagic_call() 與此 SV 和給定的方法將觸發一個 amagic 操作,包括通過重載回退規則或通過 nomethod。 因此,像這樣的調用
amagic_applies(sv, string_amg, AMG_unary)
對於以以下任何方式設置過載的物件,會返回 true:
use overload q("") => sub { ... };
use overload q(0+) => sub { ... }, fallback => 1;
可以用來判斷特定物件是否會將字串化為非常規的預設參考字串。
請注意,此函式返回 TRUE 不代表您可以成功執行 amagic_call() 操作,例如任何已過載的方法可能會拋出致命異常,但是如果此函式返回 FALSE,則可以確信它不會執行給定的過載操作。
method
是一個整數枚舉值,在 overload.h 中可以找到,例如 string_amg
。
flags
應該設置為 AMG_unary 以進行一元操作。
bool amagic_applies(SV *sv, int method, int flags)
gp_dup
複製一個 typeglob,返回克隆對象的指針。
GP * gp_dup(GP * const gp, CLONE_PARAMS * const param)
gv_handler
實現 StashHANDLER
,您應該使用此功能。
CV * gv_handler(HV *stash, I32 id)
gv_stashsvpvn_cached
返回指定封包的stash的指針,可能已經緩存。實現了 "gv_stashpvn
" 在 perlapi 中 和 "gv_stashsv
" 在 perlapi 中。
要求 namesv
或 namepv
其中之一不為空。
如果設置了標誌 GV_CACHE_ONLY
,則僅在緩存中找到時返回 stash;有關其他 flags
的詳細信息,請參閱 "gv_stashpvn
" 在 perlapi 中。
基於性能原因,強烈建議 namesv
不為空。
HV * gv_stashsvpvn_cached(SV *namesv, const char *name,
U32 namelen, I32 flags)
gv_try_downgrade
注意:gv_try_downgrade
是實驗性的,可能會在未通知的情況下更改或刪除。
如果 typeglob gv
可以更簡潔地表示,而不是在 stash 中放置一個真實的 GV,則用優化的形式替換它。此功能的基本要求是,gv
是一個真實的 typeglob,足夠普通,並且只從其封包中引用。當部分查找了 GV 以查看其中的內容,導致升級,但根據找到的內容,結果發現實際上不需要真實的 GV 時,應使用此函式。
如果gv
是完全空的类型全局变量,则将其从存储中删除。
如果gv
只包含一个足够普通的常量子类型全局变量,则将该类型全局变量替换为更紧凑表示相同内容的标量引用占位符。
void gv_try_downgrade(GV *gv)
目前在挂钩操作中没有内部 API 项目。
hv_eiter_p
实现HvEITER
,您应该使用它。
注意:hv_eiter_p
必须显式调用为Perl_hv_eiter_p
,带有aTHX_
参数。
HE ** Perl_hv_eiter_p(pTHX_ HV *hv)
hv_eiter_set
实现HvEITER_set
,您应该使用它。
注意:hv_eiter_set
必须显式调用为Perl_hv_eiter_set
,带有aTHX_
参数。
void Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter)
hv_ename_add
将名称添加到存储的有效名称内部列表中。请参见"hv_ename_delete"
。
当将存储分配给符号表中的新位置时,会调用此函数。
void hv_ename_add(HV *hv, const char *name, U32 len, U32 flags)
hv_ename_delete
从存储的有效名称内部列表中删除名称。如果这是HvENAME
返回的名称,则列表中的另一个名称将取而代之(HvENAME
将使用它)。
当从符号表中删除存储时,会调用此函数。
void hv_ename_delete(HV *hv, const char *name, U32 len,
U32 flags)
hv_fill
返回正在使用的哈希桶的数量。
此函数实现了您应该使用的HvFILL
宏。
从 perl 5.25 开始,此函数仅用于调试目的,并且所使用的哈希桶的数量没有以任何方式被缓存,因此此函数执行起来可能成本较高,因为它必须遍历哈希中的所有桶。
注意:hv_fill
必须显式调用为Perl_hv_fill
,带有aTHX_
参数。
STRLEN Perl_hv_fill(pTHX_ HV * const hv)
hv_placeholders_get
实现HvPLACEHOLDERS_get
,您应该使用它。
注意:hv_placeholders_get
必须显式调用为Perl_hv_placeholders_get
,带有aTHX_
参数。
I32 Perl_hv_placeholders_get(pTHX_ const HV *hv)
hv_placeholders_set
实现HvPLACEHOLDERS_set
,您应该使用它。
注意:hv_placeholders_set
必须显式调用为Perl_hv_placeholders_set
,带有aTHX_
参数。
void Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph)
hv_riter_p
实现HvRITER
,您应该使用它。
注意:hv_riter_p
必须显式调用为Perl_hv_riter_p
,带有aTHX_
参数。
I32 * Perl_hv_riter_p(pTHX_ HV *hv)
hv_riter_set
實現 HvRITER_set
,您應該改用此函數。
注意:hv_riter_set
必須顯式地作為帶有 aTHX_
參數的 Perl_hv_riter_set
被呼叫。
void Perl_hv_riter_set(pTHX_ HV *hv, I32 riter)
refcounted_he_chain_2hv
生成並返回代表 refcounted_he
鏈的內容的 HV *
。目前未使用 flags
,必須為零。
HV * refcounted_he_chain_2hv(const struct refcounted_he *c,
U32 flags)
refcounted_he_fetch_pv
類似於 "refcounted_he_fetch_pvn",但接受以 null 結尾的字符串而不是字符串/長度對。
SV * refcounted_he_fetch_pv(const struct refcounted_he *chain,
const char *key, U32 hash, U32 flags)
refcounted_he_fetch_pvn
沿著 refcounted_he
鏈搜索由 keypv
和 keylen
指定的鍵的條目。如果 flags
設置了 REFCOUNTED_HE_KEY_UTF8
位,則鍵八位元組被解釋為 UTF-8,否則被解釋為 Latin-1。 hash
是鍵字符串的預計算哈希,如果未預計算,則為零。返回代表與鍵關聯的值的臨時標量,如果與鍵關聯的值不存在,則返回 &PL_sv_placeholder
。
SV * refcounted_he_fetch_pvn(const struct refcounted_he *chain,
const char *keypv, STRLEN keylen,
U32 hash, U32 flags)
refcounted_he_fetch_pvs
類似於 "refcounted_he_fetch_pvn",但接受文字字符串而不是字符串/長度對,且不接受預先計算的哈希。
SV * refcounted_he_fetch_pvs(const struct refcounted_he *chain,
"key", U32 flags)
refcounted_he_fetch_sv
類似於 "refcounted_he_fetch_pvn",但接受 Perl 标量而不是字符串/長度對。
SV * refcounted_he_fetch_sv(const struct refcounted_he *chain,
SV *key, U32 hash, U32 flags)
refcounted_he_free
將 refcounted_he
的引用計數減少一。如果引用計數達到零,則釋放結構的記憶體,這將(遞歸地)導致其父 refcounted_he
的引用計數減少。將 null 指針傳遞給此函數是安全的:在這種情況下不會採取任何操作。
void refcounted_he_free(struct refcounted_he *he)
refcounted_he_inc
增加 refcounted_he
的引用計數。還會返回指向 refcounted_he
的指針。將 null 指針傳遞給此函數是安全的:不會採取任何操作且返回 null 指針。
struct refcounted_he * refcounted_he_inc(
struct refcounted_he *he)
refcounted_he_new_pv
類似於 "refcounted_he_new_pvn",但接受以 null 結尾的字符串而不是字符串/長度對。
struct refcounted_he * refcounted_he_new_pv(
struct refcounted_he *parent,
const char *key, U32 hash,
SV *value, U32 flags)
refcounted_he_new_pvn
創建新的 refcounted_he
。這包括單個鍵/值對和對現有 refcounted_he
鏈的引用(可能為空),因此形成了一個更長的鏈。使用較長的鏈時,新的鍵/值對優先於鏈中更深處的相同鍵的任何條目。
新的金鑰由keypv
和keylen
指定。如果flags
設置了REFCOUNTED_HE_KEY_UTF8
位元,則將金鑰位元視為UTF-8;否則將其視為Latin-1。 hash
是金鑰字符串的預先計算哈希值,如果尚未預先計算,則為零。
value
是要存儲給此鍵的純量值。此函數會複製value
,因此不會擁有對其的任何引用,以後對純量的更改將不會反映在refcounted_he
中可見的值中。不會將複雜類型的純量以引用完整性形式存儲,而是會強制轉換為字符串。 value
可以是null或&PL_sv_placeholder
,表示不與該鍵關聯任何值;與鏈中後續的鍵的值的存在相比,這與任何非null值一樣優先。
parent
指向要附加到新的refcounted_he
的其余refcounted_he
鏈。此函數將parent
的一個引用的所有權,並返回新的refcounted_he
的一個引用。
struct refcounted_he * refcounted_he_new_pvn(
struct refcounted_he *parent,
const char *keypv,
STRLEN keylen, U32 hash,
SV *value, U32 flags)
refcounted_he_new_pvs
類似於"refcounted_he_new_pvn",但使用文字字符串而不是字符串/長度對,並且沒有預先計算的哈希。
struct refcounted_he * refcounted_he_new_pvs(
struct refcounted_he *parent,
"key", SV *value, U32 flags)
refcounted_he_new_sv
類似於"refcounted_he_new_pvn",但使用Perl純量而不是字符串/長度對。
struct refcounted_he * refcounted_he_new_sv(
struct refcounted_he *parent,
SV *key, U32 hash, SV *value,
U32 flags)
如果沒有人訪問具有長度len
的共享字符串str
,則將其釋放。
len
和hash
必須對str
都有效。
void unsharepvn(const char *sv, I32 len, U32 hash)
dirp_dup
復制目錄句柄,返回克隆對象的指針。
DIR * dirp_dup(DIR * const dp, CLONE_PARAMS * const param)
fp_dup
復制文件句柄,返回克隆對象的指針。
PerlIO * fp_dup(PerlIO * const fp, const char type,
CLONE_PARAMS * const param)
my_fflush_all
在某些平台上實現PERL_FLUSHALL_FOR_CHILD
。
I32 my_fflush_all()
my_mkostemp
如果可用,則是C庫mkostemp(3)
,否則是其Perl實現。
注意:my_mkostemp
必須明確調用為Perl_my_mkostemp
。
int Perl_my_mkostemp(char *templte, int flags)
my_mkstemp
如果可用,則是C庫mkstemp(3)
,否則是其Perl實現。
注意:my_mkstemp
必須明確調用為Perl_my_mkstemp
。
int Perl_my_mkstemp(char *templte)
PL_last_in_gv
用於文件處理程序輸入操作(<FH>
)的上一次使用的GV。
在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。
GV* PL_last_in_gv
PL_ofsgv
包含輸出字段分隔符*,
的glob - 在Perl空間中。
在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。
GV* PL_ofsgv
PL_rs
輸入記錄分隔符 - 在Perl空間中的$/
。
在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。
SV* PL_rs
start_glob
注意:start_glob
是實驗性功能,可能會在不通知的情況下更改或刪除。
被do_readline
調用的函數,用於生成一個glob(或在VMS上在perl內部進行glob)。此代碼曾經是內聯的,但現在perl使用File::Glob
,這個glob起始器僅在miniperl在構建過程中使用,或者當定義了PERL_EXTERNAL_GLOB時使用。將其移開將縮小pp_hot.c;縮小pp_hot.c有助於加快perl速度。
注意:start_glob
必須明確地作為Perl_start_glob
呼叫,並帶有aTHX_
參數。
PerlIO * Perl_start_glob(pTHX_ SV *tmpglob, IO *io)
整數中目前沒有內部API項目
輸入/輸出格式中目前沒有內部API項目
resume_compcv_and_save
恢復先前由suspend_compcv
函數暫停的緩衝區,以一種在範圍結束時將其重新暫停以便稍後再次使用的方式。這應該在ENTER
/LEAVE
作用域對中使用。
void resume_compcv_and_save(struct suspended_compcv *buffer)
resume_compcv_final
在最後一次被編譯為完整CV之前,恢復先前使用suspend_compcv
函數保存的解析器狀態。這應該在ENTER
/LEAVE
作用域對中使用。
void resume_compcv_final(struct suspended_compcv *buffer)
validate_proto
注意:validate_proto
是實驗性功能,可能會在不通知的情況下更改或刪除。
此函數對原型proto
執行語法檢查。如果warn
為真,任何非法字符或不匹配的括號都將觸發illegalproto警告,聲明它們在name
的原型中被檢測到。
返回值為true
,如果這是一個有效的原型,則返回false
,無論warn
是true
還是false
。
請注意,NULL
是一個有效的proto
,並且將始終返回true
。
bool validate_proto(SV *name, SV *proto, bool warn,
bool curstash)
目前在地域中沒有內部 API 項目
magic_clearhint
由%^H
的刪除觸發,將鍵記錄到PL_compiling.cop_hints_hash
。
int magic_clearhint(SV *sv, MAGIC *mg)
magic_clearhints
通過清除%^H
來觸發,重置PL_compiling.cop_hints_hash
。
int magic_clearhints(SV *sv, MAGIC *mg)
magic_methcall
調用一個魔法方法(如 FETCH)。
sv
和 mg
是被綁定的東西和綁定的魔法。
meth
是要調用的方法的名稱。
argc
是要傳遞給方法的參數數量(除了 $self)。
flags
可以是
G_DISCARD invoke method with G_DISCARD flag and don't
return a value
G_UNDEF_FILL fill the stack with argc pointers to
PL_sv_undef
參數本身是在flags
參數之後的任何值。
返回方法返回的 SV(如果有的話),否則失敗時返回NULL
。
注意:magic_methcall
必須作為帶有aTHX_
參數的Perl_magic_methcall
顯式調用。
SV * Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg,
SV *meth, U32 flags, U32 argc, ...)
magic_sethint
通過存儲到%^H
觸發,將鍵/值對記錄到PL_compiling.cop_hints_hash
。假設提示不存儲需要深層複製的任何內容。如果發現參考,也許我們應該發出警告。
int magic_sethint(SV *sv, MAGIC *mg)
mg_dup
從一個魔法鏈中複製,返回克隆對象的指針。
MAGIC * mg_dup(MAGIC *mg, CLONE_PARAMS * const param)
mg_localize
將現有 SV 的一些魔法複製到該 SV 的新本地化版本。容器魔法(例如%ENV
、$1
、tie
)被複製,值魔法不被複製(例如taint
、pos
)。
如果setmagic
為false,則新(空)SV 上將不調用設置魔法。這通常意味著很快就會進行賦值(例如,'local $x = $y'
),那將處理魔法。
void mg_localize(SV *sv, SV *nsv, bool setmagic)
calloc
實現了perlapi中的“Newxz
”,您應該改用該函數。
注意:calloc
必須作為Perl_calloc
顯式調用。
Malloc_t Perl_calloc(MEM_SIZE elements, MEM_SIZE size)
malloc
實現了perlapi中的“Newx
”,您應該改用該函數。
注意:必須明確呼叫 malloc
為 Perl_malloc
。
Malloc_t Perl_malloc(MEM_SIZE nbytes)
mfree
實現了perlapi 中的 "Safefree
",您應該改用此函式。
注意:必須明確呼叫 mfree
為 Perl_mfree
。
Free_t Perl_mfree(Malloc_t where)
realloc
實現了perlapi 中的 "Renew
",您應該改用此函式。
注意:必須明確呼叫 realloc
為 Perl_realloc
。
Malloc_t Perl_realloc(Malloc_t where, MEM_SIZE nbytes)
mro_get_linear_isa_dfs
返回給定 stash 的深度優先搜索線性化的 @ISA
。返回值是一個只讀的 AV*,其元素是字符串 SV,給出類名。level
應為 0(在此函式的遞迴中內部使用)。
如果您計劃將其存儲在任何半永久位置(否則可能在下次快取失效時被刪除),您負責對返回值進行 SvREFCNT_inc()
。
AV * mro_get_linear_isa_dfs(HV *stash, U32 level)
mro_isa_changed_in
在給定包的 @ISA
已更改時採取必要步驟(主要是快取失效)。由 setisa
magic 調用,不應直接調用。
void mro_isa_changed_in(HV *stash)
mro_package_moved
調用此函式以向 stash 發出信號,指示其已分配給 stash 階層中的另一個位置。stash
是已分配的 stash。oldstash
是其替換的 stash(如果有)。gv
是實際分配的 glob。
也可以使用空第一個參數調用此函式,以指示 oldstash
已被刪除。
此函式使舊 stash 上的 isa 快取、所有其內部的所有子包以及所有這些子包的子類的 isa 快取無效,包括在 stash
中具有相應條目的不存在的包。
它還根據需要設置所有 stash 的有效名稱(HvENAME
)。
如果 gv
存在且不在符號表中,則此函式僅返回。如果 flags & 1
,則將跳過此檢查。
void mro_package_moved(HV * const stash, HV * const oldstash,
const GV * const gv, U32 flags)
目前多重調用函式中沒有內部 API 項目。
isinfnansv
檢查當用作數字時,引數是否會是無窮大或 NaN
,但注意不要觸發非數字或未初始化警告。它假設調用者已經執行了 SvGETMAGIC(sv)
。
請注意,這始終接受尾隨的垃圾(類似於帶有 PERL_SCAN_TRAILING
的 grok_number_flags
),因此 "inferior"
和 "NAND gates"
將返回 true。
bool isinfnansv(SV *sv)
newATTRSUB_x
構造一個 Perl 子例程,同時執行一些周邊工作。
預期在 Perl 編譯上下文中調用此函數,並且子例程的某些方面是從與編譯相關的全局變量中取得的。特別地,PL_compcv
代表當前正在編譯的子例程。在調用此函數時,它必須為非空,並且正在構造的子例程的某些方面是從它那裡取得的。實際構造的子例程可能是 PL_compcv
對象的重複使用,但不一定如此。
如果 block
為空,則子例程將沒有主體,目前呼叫它會產生錯誤。這表示一個前向子例程聲明,例如 sub foo ($$);
。如果 block
不為空,則它提供子例程主體的 Perl 代碼,當呼叫子例程時將執行該代碼。此主體包括由子例程簽名或類似結果產生的任何參數解包代碼。代碼的 pad 使用必須對應到附加到 PL_compcv
的 pad。代碼不應包含 leavesub
或 leavesublv
op;此函數將添加此類 op。block
將被此函數消耗並成為構造的子例程的一部分。
proto
指定了子程式的原型,除非作為屬性提供(見下文)。如果 proto
為 null,則該子程式將沒有原型。如果 proto
不為 null,則它必須指向一個值為字符串的 const
op,並且子程式將具有該字符串作為其原型。如果原型作為屬性提供,則該屬性優先於 proto
,但在這種情況下,proto
最好為 null。在任何情況下,proto
都將被此函數消耗。
attrs
提供要應用於子程式的屬性。一些屬性通過內置方式生效,當見到時立即應用於 PL_compcv
。其他屬性則通過此路由被收集並附加到子程式上。attrs
可為 null 以不提供任何屬性,或者指向一個 const
op 以提供單個屬性,或者指向一個 list
op,其子元素除了 pushmark
外都是一個或多個屬性的 const
ops。每個 const
op 必須是一個字符串,給出屬性名稱,可選地後跟帶括號的參數,以 Perl 源代碼中屬性出現的方式。這些屬性將被此函數應用於子程式。attrs
將被此函數消耗。
如果 o_is_gv
為 false,並且 o
為 null,則該子程式將是匿名的。如果 o_is_gv
為 false,並且 o
不為 null,則 o
必須指向一個 const
OP,該 OP 將被此函數消耗,並且其字符串值提供子程式的名稱。名稱可以是合格的或不合格的,如果是不合格的,則某種方式將選擇默認存儲區。如果 o_is_gv
為 true,則 o
不指向任何 OP
,而是一個轉換指針,通過該指針將子程式命名為 GV
。
如果已經存在指定名稱的子程式,則新的子程式將取代現有的子程式或與現有的子程式合併。可能會生成有關重新定義的警告。
如果子程式具有特定的幾個名稱之一,例如 BEGIN
或 END
,則它將被相應隊列認領以自動運行與階段相關的子程式。在這種情況下,相關的 glob 將不包含任何子程式,即使它在此之前包含了一個子程式也是如此。在 BEGIN
的情況下,子程式將在此函數返回之前執行並且對其的引用被丟棄。
此函式返回指向構建的子程例程的指針。如果子程是匿名的,則將一個計數的對子程的引用權轉移給調用者。如果子程有名字,那麼調用者就不會獲得引用的所有權。在大多數這樣的情況下,如果子程具有非階段名稱,則子程將在返回時仍然存在,因為它被包含在命名它的全局變量中。通常,具有階段名稱的子程將通過階段的自動運行隊列擁有引用而存在。但是,一個已經執行過的 BEGIN 子程在此函式返回時很可能已經被銷毀,這使得調用者對返回的指針進行任何使用都是錯誤的。調用者有責任確保它知道這些情況中的哪一種。
CV * newATTRSUB_x(I32 floor, OP *o, OP *proto, OP *attrs,
OP *block, bool o_is_gv)
newXS_len_flags
構建一個 XS 子程,同時執行一些周邊工作。
該子程將具有進入點subaddr
。它將具有由空終止字符串proto
指定的原型,如果proto
為空則無原型。原型字符串將被複製;調用者可以在此後更改提供的字符串。如果filename
為非空,則它必須是一個空終止的文件名,並且子程將相應地設置其CvFILE
。默認情況下,CvFILE
被設置為直接指向提供的字符串,該字符串必須是靜態的。如果flags
設置了XS_DYNAMIC_FILENAME
位,則將採取字符串的副本。
子程的其他方面將保持其默認狀態。如果需要對子程進行其他操作以使其正常工作,則由調用者負責在此函式構建它之後執行該操作。但是,請注意在此函式返回之前子程可能已被銷毀,如下所述。
如果name
為空,則該子程將是匿名的,其CvGV
將參考到一個__ANON__
全局變量。如果name
不為空,則該子程將相應地命名,由相應的全局變量引用。name
是一個長度為len
字節的字符串,給出無符號符號名稱,如果flags
設置了SVf_UTF8
位則使用 UTF-8,否則使用 Latin-1。名稱可以是合格的或不合格的,對於gv_fetchpvn_flags
,預設情況下的暫存將默認為相同方式的預設情況。 flags
可以包含被gv_fetchpvn_flags
理解的標誌位,其含義與那裡的含義相同,例如GV_ADDWARN
。如果需要,該符號將始終添加到暫存中,並具有GV_ADDMULTI
語義。
如果已經存在指定名稱的子程序,則新的子程序將取代全域中的現有子程序。可能會生成有關重新定義的警告。如果舊的子程序是 CvCONST
,則是否發出警告的決定取決於新的子程序是否會成為具有類似值的常數的預期。該預期由 const_svp
確定。(請注意,對此函數的調用在任何情況下都不會將新的子程序設置為 CvCONST
;這由調用方決定。)如果 const_svp
為 null,則表示新的子程序將不會成為常數。如果 const_svp
為非空,則表示新的子程序將成為常數,並且它指向一個 SV*
,該指針提供了子程序將具有的常數值。
如果子程序具有一些特殊名稱之一,例如 BEGIN
或 END
,則將它們佇列給適當的階段相關子程序自動運行。在這種情況下,即使全域之前包含一個子程序,也會將相關的全域留空。對於 BEGIN
的情況,子程序將在此函數返回之前以及設置其原型之前執行並且參考將被處置。如果此函數無法足夠構造 BEGIN
子程序以便準備執行,則調用方必須通過給予子程序不同的名稱來防止發生這種情況。
此函式返回指向構建的子程例程的指針。如果子程是匿名的,則將一個計數的對子程的引用權轉移給調用者。如果子程有名字,那麼調用者就不會獲得引用的所有權。在大多數這樣的情況下,如果子程具有非階段名稱,則子程將在返回時仍然存在,因為它被包含在命名它的全局變量中。通常,具有階段名稱的子程將通過階段的自動運行隊列擁有引用而存在。但是,一個已經執行過的 BEGIN 子程在此函式返回時很可能已經被銷毀,這使得調用者對返回的指針進行任何使用都是錯誤的。調用者有責任確保它知道這些情況中的哪一種。
CV * newXS_len_flags(const char *name, STRLEN len,
XSUBADDR_t subaddr,
const char * const filename,
const char * const proto, SV ** const_svp,
U32 flags)
op_refcnt_lock
實現 OP_REFCNT_LOCK
宏,您應該使用它。
void op_refcnt_lock()
op_refcnt_unlock
實現 OP_REFCNT_UNLOCK
宏,您應該使用它。
void op_refcnt_unlock()
traverse_op_tree
返回在遍歷操作樹的深度優先遍歷中的下一個操作,當遍歷完成時返回 NULL。
初始調用必須將樹的根作為 top 和 o 兩者供應。
目前它是靜態的,但將來可能會向 API 公開。
OP * traverse_op_tree(OP *top, OP *o)
目前打包和解包中沒有內部 API 項目
CX_CURPAD_SAVE
將當前 pad 儲存在給定的上下文區塊結構中。
void CX_CURPAD_SAVE(struct context)
CX_CURPAD_SV
存取給定上下文區塊結構中已保存的當前墊片中偏移量po
處的SV(可以用作lvalue)。
SV * CX_CURPAD_SV(struct context, PADOFFSET po)
PAD_BASE_SV
在padlist的基本(DEPTH=1)墊片中從槽位po
獲取值。
SV * PAD_BASE_SV(PADLIST padlist, PADOFFSET po)
PAD_CLONE_VARS
克隆與運行和編譯墊片關聯的狀態變量。
void PAD_CLONE_VARS(PerlInterpreter *proto_perl,
CLONE_PARAMS* param)
PAD_COMPNAME_FLAGS
返回偏移量po
處當前編譯墊片名稱的標誌。假定有效的槽位輸入。
U32 PAD_COMPNAME_FLAGS(PADOFFSET po)
PAD_COMPNAME_GEN
當前編譯墊片中偏移量po
處名稱的生成號碼(lvalue)。
STRLEN PAD_COMPNAME_GEN(PADOFFSET po)
PAD_COMPNAME_GEN_set
將當前ling墊片中偏移量po
處名稱的生成號碼(lvalue)設置為gen
。
STRLEN PAD_COMPNAME_GEN_set(PADOFFSET po, int gen)
PAD_COMPNAME_OURSTASH
返回與our
變量關聯的stash。假定槽位輸入是有效的our
lexical。
HV * PAD_COMPNAME_OURSTASH(PADOFFSET po)
PAD_COMPNAME_PV
返回偏移量po
處當前編譯墊片名稱。假定有效的槽位輸入。
char * PAD_COMPNAME_PV(PADOFFSET po)
PAD_COMPNAME_TYPE
返回偏移量po
處當前編譯墊片名稱的類型(stash)。必須是有效的名稱。如果未定型,則返回null。
HV * PAD_COMPNAME_TYPE(PADOFFSET po)
PadnameIsFIELD
這是否為“field”變量。如果PADNAME為true,則可以通過PadnameFIELDINFO
獲得額外信息。
bool PadnameIsFIELD(PADNAME * pn)
PadnameIsOUR
這是否為“our”變量。
bool PadnameIsOUR(PADNAME * pn)
PadnameIsSTATE
這是否為“state”變量。
bool PadnameIsSTATE(PADNAME * pn)
PadnameOURSTASH
聲明此“our”變量的stash。
HV * PadnameOURSTASH(PADNAME * pn)
PadnameOUTER
此條目是否屬於外部墊片。這種情況下經常將其稱為“假”。
bool PadnameOUTER(PADNAME * pn)
PadnameTYPE
與類型化的語法結構相關聯的stash。這將返回%Foo::
哈希給my Foo $bar
。
HV * PadnameTYPE(PADNAME * pn)
PAD_RESTORE_LOCAL
將保存在本地變量opad
中的舊pad還原為PAD_SAVE_LOCAL()
保存的舊pad。
void PAD_RESTORE_LOCAL(PAD *opad)
PAD_SAVE_LOCAL
將當前pad保存到本地變量opad
,然後將當前pad設置為npad
。
void PAD_SAVE_LOCAL(PAD *opad, PAD *npad)
PAD_SAVE_SETNULLPAD
保存當前pad,然後將其設置為空。
void PAD_SAVE_SETNULLPAD()
PAD_SET_CUR
將當前pad設置為pad列表中的第n
個pad,保存上一個當前pad。注意:目前此宏擴展為一個對某些編譯器來說太長的字符串,所以最好替換為
SAVECOMPPAD();
PAD_SET_CUR_NOSAVE(padlist,n);
void PAD_SET_CUR(PADLIST padlist, I32 n)
PAD_SET_CUR_NOSAVE
類似於PAD_SET_CUR,但不保存。
void PAD_SET_CUR_NOSAVE(PADLIST padlist, I32 n)
PAD_SETSV
將當前pad中偏移量po
的槽設置為sv
。
SV * PAD_SETSV(PADOFFSET po, SV* sv)
PAD_SV
獲取當前pad中偏移量po
的值。
SV * PAD_SV(PADOFFSET po)
PAD_SVl
PAD_SV
的輕量級和lvalue版本。獲取或設置當前pad中偏移量po
的值。與PAD_SV
不同,不會使用-DX打印診斷信息。僅供內部使用。
SV * PAD_SVl(PADOFFSET po)
SAVECLEARSV
在作用域退出時清除指向的pad值。(即my
的運行操作)
void SAVECLEARSV(SV **svp)
SAVECOMPPAD
保存PL_comppad
和PL_curpad
。
void SAVECOMPPAD()
SAVEPADSV
保存一個pad槽(用於迭代後恢復)。
void SAVEPADSV(PADOFFSET po)
目前在密碼和群組訪問中沒有內部API項目。
目前在系統命令的路徑中沒有內部API項目。
目前在原型信息中沒有內部API項目。
regnode
詳見perlreguts。
目前報告與格式中沒有內部 API 項目
目前信號中沒有內部 API 項目
目前網站配置中沒有內部 API 項目
目前插座配置值中沒有內部 API 項目
目前源篩選器中沒有內部 API 項目
djSP
聲明僅為 SP
。這與 dSP
完全相同,並聲明了 perl 堆疊指針的本地副本,可以通過 SP
巨集訪問。請參見 "perlapi" 中的 "SP"
。(為與舊的(Perl 5.005)線程模型向後源代碼兼容而提供。)
djSP();
LVRET
如果此操作將是左值子例程的返回值,則為真
save_alloc
實現了 perlapi 中的 "SSNEW
" 等,應改用此函數。
SSize_t save_alloc(SSize_t size, I32 pad)
delimcpy_no_escape
將源緩衝區複製到目標緩衝區,停在源中第一次出現的分隔符字節(不包括)處。源是介於 from
和 from_end
- 1 字節之間。同樣,目標是從 to
到 to_end
。
複製的字節數寫入 *retlen
。
返回 from
緩衝區中的 delim
的位置,但如果在 from_end
之前沒有出現這樣的情況,則返回 from_end
,並將整個緩衝區 from
.. from_end
- 1 複製。
如果在複製後目標中有空間可用,則附加一個額外的終端安全 NUL
字節(不包含在返回的長度中)。
錯誤情況是目的地緩衝區大小不足以容納應複製的所有內容。在這種情況下,將寫入大於 to_end
- to
的值到 *retlen
,並將盡可能多的源寫入目的地。不足以容納安全的 NUL
不被視為錯誤。
char * delimcpy_no_escape(char *to, const char *to_end,
const char *from, const char *from_end,
const int delim, I32 *retlen)
my_cxt_init
實現了 "MY_CXT_INIT
" in perlxs 宏,應該使用這個宏。
模組首次加載時,全局的 PL_my_cxt_index
會增加,並將該值分配給該模組的靜態 my_cxt_index
(其地址作為參數傳遞)。然後,對於每個調用此函數的解譯器,它都會確保有一個 void*
槽可用於掛載靜態數據,通過分配或擴展解譯器的 PL_my_cxt_list
數組
注意:my_cxt_init
必須顯式調用為帶有 aTHX_
參數的 Perl_my_cxt_init
。
void * Perl_my_cxt_init(pTHX_ int *indexp, size_t size)
quadmath_format_needed
quadmath_format_needed()
如果 format
字符串似乎包含至少一個非 Q 前綴的 %[efgaEFGA]
格式指示符,則返回 true;否則返回 false。
格式指示符檢測不完整,但應該能檢測到大多數常見情況。
如果返回 true,則理論上這些參數應該使用 quadmath_snprintf()
處理,但如果有多個這樣的格式指示符(參見 "quadmath_format_valid"),並且如果還有其他任何內容(即使只是一個字節),則不能處理它們,因為 quadmath_snprintf()
非常嚴格,只接受一個格式指示符,不接受其他內容。在這種情況下,代碼可能應該失敗。
bool quadmath_format_needed(const char *format)
quadmath_format_valid
quadmath_snprintf()
對其 format
字符串非常嚴格,如果格式無效,則會失敗並返回 -1。它只接受一個格式指示符。
quadmath_format_valid()
檢查預期的單一規格是否合理:以 %
開始,只有一個 %
,以 [efgaEFGA]
結束,並在之前有 Q
。這不是完整的 "printf 語法檢查",只是基本的檢查。
如果有效則返回 true,否則返回 false。
另請參閱 "quadmath_format_needed"。
bool quadmath_format_valid(const char *format)
SVt_INVLIST
標量的類型標誌。參見 "perlapi 中的 svtype"。
PL_Sv
一個暫存的 SV,可以根據需要進行使用。主要由宏在無法使用 "perlapi 中的 PERL_USE_GCC_BRACE_GROUPS" 的平台上作為後備使用,在這些平台上,否則將對其 SV 參數進行多次評估。
但要注意,如果在使用它的情況下,有某些東西與使用它的其他東西位於呼叫堆疊中,則這個變量將被清除,導致難以診斷的錯誤。
PL_Sv
sv_add_arena
給定一塊內存,將其鏈接到競技場列表的頭部,並將其拆分為一系列的空閒 SV。
void sv_add_arena(char * const ptr, const U32 size,
const U32 flags)
sv_2bool
此宏僅由 sv_true()
或其宏等效物使用,僅當後者的參數既不是 SvPOK
、SvIOK
也不是 SvNOK
時才使用。它使用 SV_GMAGIC
標誌調用 sv_2bool_flags
。
bool sv_2bool(SV * const sv)
sv_2bool_flags
此函數僅由 sv_true()
和其相關函數使用,僅當後者的參數既不是 SvPOK
、SvIOK
也不是 SvNOK
時才使用。如果標誌包含 SV_GMAGIC
,則首先進行 mg_get()
。
bool sv_2bool_flags(SV *sv, I32 flags)
sv_clean_all
對剩餘的每個 SV 減少引用計數,可能觸發清理操作。可能需要多次調用此函數來釋放位於復雜自相關階層中的 SV。
I32 sv_clean_all()
sv_clean_objs
嘗試摧毀尚未釋放的所有對象。
void sv_clean_objs()
sv_free_arenas
釋放所有競技場使用的內存。請注意,必須已經釋放了競技場中的所有個別 SV 頭和體。
void sv_free_arenas()
sv_grow
擴展 SV 中的字符緩衝區。如有必要,使用 sv_unref
並將 SV 升級為 SVt_PV
。返回字符緩衝區的指針。請使用 SvGROW
封裝器。
char * sv_grow(SV * const sv, STRLEN newlen)
sv_grow_fresh
sv_grow_fresh
是 sv_grow 的簡化版本,僅用於當 sv 是新創建的 SVt_PV、SVt_PVIV、SVt_PVNV 或 SVt_PVMG 時。即 sv 具有默認標誌,從未是其他類型,且沒有現有字符串。基本上,只分配一個字符緩衝區並返回指向它的指針。
char * sv_grow_fresh(SV * const sv, STRLEN newlen)
sv_newref
增加 SV 的引用計數。請改用 SvREFCNT_inc()
包裝器。
SV * sv_newref(SV * const sv)
sv_2num
注意: sv_2num
是 實驗性 的,可能會在沒有通知的情況下更改或刪除。
返回具有源 SV 數值的 SV,進行任何必要的引用或重載轉換。調用方預期已處理好魔法獲取。
SV * sv_2num(SV * const sv)
sv_pv
請改用 SvPV_nolen
宏
char * sv_pv(SV *sv)
sv_pvbyte
請改用 SvPVbyte_nolen
宏。
char * sv_pvbyte(SV *sv)
sv_pvbyten_force
SvPVbytex_force
宏的後端。請始終使用該宏。如果 SV 無法從 UTF-8 降級,則會引發錯誤。
char * sv_pvbyten_force(SV * const sv, STRLEN * const lp)
sv_2pvbyte_nolen
返回 SV 的字節編碼表示的指針。可能會導致 SV 因副作用而從 UTF-8 降級。
通常通過 SvPVbyte_nolen
宏訪問。
char * sv_2pvbyte_nolen(SV *sv)
sv_pvn_force
以某種方式從 SV 中獲取合理的字符串。 SvPV_force
宏的私有實現,用於不能處理複雜宏表達式的編譯器。請始終使用該宏。
char * sv_pvn_force(SV *sv, STRLEN *lp)
sv_2pv_nolen
類似於 sv_2pv()
,但不返回長度。通常應改用宏包裝器 SvPV_nolen(sv)
。
char * sv_2pv_nolen(SV *sv)
sv_pvutf8n_force
SvPVutf8x_force
宏的後端。請始終使用該宏。
char * sv_pvutf8n_force(SV * const sv, STRLEN * const lp)
sv_2pvutf8_nolen
返回 SV 的 UTF-8 編碼表示的指針。可能會導致 SV 因副作用而升級為 UTF-8。
通常通過 SvPVutf8_nolen
宏訪問。
char * sv_2pvutf8_nolen(SV *sv)
sv_pvutf8
請改用 SvPVutf8_nolen
宏。
char * sv_pvutf8(SV *sv)
sv_tainted
測試一個 SV 是否被污染。請使用 SvTAINTED
。
bool sv_tainted(SV * const sv)
SvTHINKFIRST
一個快速的標誌檢查,用於確定是否應將 sv
傳遞給 sv_force_normal
以在直接修改 SvIVX
或 SvPVX
之前 "降級"。
例如,如果您的純量是一個引用,並且您想要修改 SvIVX
插槽,您不能只是執行 SvROK_off
,因為這將洩漏參考。
這是內部使用的,由各種修改 sv 的函數,如 sv_setsv
、sv_setiv
和 sv_pvn_force
。
這不處理的一種情況是沒有設置 SvFAKE 的 gv。在
if (SvTHINKFIRST(gv)) sv_force_normal(gv);
之後它仍然是一個 gv。
SvTHINKFIRST
有時會產生錯誤的陽性結果。在這些情況下,sv_force_normal
不做任何事情。
U32 SvTHINKFIRST(SV *sv)
sv_true
根據 Perl 的規則,如果 SV 具有真值,則返回 true。請改用 SvTRUE
宏,它可以調用 sv_true()
或使用內嵌版本。
I32 sv_true(SV * const sv)
sv_untaint
取消 SV 的污染。請改用 SvTAINTED_off
。
void sv_untaint(SV * const sv)
sv_taint
對 SV 進行污染。請改用 SvTAINTED_on
。
void sv_taint(SV *sv)
TAINT
如果我們不在污染檢查模式下,則不做任何操作;否則通知 "TAINT_set
" 和 "TAINT_PROPER
" 有一些未指定的元素被污染。
void TAINT()
TAINT_ENV
查看 %ENV
的多個組件是否被污染,並在任何一個被污染時調用 "taint_proper
"。它搜索的組件包括像 $PATH
之類的東西。
void TAINT_ENV
taint_env
實現 "TAINT_ENV" 宏,通常應使用該宏。
void taint_env()
TAINT_get
返回某個元素是否被污染的布爾值。
bool TAINT_get()
TAINTING_get
返回污染檢查是否已啟用的布爾值。
bool TAINTING_get()
TAINTING_set
開啟/關閉污染檢查模式。
void TAINTING_set(bool s)
TAINT_NOT
刪除以前由 例如 TAINT
設置的任何污染。
void TAINT_NOT()
TAINT_PROPER
若無元素受污染,則不執行任何操作;否則輸出一則訊息(包含 s
),指示存在污染違規。如果此類違規是致命的,則中斷。
void TAINT_PROPER(const char * s)
taint_proper
實現 "TAINT_PROPER" 宏,通常應改用此宏。
void taint_proper(const char *f, const char * const s)
TAINT_set
若 s
為真,則 "TAINT_get
" 返回真;若 s
為假,則返回假;
void TAINT_set(bool s)
TAINT_WARN_get
若污染違規為致命,則返回假;若只是警告,則返回真。
bool TAINT_WARN_get()
TAINT_WARN_set
s
為真表示應該返回污染違規僅為警告。
s
為假表示應該返回污染違規為致命。
void TAINT_WARN_set(bool s)
目前在時間中沒有內部 API 項目
目前在定義名稱中沒有內部 API 項目
bytes_from_utf8_loc
註: bytes_from_utf8_loc
是實驗性的,可能會在不通知的情況下更改或移除。
類似於 "perlapi 中的 bytes_from_utf8"()
,但需要額外的參數,指向存儲不能轉換為非 UTF8 的 "s"
中第一個字符位置的指針。
如果該參數為 NULL
,則此函數的行為與 bytes_from_utf8
完全相同。
否則,如果輸入時 *is_utf8p
為 0,則函數的行為與 bytes_from_utf8
完全相同,除了還將 *first_non_downgradable
設置為 NULL
。
否則,該函數返回一個新創建的以 NUL
結尾的字符串,其中包含 "s"
可轉換的第一部分的非 UTF8 等效。 *lenp
設置為其長度,不包括終止 NUL
。如果整個輸入字符串都被轉換,則 *is_utf8p
設置為 FALSE 值,並且 *first_non_downgradable
設置為 NULL
。
否則,*first_non_downgradable
設置為指向原始字符串中第一個未轉換的字符的第一個字節的指針。 *is_utf8p
不變。請注意,新字符串的長度可能為 0。
另一種觀點是,如果 *first_non_downgradable
不是 NULL
而且 *is_utf8p
是 TRUE,則此函式從 "s"
的開頭開始轉換盡可能多的字符,停在找到的第一個無法轉換為非 UTF-8 的字符。 *first_non_downgradable
被設置為指向該字符。函式返回可以轉換的部分,並以新創建的以 NUL
結束的字符串形式返回,並將 *lenp
設置為其長度,不包括終止的 NUL
。如果原始字符串的第一個字符無法轉換,*lenp
將為 0,並且新字符串將只包含一個 NUL
。如果整個輸入字符串已轉換,則將 *is_utf8p
設置為 FALSE,並將 *first_non_downgradable
設置為 NULL
。
成功返回後,可以通過在調用前保存 *lenp
的值並從調用後的 *lenp
值減去它來計算轉換部分的變體數量。
U8 * bytes_from_utf8_loc(const U8 *s, STRLEN *lenp,
bool *is_utf8p,
const U8 **first_unconverted)
find_uninit_var
注意: find_uninit_var
是 實驗性 的,可能會在不提前通知的情況下更改或刪除。
查找導致運算符發出“使用未初始化的值”警告的未定義變量(如果有)。如果 match 為 true,則只有在其值與 uninit_sv
匹配時才返回名稱。簡而言之,如果一元運算符(例如 OP_COS
)生成警告,則跟隨運算符的直接子節點可能會得到一個給出未定義變量名稱的 OP_PADSV
或 OP_GV
。另一方面,對於 OP_ADD
,有兩個分支可跟隨,因此僅在我們獲得精確匹配時才打印變量名。 desc_p
指向一個字符串指針,保存運算符的描述。如果需要,可以更新此描述。
名稱以致命 SV 形式返回。
假設 PL_op
是最初觸發錯誤的 OP,而 PL_comppad
/PL_curpad
指向當前執行的 pad。
SV * find_uninit_var(const OP * const obase,
const SV * const uninit_sv, bool match,
const char **desc_p)
isSCRIPT_RUN
返回一個布爾值,指示從 s
到 send
(不包括 send
)的字節序列是否形成“腳本運行”。如果 utf8_target
為 TRUE,則從 s
開始的序列將被視為 UTF-8。準確地說,除了下面給出的兩個退化情況外,此函式當且僅當其中的所有代碼點來自 Unicode 的“腳本擴展”屬性給出的三個“腳本”(Common、Inherited 和可能的其他一個)的任意組合時返回 TRUE。此外,所有十進制數字必須來自相同的連續 10 位序列。
舉例來說,如果序列中的所有字元都是希臘字母、常見字元或繼承字元,且其中任何十進位數字來自相同的常見數字區塊,此函數將返回 TRUE。(這些是ASCII數字 "0".."9",以及用於數學表示法的全形形式數字區塊和其他幾個)對於(不像希臘字母那樣)有自己定義數字的腳本,此函數將接受該集合中的數字或常見數字集合之一的數字,但不接受兩者的組合。一些腳本,如阿拉伯文,具有多個數字集。所有數字必須來自同一集合,此函數才會返回 TRUE。
*ret_script
,如果 ret_script
不是 NULL,在返回 TRUE 時將包含找到的腳本,使用 SCX_enum
typedef。如果函數返回 FALSE,其值將為 SCX_INVALID
。
如果序列為空,則返回 TRUE,但是如果要求 *ret_script
,則將為 SCX_INVALID
。
如果序列包含一個未分配給正在使用的 Unicode 版本中的字符的單個代碼點,則函數將返回 TRUE,並且腳本將為 SCX_Unknown
。輸入序列中的任何其他未分配代碼點的組合將導致函數將輸入視為非腳本運行。
如果所有代碼點都來自繼承腳本,則返回的腳本將是 SCX_Inherited
。
否則,如果所有代碼點都來自繼承腳本或常見腳本,則返回的腳本將是 SCX_Common
。
bool isSCRIPT_RUN(const U8 *s, const U8 *send,
const bool utf8_target)
is_utf8_non_invariant_string
如果 perlapi 中的 "is_utf8_invariant_string" 返回 FALSE,則對於字符串 s
的前 len
個字節,但它們仍然是合法的 Perl 擴展 UTF-8,則返回 TRUE;否則返回 FALSE。
返回 TRUE 意味著由序列表示的至少一個代碼點是無法表示為單個字節的寬字符,或者表示取決於序列是否編碼為 UTF-8。
另請參見 perlapi 中的 "is_utf8_invariant_string"
,perlapi 中的 "is_utf8_string"
bool is_utf8_non_invariant_string(const U8 * const s, STRLEN len)
utf8n_to_uvuni
已棄用!
打算在以後的 Perl 版本中移除 utf8n_to_uvuni
。請不要將其用於新代碼;從現有代碼中刪除它。
請改用 "utf8_to_uvchr_buf" 在 perlapi 中使用,或極少使用 "utf8n_to_uvchr" 在 perlapi 中使用。
這個函式在想要處理具有 Unicode 屬性的 EBCDIC 和 ASCII 平台的程式碼中很有用,但從 Perl v5.20 開始,平台之間的差異對大多數程式碼都幾乎不可見,所以這個函式很不可能是您想要的。如果您確實需要這個精確的功能,請改用 NATIVE_TO_UNI(utf8_to_uvchr_buf(...))
或 NATIVE_TO_UNI(utf8n_to_uvchr(...))
。
UV utf8n_to_uvuni(const U8 *s, STRLEN curlen, STRLEN *retlen,
U32 flags)
utf8_to_uvuni
已棄用!
打算在未來的 Perl 發行版中移除 utf8_to_uvuni
。請勿在新程式碼中使用它;從現有程式碼中移除它。
返回假設為 UTF-8 編碼的字串 s
中第一個字符的 Unicode 代碼點;retlen
將設置為該字符的長度,以字節為單位。
有些 UTF-8 畸形會被檢測到,但並非所有,實際上,一些畸形的輸入可能導致讀取超出輸入緩衝區的末尾,這就是為什麼這個函式被棄用的原因之一。另一個原因是,只有在極其有限的情況下,Unicode 與本機代碼點才對您有興趣。
如果 s
指向被檢測到的某些畸形,並且已啟用 UTF8 警告,則返回零,並且如果 retlen
不是 NULL,則將 *retlen
設置為 -1。如果關閉了這些警告,則返回的計算值(如果有明確定義)(或 Unicode 替換字符,如果沒有)將被靜默返回,並且如果 retlen
不是 NULL,則設置 *retlen
,以便 (s
+ *retlen
) 是在 s
中可能開始非畸形字符的下一個位置。有關何時返回 REPLACEMENT CHARACTER 的詳細信息,請參閱 perlapi 中的 "utf8n_to_uvchr"。
UV utf8_to_uvuni(const U8 *s, STRLEN *retlen)
uvoffuni_to_utf8_flags
此函式應僅在非常特殊的情況下使用。相反,幾乎所有程式碼應使用 perlapi 中的 "uvchr_to_utf8" 或 perlapi 中的 "uvchr_to_utf8_flags"。
這個函式就像它們一樣,但輸入是嚴格的 Unicode(而不是本機)代碼點。只有在非常罕見的情況下,代碼才不應該使用本機代碼點。
有關詳細信息,請參閱 perlapi 中的 "uvchr_to_utf8_flags" 的描述。
U8 * uvoffuni_to_utf8_flags(U8 *d, UV uv, UV flags)
valid_utf8_to_uvchr
像在 perlapi 中的 "utf8_to_uvchr_buf"
一樣,但應該只在已知輸入 UTF-8 字串 s
中的下一個字元是良好形式(例如,它通過 "perlapi 中的 isUTF8_CHAR"
)時才呼叫。允許替代字元、非字元碼點和非 Unicode 碼點。
UV valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen)
variant_under_utf8_count
此函式檢查位於 s
和 e
之間的位元組序列,假設它們編碼為 ASCII/Latin1,並返回當字串被翻譯為 UTF-8 時,多少個位元組會發生變化。由於 UTF-8 的性質,每個位元組將佔用兩個位元組,而不是輸入字串中的單個位元組。因此,此函式返回字串在翻譯為 UTF-8 時擴展的確切位元組數。
與大多數名稱中帶有 utf8
的其他函式不同,此函式的輸入不是 UTF-8 編碼的字串。函式名稱略微奇怪,以強調這一點。
此函式是 Perl 內部的,因為 khw 認為任何想要這個函式的 XS 代碼可能與內部操作過於接近。提供有效的使用案例可能會改變這一點。
另請參閱 "perlapi 中的 is_utf8_invariant_string"
和 "perlapi 中的 is_utf8_invariant_string_loc"
。
Size_t variant_under_utf8_count(const U8 * const s,
const U8 * const e)
my_popen_list
在某些系統上實現 PerlProc_popen_list() 上的函式
PerlIO * my_popen_list(const char *mode, int n, SV **args)
my_socketpair
在沒有的系統上模擬 socketpair(2),但是具有足夠的功能來進行模擬。
int my_socketpair(int family, int type, int protocol, int fd[2])
目前版本控制中沒有內部 API 項目
deprecate
封裝 Perl_ck_warner_d() 以在給定類別中產生已棄用的警告和相應的消息。 message
參數必須是 C 字串。字符串 " 已棄用" 將自動添加到 message
的末尾。
deprecate(U32 category, "message")
deprecate_disappears_in
對Perl_ck_warner_d()進行封裝,以在給定類別中產生一個已廢棄警告,並提供一個適當的訊息,指出訊息所指涉的結構將在特定版本中消失。 when
和 message
參數必須是 C 字串。 when
字串預期應為 "5.40" 的形式,版本中不包含次要元素。 實際的訊息輸出將是以下表達式的結果 message "已廢棄,並將在 Perl 中消失" when
這就是為什麼 message
和 when
必須是字面 C 字串。
deprecate_disappears_in(U32 category, "when", "message")
deprecate_fatal_in
對Perl_ck_warner_d()進行封裝,以在給定類別中產生一個已廢棄警告,並提供一個適當的訊息,指出訊息所指涉的結構將在特定版本中變為致命。 when
和 message
參數必須是 C 字串。 when
字串預期應為 "5.40" 的形式,版本中不包含次要元素。 實際的訊息輸出將是以下表達式的結果 message "已廢棄,並將在 Perl 中變為致命" when
這就是為什麼 message
和 when
必須是字面 C 字串。
deprecate_fatal_in(U32 category, "when", "message")
PL_dowarn
這個 C 變數大致對應於Perl的 $^W
警告變數。 然而, $^W
被視為布林值,而 PL_dowarn
是一組標誌位。
在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。
U8 PL_dowarn
report_uninit
打印適當的 "使用未初始化的變數" 警告。
void report_uninit(const SV *uninit_sv)
目前在 XS 中沒有內部 API 項目
此部分列出了其他未記錄的元素。 如果您使用其中任何一個,請考慮創建並提交相應的文檔。
實驗性和已廢棄的未記錄元素分別列在最後。
abort_execution
add_above_Latin1_folds
add_cp_to_invlist
_add_range_to_invlist
allocmy
amagic_cmp
amagic_cmp_desc
amagic_cmp_locale
amagic_cmp_locale_desc
amagic_i_ncmp
amagic_i_ncmp_desc
amagic_is_enabled
amagic_ncmp
amagic_ncmp_desc
any_dup
append_utf8_from_native_byte
apply
atfork_lock
atfork_unlock
av_arylen_p
av_extend_guts
av_iter_p
av_nonelem
av_reify
bind_match
block_gimme
boot_core_builtin
boot_core_mro
boot_core_PerlIO
boot_core_UNIVERSAL
build_infix_plugin
_byte_dump_string
call_list
cando
capture_clear
cast_iv
cast_i32
cast_ulong
cast_uv
check_hash_fields_and_hekify
check_regnode_after
check_utf8_print
ck_anoncode
ck_backtick
ck_bitop
ck_cmp
ck_concat
ck_defined
ck_delete
ck_each
ck_entersub_args_core
ck_eof
ck_eval
ck_exec
ck_exists
ck_ftst
ck_fun
ck_glob
ck_grep
ck_helemexistsor
ck_index
ck_isa
ck_join
ck_length
ck_lfun
ck_listiob
ck_match
ck_method
ck_null
ck_open
ck_prototype
ck_readline
ck_refassign
ck_repeat
ck_require
ck_return
ck_rfun
ck_rvconst
ck_sassign
ck_select
ck_shift
ck_smartmatch
ck_sort
ck_spair
ck_split
ck_stringify
ck_subr
ck_substr
ck_svconst
ck_tell
ck_trunc
ck_trycatch
ckwarn
ckwarn_d
class_add_ADJUST
class_add_field
class_apply_attributes
class_apply_field_attributes
class_prepare_initfield_parse
class_prepare_method_parse
class_seal_stash
class_set_field_defop
class_setup_stash
class_wrap_method_body
clear_defarray
closest_cop
cmpchain_extend
cmpchain_finish
cmpchain_start
cmp_desc
cmp_locale_desc
cntrl_to_mnemonic
construct_ahocorasick_from_trie
cop_file_avn
coresub_op
croak_caller
croak_kw_unless_class
croak_memory_wrap
croak_no_mem
croak_popstack
csighandler
csighandler1
csighandler3
current_re_engine
custom_op_get_field
cv_clone_into
cv_const_sv_or_av
cvgv_from_hek
cvgv_set
cvstash_set
cv_undef_flags
cx_dump
cx_dup
cxinc
deb_stack_all
debstackptrs
debug_hash_seed
debug_peep
debug_show_study_flags
debug_studydata
defelem_target
despatch_signals
die_unwind
do_aexec
do_aexec5
do_aspawn
do_eof
does_utf8_overflow
do_exec
do_exec3
dofile
do_gv_dump
do_gvgv_dump
do_hv_dump
doing_taint
do_ipcctl
do_ipcget
do_magic_dump
do_msgrcv
do_msgsnd
do_ncmp
do_op_dump
do_pmop_dump
do_print
do_readline
doref
do_seek
do_semop
do_shmio
do_spawn
do_spawn_nowait
do_sv_dump
do_sysseek
do_tell
do_trans
do_uniprop_match
do_vecget
do_vecset
do_vop
drand48_init_r
drand48_r
dtrace_probe_call
dtrace_probe_load
dtrace_probe_op
dtrace_probe_phase
dump_all_perl
dump_indent
dump_packsubs_perl
dump_sub_perl
dump_sv_child
dumpuntil
dump_vindent
dup_warnings
find_first_differing_byte_pos
find_lexical_cv
find_runcv_where
find_script
foldEQ_latin1_s2_folded
foldEQ_latin1
foldEQ_utf8_flags
force_locale_unlock
_force_out_malformed_utf8_message
form_alien_digit_msg
form_cp_too_large_msg
free_tied_hv_pool
free_tmps
get_and_check_backslash_N_name
get_ANYOFHbbm_contents
get_ANYOFM_contents
get_db_sub
get_debug_opts
get_deprecated_property_msg
getenv_len
get_extended_os_errno
get_hash_seed
get_invlist_iter_addr
get_invlist_offset_addr
get_invlist_previous_index_addr
get_mstats
get_prop_definition
get_prop_values
get_regclass_aux_data
get_re_gclass_aux_data
get_regex_charset_name
get_win32_message_utf8ness
gp_free
gp_ref
grok_bin_oct_hex
grok_bslash_c
grok_bslash_o
grok_bslash_x
gv_check
gv_fetchmeth_internal
gv_override
gv_setref
gv_stashpvn_internal
he_dup
hek_dup
hfree_next_entry
hv_auxalloc
hv_common
hv_common_key_len
hv_delayfree_ent
hv_free_ent
hv_placeholders_p
hv_pushkv
hv_rand_set
hv_undef_flags
infix_plugin_standard
init_argv_symbols
init_constants
init_dbargs
init_debugger
init_i18nl10n
init_named_cv
init_stacks
init_tm
init_uniprops
_inverse_folds
invert
invlist_array
_invlist_array_init
invlist_clear
invlist_clone
_invlist_contains_cp
invlist_contents
_invlist_dump
_invlistEQ
invlist_extend
invlist_highest
_invlist_intersection
_invlist_intersection_maybe_complement_2nd
_invlist_invert
invlist_is_iterating
invlist_iterfinish
invlist_iterinit
invlist_iternext
_invlist_len
invlist_max
invlist_previous_index
_invlist_search
invlist_set_len
invlist_set_previous_index
_invlist_subtract
invlist_trim
_invlist_union
_invlist_union_maybe_complement_2nd
invmap_dump
invoke_exception_hook
io_close
isFF_overlong
is_grapheme
_is_in_locale_category
is_invlist
is_ssc_worth_it
_is_uni_FOO
_is_uni_perl_idcont
_is_uni_perl_idstart
is_utf8_char_helper_
is_utf8_common
is_utf8_FF_helper_
_is_utf8_FOO
is_utf8_overlong
_is_utf8_perl_idcont
_is_utf8_perl_idstart
jmaybe
join_exact
keyword
keyword_plugin_standard
list
load_charnames
locale_panic
localize
lossless_NV_to_IV
lsbit_pos32
lsbit_pos64
magic_clear_all_env
magic_cleararylen_p
magic_clearenv
magic_clearhook
magic_clearhookall
magic_clearisa
magic_clearpack
magic_clearsig
magic_copycallchecker
magic_existspack
magic_freearylen_p
magic_freecollxfrm
magic_freemglob
magic_freeovrld
magic_freeutf8
magic_get
magic_getarylen
magic_getdebugvar
magic_getdefelem
magic_getnkeys
magic_getpack
magic_getpos
magic_getsig
magic_getsubstr
magic_gettaint
magic_getuvar
magic_getvec
magic_killbackrefs
magic_nextpack
magic_regdata_cnt
magic_regdatum_get
magic_regdatum_set
magic_scalarpack
magic_set
magic_set_all_env
magic_setarylen
magic_setcollxfrm
magic_setdbline
magic_setdebugvar
magic_setdefelem
magic_setenv
magic_sethook
magic_sethookall
magic_setisa
magic_setlvref
magic_setmglob
magic_setnkeys
magic_setnonelem
magic_setpack
magic_setpos
magic_setregexp
magic_setsig
magic_setsigall
magic_setsubstr
magic_settaint
magic_setutf8
magic_setuvar
magic_setvec
magic_sizepack
magic_wipepack
make_trie
malloced_size
malloc_good_size
markstack_grow
mbtowc_
mem_collxfrm_
mem_log_alloc
mem_log_del_sv
mem_log_free
mem_log_new_sv
mem_log_realloc
mg_find_mglob
mg_size
mode_from_discipline
more_bodies
more_sv
moreswitches
mortal_getenv
mortalized_pv_copy
mro_get_private_data
mro_meta_dup
mro_meta_init
msbit_pos32
msbit_pos64
multiconcat_stringify
multideref_stringify
my_atof2
my_atof3
my_attrs
my_clearenv
my_lstat
my_lstat_flags
my_memrchr
my_mkostemp_cloexec
my_mkstemp_cloexec
my_stat
my_stat_flags
my_strerror
my_strftime8_temp
my_unexec
newFORM
_new_invlist
_new_invlist_C_array
newMETHOP_internal
newMYSUB
newPROG
new_stackinfo
newSTUB
newSVavdefelem
newXS_deffile
nextargv
no_bareword_allowed
no_bareword_filehandle
noperl_die
notify_parser_that_changed_to_utf8
oopsAV
oopsHV
op_clear
op_integerize
op_lvalue_flags
opmethod_stash
op_prune_chain_head
op_relocate_sv
opslab_force_free
opslab_free
opslab_free_nopad
op_std_init
op_varname
package
package_version
pad_add_weakref
padlist_store
padname_free
PadnameIN_SCOPE
padnamelist_free
parser_dup
parser_free
parser_free_nexttoke_ops
parse_unicode_opts
path_is_searchable
peep
perl_alloc_using
perl_clone_using
PerlEnv_putenv
PerlIO_context_layers
PerlIO_restore_errno
PerlIO_save_errno
PerlLIO_dup_cloexec
PerlLIO_dup2_cloexec
PerlLIO_open_cloexec
PerlLIO_open3_cloexec
PerlProc_pipe_cloexec
PerlSock_accept_cloexec
PerlSock_socket_cloexec
PerlSock_socketpair_cloexec
perly_sighandler
pmruntime
POPMARK
populate_anyof_bitmap_from_invlist
populate_bitmap_from_invlist
populate_invlist_from_bitmap
populate_isa
pregfree
pregfree2
ptr_hash
qerror
ReANY
reentrant_free
reentrant_init
reentrant_retry
reentrant_size
re_exec_indentf
ref
reg_add_data
regcurly
regdump
regdupe_internal
regexec_flags
regfree_internal
reginitcolors
reg_named_buff
reg_named_buff_all
reg_named_buff_exists
reg_named_buff_fetch
reg_named_buff_firstkey
reg_named_buff_iter
reg_named_buff_nextkey
reg_named_buff_scalar
regnext
regnode_after
reg_numbered_buff_fetch
reg_numbered_buff_fetch_flags
reg_numbered_buff_length
reg_numbered_buff_store
regprop
reg_qr_package
reg_skipcomment
reg_temp_copy
re_indentf
re_intuit_start
re_intuit_string
re_op_compile
report_evil_fh
report_redefined_cv
report_wrongway_fh
re_printf
rpeep
rsignal_restore
rsignal_save
rvpv_dup
rxres_save
same_dirent
save_bool
save_clearsv
save_delete
save_destructor
save_destructor_x
save_freeop
save_freepv
save_freesv
save_int
save_iv
save_I8
save_I16
save_I32
save_mortalizesv
save_pptr
save_pushi32ptr
save_pushptrptr
save_re_context
save_sptr
savestack_grow
savestack_grow_cnt
save_strlen
sawparens
scalar
scalarvoid
scan_commit
scan_num
seed
set_ANYOF_arg
set_caret_X
setfd_cloexec
setfd_cloexec_for_nonsysfd
setfd_cloexec_or_inhexec_by_sysfdness
setfd_inhexec
setfd_inhexec_for_sysfd
set_numeric_standard
set_numeric_underlying
set_padlist
_setup_canned_invlist
share_hek
should_warn_nl
should_we_output_Debug_r
sighandler
sighandler1
sighandler3
single_1bit_pos32
single_1bit_pos64
Slab_Alloc
Slab_Free
Slab_to_ro
Slab_to_rw
softref2xv
sortsv_flags_impl
ssc_finalize
ssc_init
stack_grow
str_to_version
strxfrm
study_chunk
sub_crush_depth
sv_add_backref
sv_buf_to_ro
sv_del_backref
sv_i_ncmp
sv_i_ncmp_desc
sv_2iv
sv_magicext_mglob
sv_ncmp
sv_ncmp_desc
sv_only_taint_gmagic
sv_or_pv_pos_u2b
sv_pvbyten_force_wrapper
sv_pvutf8n_force_wrapper
sv_resetpvn
sv_sethek
SvTRUE_common
sv_unglob
sv_2uv
switch_locale_context
sys_init
sys_init3
sys_intern_clear
sys_intern_dup
sys_intern_init
sys_term
tied_method
tmps_grow_p
_to_fold_latin1
TOPMARK
to_uni_fold
_to_uni_fold_flags
to_uni_lower
to_uni_title
to_uni_upper
_to_upper_title_latin1
_to_utf8_fold_flags
_to_utf8_lower_flags
_to_utf8_title_flags
_to_utf8_upper_flags
translate_substr_offsets
try_amagic_bin
try_amagic_un
uiv_2buf
unlnk
unshare_hek
unwind_paren
_utf8n_to_uvchr_msgs_helper
utf16_to_utf8_base
utf16_to_utf8_reversed
utf16_to_utf8
utf8_to_uvchr_buf_helper
utilize
uvoffuni_to_utf8_flags_msgs
uvuni_to_utf8
variant_byte_number
varname
vivify_defelem
vivify_ref
wait4pid
warn_elem_scalar_context
_warn_problematic_locale
was_lvalue_sub
watch
win32_croak_not_implemented
write_to_stderr
xs_boot_epilog
xs_handshake
yyerror
yyerror_pv
yyerror_pvn
yylex
yyparse
yyquit
yyunlex
接下來是實驗性的未記錄元素
alloc_LOGOP cx_pushloop_for invlist_lowest
create_eval_scope cx_pushloop_plain newGP
cv_ckproto_len_flags cx_pushsub new_warnings_bitfield
cx_popblock cx_pushtry op_refcnt_dec
cx_popeval cx_pushwhen op_refcnt_inc
cx_popformat cx_topblock op_unscope
cx_popgiven delete_eval_scope scan_str
cx_poploop do_open_raw scan_word
cx_popsub do_open6 scan_word6
cx_popsub_args emulate_cop_io skipspace_flags
cx_popsub_common get_re_arg sv_free2
cx_popwhen get_vtbl sv_kill_backrefs
cx_pushblock gimme_V sv_setpv_freshbuf
cx_pusheval hv_backreferences_p sv_setsv_cow
cx_pushformat hv_kill_backrefs utf8_to_utf16_base
cx_pushgiven invlist_highest_range_start
最後是已廢棄的未記錄元素。 不要在新代碼中使用任何一個;從現有代碼中刪除所有這些出現。
get_no_modify get_opargs get_ppaddr
自動文檔系統最初由 Benjamin Stuhl 添加到 Perl 核心中。文檔由那些友善地記錄他們的函數的人提供。
config.h、perlapi、perlapio、perlcall、perlclib、perlembed、perlfilter、perlguts、perlhacktips、perlinterp、perliol、perlmroapi、perlreapi、perlreguts、perlxs