Phase 25.1b: Step3完了(LoopForm対応)

Step3実装内容(LoopForm → MIR導線確立):
- FuncBodyBasicLowerBox._try_lower_loop追加:
  - Loop判定 → LowerLoopSumBcBox → LowerLoopSimpleBox の順に試行
  - 成功時は_rebindで関数名をBox.method/arityに付け替え
  - 失敗時は[builder/funcs:unsupported:loopform]でFail-Fast
- lowerメソッド冒頭でLoop優先処理:
  - Loop含む場合は_try_lower_loopを呼び、成功/失敗で明確に分岐
  - Loopが無い場合のみ既存のLocal/If/Return処理に進む
- PHI地獄防止ポリシー徹底:
  - FuncBodyBasicLowerBox/FuncLowering側でPHIやキャリアを直接いじらない
  - LoopForm制約外は必ずタグ付きでFail-Fast(Rust providerに退避可能)

ドキュメント更新:
- Phase 25.1b README: Step3をinitial-implementedに更新
- builder README: [builder/funcs:unsupported:loopform]タグ追加
- CURRENT_TASK.md: Step3進捗記録

スモークテスト:
- selfhost_mir_loopform_basic_vm.sh追加(基本構造実装済み)
- defs生成経路の詳細調整は継続タスク

Next: Step4(MethodCall/ExternCall対応)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-15 22:40:12 +09:00
parent 7ca7f646de
commit 8ffc4d0448
5 changed files with 105 additions and 9 deletions

View File

@ -0,0 +1,58 @@
#!/usr/bin/env bash
# selfhost_mir_loopform_basic_vm.sh
# - Canary for Phase 25.1b Step3: ensure FuncBodyBasicLowerBox can delegate
# LoopForm-normalized loops to LowerLoopSimpleBox/LowerLoopSumBcBox.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || (cd "$SCRIPT_DIR/../../../../../../.." && pwd))"
# Create a minimal .hako file with a simple counting loop
TEST_HAKO="$(mktemp --suffix .hako)"
cat > "$TEST_HAKO" <<'HAKO'
static box TestBox {
count() {
local i = 0
loop(i < 10) {
i = i + 1
}
return i
}
}
static box Main {
main() {
return 0
}
}
HAKO
OUT_MIR="$(mktemp --suffix .json)"
LOG_OUT="$(mktemp --suffix .log)"
trap 'rm -f "$TEST_HAKO" "$OUT_MIR" "$LOG_OUT" || true' EXIT
set +e
HAKO_SELFHOST_BUILDER_FIRST=1 HAKO_MIR_BUILDER_FUNCS=1 HAKO_SELFHOST_TRACE=1 NYASH_JSON_ONLY=1 \
bash "$ROOT_DIR/tools/hakorune_emit_mir.sh" "$TEST_HAKO" "$OUT_MIR" >"$LOG_OUT" 2>&1
rc=$?
set -e
# Check logs for LoopForm lower tags
if ! grep -q "\[funcs/basic:loop\." "$LOG_OUT"; then
echo "[FAIL] selfhost_mir_loopform_basic_vm (no [funcs/basic:loop.*] tag found)" >&2
echo "=== LOG OUTPUT ===" >&2
cat "$LOG_OUT" >&2
exit 1
fi
# Check MIR(JSON) was generated
if [ $rc -ne 0 ] || [ ! -s "$OUT_MIR" ]; then
echo "[FAIL] selfhost_mir_loopform_basic_vm (MIR generation failed rc=$rc)" >&2
echo "=== LOG OUTPUT ===" >&2
cat "$LOG_OUT" >&2
exit 1
fi
echo "[PASS] selfhost_mir_loopform_basic_vm (LoopForm lower delegated successfully)"
exit 0