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:
@ -121,7 +121,9 @@ pub fn await_max_ms() -> u64 {
|
||||
/// Enable MIR PHI non-generation for Bridge compatibility mode only.
|
||||
/// フェーズM.2: MirBuilder/LoopBuilderでPHI統一済み、Bridge層の互換性制御のみ
|
||||
/// Default: PHI-ON (Phase 15 direction), override with NYASH_MIR_NO_PHI=1
|
||||
pub fn mir_no_phi() -> bool { env_bool("NYASH_MIR_NO_PHI") }
|
||||
pub fn mir_no_phi() -> bool {
|
||||
env_bool("NYASH_MIR_NO_PHI")
|
||||
}
|
||||
|
||||
/// Allow verifier to skip SSA/dominance/merge checks for PHI-less MIR.
|
||||
pub fn verify_allow_no_phi() -> bool {
|
||||
@ -131,11 +133,15 @@ pub fn verify_allow_no_phi() -> bool {
|
||||
/// Enable strict edge-copy policy verification in PHI-off mode.
|
||||
/// When enabled, merge blocks must receive merged values via predecessor copies only,
|
||||
/// and the merge block itself must not introduce a self-copy to the merged destination.
|
||||
pub fn verify_edge_copy_strict() -> bool { env_bool("NYASH_VERIFY_EDGE_COPY_STRICT") }
|
||||
pub fn verify_edge_copy_strict() -> bool {
|
||||
env_bool("NYASH_VERIFY_EDGE_COPY_STRICT")
|
||||
}
|
||||
|
||||
/// Enforce purity of return blocks: no side-effecting instructions allowed before Return
|
||||
/// Default: OFF. Enable with NYASH_VERIFY_RET_PURITY=1 in dev/profiling sessions.
|
||||
pub fn verify_ret_purity() -> bool { env_bool("NYASH_VERIFY_RET_PURITY") }
|
||||
pub fn verify_ret_purity() -> bool {
|
||||
env_bool("NYASH_VERIFY_RET_PURITY")
|
||||
}
|
||||
|
||||
// ---- LLVM harness toggle (llvmlite) ----
|
||||
pub fn llvm_use_harness() -> bool {
|
||||
@ -172,7 +178,9 @@ pub fn env_bool_default(key: &str, default: bool) -> bool {
|
||||
/// Global fail-fast policy for runtime fallbacks.
|
||||
/// Default: ON (true) to prohibit silent/different-route fallbacks in Rust layer.
|
||||
/// Set NYASH_FAIL_FAST=0 to temporarily allow legacy fallbacks during bring-up.
|
||||
pub fn fail_fast() -> bool { env_bool_default("NYASH_FAIL_FAST", true) }
|
||||
pub fn fail_fast() -> bool {
|
||||
env_bool_default("NYASH_FAIL_FAST", true)
|
||||
}
|
||||
|
||||
// VM legacy by-name call fallback was removed (Phase 2 complete).
|
||||
|
||||
@ -204,7 +212,9 @@ pub fn plugin_only() -> bool {
|
||||
/// Core-13 "pure" mode: after normalization, only the 13 canonical ops are allowed.
|
||||
/// If enabled, the optimizer will try lightweight rewrites for Load/Store/NewBox/Unary,
|
||||
/// and the final verifier will reject any remaining non-Core-13 ops.
|
||||
pub fn mir_core13_pure() -> bool { env_bool("NYASH_MIR_CORE13_PURE") }
|
||||
pub fn mir_core13_pure() -> bool {
|
||||
env_bool("NYASH_MIR_CORE13_PURE")
|
||||
}
|
||||
|
||||
/// Enable heuristic pre-pin of comparison operands in if/loop headers.
|
||||
/// Default: OFF (0). Set NYASH_MIR_PREPIN=1 to enable.
|
||||
@ -235,14 +245,26 @@ pub fn opt_diag_fail() -> bool {
|
||||
// ---- Legacy compatibility (dev-only) ----
|
||||
/// Enable legacy InstanceBox fields (SharedNyashBox map) for compatibility.
|
||||
/// Default: OFF. Set NYASH_LEGACY_FIELDS_ENABLE=1 to materialize and use legacy fields.
|
||||
pub fn legacy_fields_enable() -> bool { env_bool("NYASH_LEGACY_FIELDS_ENABLE") }
|
||||
pub fn legacy_fields_enable() -> bool {
|
||||
env_bool("NYASH_LEGACY_FIELDS_ENABLE")
|
||||
}
|
||||
|
||||
// ---- GC/Runtime tracing (execution-affecting visibility) ----
|
||||
pub fn gc_trace() -> bool { env_bool("NYASH_GC_TRACE") }
|
||||
pub fn gc_barrier_trace() -> bool { env_bool("NYASH_GC_BARRIER_TRACE") }
|
||||
pub fn runtime_checkpoint_trace() -> bool { env_bool("NYASH_RUNTIME_CHECKPOINT_TRACE") }
|
||||
pub fn vm_pic_stats() -> bool { env_bool("NYASH_VM_PIC_STATS") }
|
||||
pub fn vm_vt_trace() -> bool { env_bool("NYASH_VM_VT_TRACE") }
|
||||
pub fn gc_trace() -> bool {
|
||||
env_bool("NYASH_GC_TRACE")
|
||||
}
|
||||
pub fn gc_barrier_trace() -> bool {
|
||||
env_bool("NYASH_GC_BARRIER_TRACE")
|
||||
}
|
||||
pub fn runtime_checkpoint_trace() -> bool {
|
||||
env_bool("NYASH_RUNTIME_CHECKPOINT_TRACE")
|
||||
}
|
||||
pub fn vm_pic_stats() -> bool {
|
||||
env_bool("NYASH_VM_PIC_STATS")
|
||||
}
|
||||
pub fn vm_vt_trace() -> bool {
|
||||
env_bool("NYASH_VM_VT_TRACE")
|
||||
}
|
||||
pub fn vm_pic_trace() -> bool {
|
||||
std::env::var("NYASH_VM_PIC_TRACE").ok().as_deref() == Some("1")
|
||||
}
|
||||
@ -349,7 +371,11 @@ pub fn extern_trace() -> bool {
|
||||
// ---- Operator Boxes adopt defaults ----
|
||||
/// CompareOperator.apply adopt: default ON (prod/devともに採用)
|
||||
pub fn operator_box_compare_adopt() -> bool {
|
||||
match std::env::var("NYASH_OPERATOR_BOX_COMPARE_ADOPT").ok().as_deref().map(|v| v.to_ascii_lowercase()) {
|
||||
match std::env::var("NYASH_OPERATOR_BOX_COMPARE_ADOPT")
|
||||
.ok()
|
||||
.as_deref()
|
||||
.map(|v| v.to_ascii_lowercase())
|
||||
{
|
||||
Some(ref s) if s == "0" || s == "false" || s == "off" => false,
|
||||
Some(ref s) if s == "1" || s == "true" || s == "on" => true,
|
||||
_ => true, // default ON
|
||||
@ -357,7 +383,11 @@ pub fn operator_box_compare_adopt() -> bool {
|
||||
}
|
||||
/// AddOperator.apply adopt: default OFF(順次昇格のため)
|
||||
pub fn operator_box_add_adopt() -> bool {
|
||||
match std::env::var("NYASH_OPERATOR_BOX_ADD_ADOPT").ok().as_deref().map(|v| v.to_ascii_lowercase()) {
|
||||
match std::env::var("NYASH_OPERATOR_BOX_ADD_ADOPT")
|
||||
.ok()
|
||||
.as_deref()
|
||||
.map(|v| v.to_ascii_lowercase())
|
||||
{
|
||||
Some(ref s) if s == "0" || s == "false" || s == "off" => false,
|
||||
_ => true, // default ON (promoted after validation)
|
||||
}
|
||||
@ -415,9 +445,15 @@ pub fn enable_using() -> bool {
|
||||
pub fn using_profile() -> String {
|
||||
std::env::var("NYASH_USING_PROFILE").unwrap_or_else(|_| "dev".to_string())
|
||||
}
|
||||
pub fn using_is_prod() -> bool { using_profile().eq_ignore_ascii_case("prod") }
|
||||
pub fn using_is_ci() -> bool { using_profile().eq_ignore_ascii_case("ci") }
|
||||
pub fn using_is_dev() -> bool { using_profile().eq_ignore_ascii_case("dev") }
|
||||
pub fn using_is_prod() -> bool {
|
||||
using_profile().eq_ignore_ascii_case("prod")
|
||||
}
|
||||
pub fn using_is_ci() -> bool {
|
||||
using_profile().eq_ignore_ascii_case("ci")
|
||||
}
|
||||
pub fn using_is_dev() -> bool {
|
||||
using_profile().eq_ignore_ascii_case("dev")
|
||||
}
|
||||
/// Allow `using "path"` statements in source (dev-only by default).
|
||||
pub fn allow_using_file() -> bool {
|
||||
// SSOT 徹底: 全プロファイルで既定禁止(nyash.toml を唯一の真実に)
|
||||
@ -432,7 +468,11 @@ pub fn allow_using_file() -> bool {
|
||||
/// 1) Explicit env `NYASH_USING_AST` = 1/true/on → enabled, = 0/false/off → disabled
|
||||
/// 2) Default by profile: dev/ci → ON, prod → OFF
|
||||
pub fn using_ast_enabled() -> bool {
|
||||
match std::env::var("NYASH_USING_AST").ok().as_deref().map(|v| v.to_ascii_lowercase()) {
|
||||
match std::env::var("NYASH_USING_AST")
|
||||
.ok()
|
||||
.as_deref()
|
||||
.map(|v| v.to_ascii_lowercase())
|
||||
{
|
||||
Some(ref s) if s == "1" || s == "true" || s == "on" => true,
|
||||
Some(ref s) if s == "0" || s == "false" || s == "off" => false,
|
||||
_ => !using_is_prod(), // dev/ci → true, prod → false
|
||||
@ -443,7 +483,11 @@ pub fn using_ast_enabled() -> bool {
|
||||
/// - dev/ci: default true (allow, with WARN)
|
||||
/// Override with NYASH_VM_USER_INSTANCE_BOXCALL={0|1}
|
||||
pub fn vm_allow_user_instance_boxcall() -> bool {
|
||||
match std::env::var("NYASH_VM_USER_INSTANCE_BOXCALL").ok().as_deref().map(|v| v.to_ascii_lowercase()) {
|
||||
match std::env::var("NYASH_VM_USER_INSTANCE_BOXCALL")
|
||||
.ok()
|
||||
.as_deref()
|
||||
.map(|v| v.to_ascii_lowercase())
|
||||
{
|
||||
Some(ref s) if s == "0" || s == "false" || s == "off" => false,
|
||||
Some(ref s) if s == "1" || s == "true" || s == "on" => true,
|
||||
_ => !using_is_prod(),
|
||||
@ -630,7 +674,10 @@ fn warn_alias_once(alias: &str, primary: &str) {
|
||||
let set = WARNED_ALIASES.get_or_init(|| Mutex::new(HashSet::new()));
|
||||
if let Ok(mut s) = set.lock() {
|
||||
if !s.contains(alias) {
|
||||
eprintln!("[deprecate/env] '{}' is deprecated; use '{}'", alias, primary);
|
||||
eprintln!(
|
||||
"[deprecate/env] '{}' is deprecated; use '{}'",
|
||||
alias, primary
|
||||
);
|
||||
s.insert(alias.to_string());
|
||||
}
|
||||
}
|
||||
@ -652,7 +699,9 @@ pub fn llvm_opt_level() -> String {
|
||||
|
||||
/// Gate‑C(Core) route request (primary: NYASH_GATE_C_CORE; alias: HAKO_GATE_C_CORE)
|
||||
pub fn gate_c_core() -> bool {
|
||||
if env_bool("NYASH_GATE_C_CORE") { return true; }
|
||||
if env_bool("NYASH_GATE_C_CORE") {
|
||||
return true;
|
||||
}
|
||||
if env_bool("HAKO_GATE_C_CORE") {
|
||||
warn_alias_once("HAKO_GATE_C_CORE", "NYASH_GATE_C_CORE");
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user