From 30f94c9550ec560d8b0e77d50fada75b291eeb0d Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Thu, 4 Dec 2025 23:35:33 +0900 Subject: [PATCH] feat(joinir): Phase 186 LoopBuilder Hard Freeze - Add access control guard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add environment variable check at LoopBuilder fallback point (control_flow.rs:60). LoopBuilder is now only accessible when NYASH_LEGACY_LOOPBUILDER=1 is explicitly set. Changes: - control_flow.rs: Add env guard before LoopBuilder instantiation - Default behavior: JoinIR-only (LoopBuilder disabled) - Legacy mode: NYASH_LEGACY_LOOPBUILDER=1 enables fallback - Error message: Clear hint about legacy mode opt-in Testing: - legacy OFF (NYASH_LEGACY_LOOPBUILDER=0): Error (frozen) - legacy ON (NYASH_LEGACY_LOOPBUILDER=1): Success (allowed) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/mir/builder/control_flow.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/mir/builder/control_flow.rs b/src/mir/builder/control_flow.rs index d7d3811d..67b4995e 100644 --- a/src/mir/builder/control_flow.rs +++ b/src/mir/builder/control_flow.rs @@ -56,7 +56,18 @@ impl super::MirBuilder { eprintln!("[cf_loop] CALLED from somewhere"); eprintln!("[cf_loop] Current stack (simulated): check build_statement vs build_expression_impl"); } - // Delegate to LoopBuilder for consistent handling + + // Phase 186: LoopBuilder Hard Freeze - Require explicit legacy mode opt-in + if !crate::config::env::joinir_dev::legacy_loopbuilder_enabled() { + return Err(format!( + "[joinir/freeze] Loop lowering failed: JoinIR does not support this pattern, and LoopBuilder is disabled.\n\ + Function: {}\n\ + Hint: Set NYASH_LEGACY_LOOPBUILDER=1 to enable legacy path (dev-only)", + self.current_function.as_ref().map(|f| f.signature.name.as_str()).unwrap_or("") + )); + } + + // Delegate to LoopBuilder for consistent handling (legacy path only) let mut loop_builder = crate::mir::loop_builder::LoopBuilder::new(self); loop_builder.build_loop(condition, body) }