1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
//! Embedded apidoc data management
//!
//! ビルド時にダウンロードされた apidoc.tar.gz をバイナリに埋め込み、
//! ランタイムで展開してキャッシュディレクトリに保存する。
use fs;
use ;
use PathBuf;
use OnceLock;
use GzDecoder;
use Archive;
/// apidoc データのバージョン(build.rs と一致させる)
/// 1.1: PAD_SET_CUR / PAD_SET_CUR_NOSAVE / PAD_BASE_SV の
/// arg_type_override 追加 (pad.h apidoc の `PADLIST padlist` ポインタ抜け)
/// 1.2: MUTABLE_* の arg_type_override (void *) と AvFILL の return override (SSize_t) 追加
/// 1.3: add_decl 追加 (MUTABLE_* 一族 / AvARRAY / AvFILLp — 5.34 未満のヘッダに
/// 無い宣言を補い、旧 perl での Cv/Hv 一族 cascade 消滅を解消) と
/// AvFILLp の return override (5.32 の `int` 宣言を SSize_t に訂正)
/// 1.4: Pad*/Padlist*/Padnamelist* の arg_type_override 12 件
/// (<=5.30 の pad.h apidoc のポインタ `*` 抜け。5.32 で上流修正済み
/// = 新しい版では同値・無害)
/// 1.5: Xop*/Bhk*/CALL_BLOCK_HOOKS の `which` 引数に `token` 注釈 10 件
/// (<=5.36 の op.h apidoc は token 注釈を欠き、token-pasting マクロが
/// 呼び出し扱いされて OP_CLASS 等が cascade 消滅。5.38 で上流修正済み)
/// 1.6: v5.32/v5.34.patches.json の auto-generated skip リストを 1.3〜1.5 の
/// 根本修正後に下流ビルド実走で再評価し、まだ失敗するもののみに縮小
/// 1.7: 再評価の結果を反映 — CvDEPTH の return override (embed.fnc エントリは
/// Perl_CvDEPTH の記述で、deref するマクロ側は I32) と Perl_atof の
/// skip (5.32/5.34 ヘッダの aTHX_ 抜け、5.36 で上流修正) を登録
/// 1.8: 再評価で残った真の失敗のみをクラス別理由付きで skip_codegen に再登録
/// (5.32: 16 件、5.34: 21 件 — 戻り値位置ポインタキャスト欠落 /
/// bool・int 変換残渣 / 個別型不一致。旧 auto-generated 44/52 件から縮小)
/// 1.9: v5.44.json 追加 (perl 5.44.0 の embed.fnc から --apidoc-to-json で
/// 生成、2059 entries — issue #6)
/// 1.10: v5.44.patches.json 新設 — hv_stores の第 3 引数を SV * に訂正
/// (5.44 で追加された apidoc_defn が `U32 flags` と誤記している上流バグ)
/// 1.11: Padname* アクセサ 10 件の arg_type_override (<=5.30 pad.h の `*` 抜け、
/// 5.32 で上流修正) を common に追加。v5.20/v5.22.patches.json 新設 —
/// 下流実走再評価で残った真の失敗のみをクラス別理由付きで skip 登録
/// (Perl_atof の aTHX_ 抜け / 旧ハッシュ inline 群 / bool・cast 残渣)
/// 1.12: v5.20 に PAD_RESTORE_LOCAL / PAD_COMPNAME_* の 4 件を追加 (5.20 固有の
/// マクロ形状。take4 の下流実走で判明)
/// 1.13: v5.34/v5.36 の CopLINE 系 skip_codegen 3 件を return_type_override
/// line_t 1 件に置換 (cop.h の `=for apidoc Am|STRLEN|CopLINE|...` 誤記が
/// 原因。5.38 で上流修正。CopLINE_inc/_dec は CopLINE から推論されるため
/// 連動して復活。CopLINE_set は 5.38 以降と同じ CODEGEN_INCOMPLETE)
/// 1.14: v5.28/v5.30 の auto-generated skip 6 件ずつ (S_SvREFCNT_dec{,_NN} /
/// PadlistARRAY / PadlistMAX / PadlistNAMESARRAY / PadlistNAMESMAX) を
/// 下流ビルド実走再評価で解除 (0.1.8〜0.1.10 の型推論改善で解消済み
/// だった)。SvREFCNT_dec / PAD_SET_CUR 等が連動して復活。
/// Perl_SvREFCNT_dec という名前自体は 5.32 の inline 関数改名で登場
/// したもので <=5.30 には存在しない (expect の must_not_generate に記録)。
/// また common の RCPV_* return_type_override 4 件を 5.36 以前の各版で
/// `kind: "remove"` により打ち消し (RCPV_* は 5.38 生まれ。それ以前は
/// target 不在の MISS 警告ノイズになるだけだった — issue #17。
/// v5.24.patches.json はこの打ち消しのために新設)
/// 1.15: 5.20〜5.26 downstream green 化ラウンド (doc/plan/round-5.20-5.26.md)。
/// v5.26 の auto-generated skip 62 件を下流ビルド実走で再評価し 17 件を
/// 恒久解除 (Padlist* 4 / S_SvREFCNT_dec{,_NN} / Padname·Padnamelist 全 8 /
/// CxLABEL / isUTF8_CHAR_flags / S_is_utf8_fixed_width_buf_loclen_flags。
/// 連鎖で SvREFCNT_dec / PAD_SET_CUR 等も復活。PAD_SET_CUR は downstream
/// の実 bindgen bindings なら non-threaded でも生成される — multi-perl
/// smoke で nt 不生成に見えるのは threaded スナップショット
/// samples/bindings.rs に PL_comppad グローバルが無い harness 制限)。
/// 真の失敗 12 件はクラス別理由付きで再登録し、初露出の sv_collxfrm
/// (上流 sv.h の typo: sv_cmp_flags を呼ぶ。5.34 で修正) を skip 新設。
/// v5.28/v5.30 の Padname* 8 件ずつも同根 (data 1.11 で解消済み) として解除。
/// v5.24 に skip 21 件を採取・登録 (0.1.7 時代の auto 採取から 5.24 leg
/// だけが漏れていた — hash inline 7 / Perl_atof / 残渣クラス 9 /
/// RX_* 3 / sv_collxfrm)。v5.22 に GvALIASED_SV_{on,off} の skip 2 件
/// (gp_flags ビットフィールドのアクセサが代入 LHS になる E0067、5.22 のみ)。
/// v5.20 に Padname*REFCNT{,_dec} の remove 4 件 (5.20 に API 不在で
/// common override が MISS ノイズになるだけ — issue #17 と同型)。
/// v5.20〜v5.32 の sv_collxfrm skip の reason を正確な原因に更新。
pub const APIDOC_DATA_VERSION: &str = "1.16";
/// 埋め込まれた apidoc.tar.gz データ
const EMBEDDED_APIDOC: & = include_bytes!;
/// キャッシュされた apidoc ディレクトリのパス
static CACHED_APIDOC_DIR: = new;
/// apidoc データのキャッシュディレクトリを取得
///
/// 初回呼び出し時に埋め込みデータを展開してキャッシュする。
/// 既にキャッシュが存在する場合はそれを返す。
///
/// # Returns
/// - `Some(PathBuf)`: 展開された apidoc ディレクトリへのパス
/// - `None`: 展開に失敗した場合
/// キャッシュディレクトリのベース候補を優先度順で列挙
///
/// 1. `LIBPERL_APIDOC_CACHE_DIR` — ユーザの明示 override
/// 2. `OUT_DIR` — build-script ランタイムでは確実に書き込み可能。
/// docs.rs / 他 sandboxed 環境はここで成功する。
/// 3. `HOME/.cache` (Linux) / `Library/Caches` (macOS) /
/// `LOCALAPPDATA` (Windows) — 普段の dev 環境はここでヒット。
/// 再ビルド間でキャッシュが効くので速い。
/// 4. `std::env::temp_dir()` — 最後の砦。書き込み可だが揮発的。
///
/// 全候補を試して書き込みに成功した最初のものを採用する。
/// apidoc データを展開してキャッシュ
///
/// 候補ディレクトリを順に試し、書き込みに成功したものを採用。
/// 全候補で失敗したら最後のエラーを返す。
/// 単一の cache_base で展開を試みる