From 2299da766346f8da312f9595b4e9de8452abdd00 Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Tue, 11 Nov 2025 09:09:55 +0900 Subject: [PATCH] feat(phase21.5): selfhost CWD fix + loop executable semantics + diagnostics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Task 1: Selfhost Child Process CWD Fix ✅ - Fix: try_selfhost_builder() now runs from repo root - Implementation: (cd "$ROOT" && ... "$NYASH_BIN" ...) - Benefit: nyash.toml using mappings are reliably loaded - Location: tools/hakorune_emit_mir.sh:96-108 - Resolves: "using not found: 'hako.mir.builder.internal.*'" errors ## Task 2: Loop JSONFrag Executable Semantics ✅ - Upgrade: FORCE=1 now generates complete executable while-loop - Structure: entry(0) → loop(1) → body(2) → exit(3) - Semantics: - PHI node: i = {i0, entry} | {i_next, body} - Increment: i_next = i + 1 - Backedge: body → loop - Exit: ret i (final loop variable value) - Location: lang/src/mir/builder/internal/loop_opts_adapter_box.hako:24-44 - Expected: rc=10 (limit value) instead of structure-only validation ## Task 3: Enhanced Diagnostics ✅ - Added: HAKO_SELFHOST_TRACE=1 outputs comprehensive diagnostics - Info: prog_json_len, tokens (Loop/Compare counts), cwd, nyash.toml status - Example: [builder/selfhost-first:trace] prog_json_len=90 tokens=Loop:0,Compare:0 cwd=... nyash.toml=present - Location: tools/hakorune_emit_mir.sh:87-100 - Benefit: One-line diagnosis of CWD/nyash.toml/using issues ## Task 4: nyash.toml Missing Entries ✅ - Added: hako.mir.builder.internal.builder_config mapping - Added: hako.mir.builder.internal.loop_opts_adapter mapping - Location: nyash.toml - Benefit: Selfhost-first can resolve internal builder dependencies ## Implementation Principles - 既定挙動不変 (Default unchanged, FORCE=1 guarded) - Dev toggle controlled (TRACE=1, NO_DELEGATE=1) - Minimal diff with clear rollback path - CWD fix ensures stable using resolution - Executable semantics enable proper EXE testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../internal/loop_opts_adapter_box.hako | 35 ++++++++++++++++++ nyash.toml | 2 + tools/hakorune_emit_mir.sh | 37 ++++++++++++------- 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/lang/src/mir/builder/internal/loop_opts_adapter_box.hako b/lang/src/mir/builder/internal/loop_opts_adapter_box.hako index 509fccd6..dd9d8b15 100644 --- a/lang/src/mir/builder/internal/loop_opts_adapter_box.hako +++ b/lang/src/mir/builder/internal/loop_opts_adapter_box.hako @@ -17,6 +17,41 @@ static box LoopOptsBox { using selfhost.shared.mir.loopform as LoopFormBox using selfhost.shared.common.string_helpers as StringHelpers using "hako.mir.builder.internal.jsonfrag_normalizer" as JsonFragNormalizerBox + // Force toggle: always return JsonFrag (dev/test override) + if BuilderConfigBox.loop_force_jsonfrag_on() == 1 { + local limit = opts.get("limit"); if limit == null { limit = 0 } + local limit_s = "" + limit + // Minimal while-loop semantics (executable, not just structure): + // Block 0 (entry): i0=0, limit=N, jump to loop + // Block 1 (loop header): phi i={i0,0}|{i_next,2}, cmp i&2 + local loop_count=$(printf '%s' "$prog_json" | grep -o '"type":"Loop"' 2>/dev/null | wc -l | tr -d ' \n') + local cmp_count=$(printf '%s' "$prog_json" | grep -o '"type":"Compare"' 2>/dev/null | wc -l | tr -d ' \n') + loop_count=${loop_count:-0} + cmp_count=${cmp_count:-0} + local cwd="$(pwd)" + local toml_status="absent" + if [ -f "$ROOT/nyash.toml" ]; then + toml_status="present" + fi + echo "[builder/selfhost-first:trace] prog_json_len=$prog_len tokens=Loop:$loop_count,Compare:$cmp_count cwd=$cwd nyash.toml=$toml_status" >&2 fi set +e - HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 \ - HAKO_MIR_BUILDER_LOOP_JSONFRAG="${HAKO_MIR_BUILDER_LOOP_JSONFRAG:-}" \ - HAKO_MIR_BUILDER_LOOP_FORCE_JSONFRAG="${HAKO_MIR_BUILDER_LOOP_FORCE_JSONFRAG:-}" \ - HAKO_MIR_BUILDER_JSONFRAG_NORMALIZE="${HAKO_MIR_BUILDER_JSONFRAG_NORMALIZE:-}" \ - HAKO_MIR_BUILDER_JSONFRAG_PURIFY="${HAKO_MIR_BUILDER_JSONFRAG_PURIFY:-}" \ - HAKO_MIR_BUILDER_NORMALIZE_TAG="${HAKO_MIR_BUILDER_NORMALIZE_TAG:-}" \ - HAKO_MIR_BUILDER_DEBUG="${HAKO_MIR_BUILDER_DEBUG:-}" \ - NYASH_ENABLE_USING=1 HAKO_ENABLE_USING=1 \ - NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \ - HAKO_BUILDER_PROGRAM_JSON="$prog_json" \ - "$NYASH_BIN" --backend vm "$tmp_hako" 2>/dev/null | tee "$tmp_stdout" >/dev/null + # Run from repo root to ensure nyash.toml is available for using resolution + (cd "$ROOT" && \ + HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 \ + HAKO_MIR_BUILDER_LOOP_JSONFRAG="${HAKO_MIR_BUILDER_LOOP_JSONFRAG:-}" \ + HAKO_MIR_BUILDER_LOOP_FORCE_JSONFRAG="${HAKO_MIR_BUILDER_LOOP_FORCE_JSONFRAG:-}" \ + HAKO_MIR_BUILDER_JSONFRAG_NORMALIZE="${HAKO_MIR_BUILDER_JSONFRAG_NORMALIZE:-}" \ + HAKO_MIR_BUILDER_JSONFRAG_PURIFY="${HAKO_MIR_BUILDER_JSONFRAG_PURIFY:-}" \ + HAKO_MIR_BUILDER_NORMALIZE_TAG="${HAKO_MIR_BUILDER_NORMALIZE_TAG:-}" \ + HAKO_MIR_BUILDER_DEBUG="${HAKO_MIR_BUILDER_DEBUG:-}" \ + NYASH_ENABLE_USING=1 HAKO_ENABLE_USING=1 \ + NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \ + HAKO_BUILDER_PROGRAM_JSON="$prog_json" \ + "$NYASH_BIN" --backend vm "$tmp_hako" 2>/dev/null | tee "$tmp_stdout" >/dev/null) local rc=$? set -e