chore: Phase 25.1 完了 - LoopForm v2/Stage1 CLI/環境変数削減 + Phase 26-D からの変更

Phase 25.1 完了成果:
-  LoopForm v2 テスト・ドキュメント・コメント完備
  - 4ケース(A/B/C/D)完全テストカバレッジ
  - 最小再現ケース作成(SSAバグ調査用)
  - SSOT文書作成(loopform_ssot.md)
  - 全ソースに [LoopForm] コメントタグ追加

-  Stage-1 CLI デバッグ環境構築
  - stage1_cli.hako 実装
  - stage1_bridge.rs ブリッジ実装
  - デバッグツール作成(stage1_debug.sh/stage1_minimal.sh)
  - アーキテクチャ改善提案文書

-  環境変数削減計画策定
  - 25変数の完全調査・分類
  - 6段階削減ロードマップ(25→5、80%削減)
  - 即時削除可能変数特定(NYASH_CONFIG/NYASH_DEBUG)

Phase 26-D からの累積変更:
- PHI実装改善(ExitPhiBuilder/HeaderPhiBuilder等)
- MIRビルダーリファクタリング
- 型伝播・最適化パス改善
- その他約300ファイルの累積変更

🎯 技術的成果:
- SSAバグ根本原因特定(条件分岐内loop変数変更)
- Region+next_iパターン適用完了(UsingCollectorBox等)
- LoopFormパターン文書化・テスト化完了
- セルフホスティング基盤強化

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: ChatGPT <noreply@openai.com>
Co-Authored-By: Task Assistant <task@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-21 06:25:17 +09:00
parent baf028a94f
commit f9d100ce01
366 changed files with 14322 additions and 5236 deletions

View File

@ -26,7 +26,9 @@ fn parse_required_methods(spec: &str) -> HashMap<String, Vec<String>> {
let mut map = HashMap::new();
for part in spec.split(';') {
let p = part.trim();
if p.is_empty() { continue; }
if p.is_empty() {
continue;
}
if let Some((ty, rest)) = p.split_once(':') {
let methods: Vec<String> = rest
.split(',')
@ -44,15 +46,30 @@ fn parse_required_methods(spec: &str) -> HashMap<String, Vec<String>> {
fn load_required_methods_from_toml() -> HashMap<String, Vec<String>> {
let mut map: HashMap<String, Vec<String>> = HashMap::new();
let text = match std::fs::read_to_string("nyash.toml") { Ok(s) => s, Err(_) => return map };
let doc: toml::Value = match toml::from_str(&text) { Ok(v) => v, Err(_) => return map };
let text = match std::fs::read_to_string("nyash.toml") {
Ok(s) => s,
Err(_) => return map,
};
let doc: toml::Value = match toml::from_str(&text) {
Ok(v) => v,
Err(_) => return map,
};
// Helper: add entry if array-of-strings
let mut add_arr = |ty: &str, arr: &toml::Value| {
if let Some(a) = arr.as_array() {
let mut v: Vec<String> = Vec::new();
for e in a { if let Some(s) = e.as_str() { let s = s.trim(); if !s.is_empty() { v.push(s.to_string()); } } }
if !v.is_empty() { map.insert(ty.to_string(), v); }
for e in a {
if let Some(s) = e.as_str() {
let s = s.trim();
if !s.is_empty() {
v.push(s.to_string());
}
}
}
if !v.is_empty() {
map.insert(ty.to_string(), v);
}
}
};
@ -61,8 +78,15 @@ fn load_required_methods_from_toml() -> HashMap<String, Vec<String>> {
if let Some(req) = vrfy.get("required_methods") {
if let Some(tbl) = req.as_table() {
for (k, v) in tbl.iter() {
if v.is_array() { add_arr(k, v); continue; }
if let Some(t) = v.as_table() { if let Some(m) = t.get("methods") { add_arr(k, m); } }
if v.is_array() {
add_arr(k, v);
continue;
}
if let Some(t) = v.as_table() {
if let Some(m) = t.get("methods") {
add_arr(k, m);
}
}
}
}
}
@ -72,7 +96,11 @@ fn load_required_methods_from_toml() -> HashMap<String, Vec<String>> {
if let Some(types) = doc.get("types") {
if let Some(tbl) = types.as_table() {
for (k, v) in tbl.iter() {
if let Some(t) = v.as_table() { if let Some(m) = t.get("required_methods") { add_arr(k, m); } }
if let Some(t) = v.as_table() {
if let Some(m) = t.get("required_methods") {
add_arr(k, m);
}
}
}
}
}
@ -83,16 +111,22 @@ fn load_required_methods_from_toml() -> HashMap<String, Vec<String>> {
pub fn verify_from_env() -> Result<(), String> {
let mode = std::env::var("NYASH_PROVIDER_VERIFY").unwrap_or_default();
let mode = mode.to_ascii_lowercase();
if !(mode == "warn" || mode == "strict") { return Ok(()); }
if !(mode == "warn" || mode == "strict") {
return Ok(());
}
// Merge: nyash.toml + env override
let mut req = load_required_methods_from_toml();
let spec = std::env::var("NYASH_VERIFY_REQUIRED_METHODS").unwrap_or_default();
if !spec.trim().is_empty() {
let env_map = parse_required_methods(&spec);
for (k, v) in env_map { req.entry(k).or_default().extend(v); }
for (k, v) in env_map {
req.entry(k).or_default().extend(v);
}
}
if req.is_empty() {
return Ok(());
}
if req.is_empty() { return Ok(()); }
let host = crate::runtime::plugin_loader_unified::get_global_plugin_host();
let host = host.read().unwrap();
@ -107,11 +141,18 @@ pub fn verify_from_env() -> Result<(), String> {
}
}
if failures.is_empty() { return Ok(()); }
if failures.is_empty() {
return Ok(());
}
let msg = format!(
"Provider verify failed ({}): missing methods: {}",
mode,
failures.join(", ")
);
if mode == "warn" { eprintln!("[provider-verify][warn] {}", msg); Ok(()) } else { Err(msg) }
if mode == "warn" {
eprintln!("[provider-verify][warn] {}", msg);
Ok(())
} else {
Err(msg)
}
}