Files
hakorune/tools/hakorune_emit_mir.sh
nyash-codex 981ddd890c Phase 22.1 WIP: SSOT resolver + TLV infrastructure + Hako MIR builder setup
Setup infrastructure for Phase 22.1 (TLV C shim & Resolver SSOT):

Core changes:
- Add nyash_tlv, nyash_c_core, nyash_kernel_min_c crates (opt-in)
- Implement SSOT resolver bridge (src/using/ssot_bridge.rs)
- Add HAKO_USING_SSOT=1 / HAKO_USING_SSOT_HAKO=1 env support
- Add HAKO_TLV_SHIM=1 infrastructure (requires --features tlv-shim)

MIR builder improvements:
- Fix using/alias consistency in Hako MIR builder
- Add hako.mir.builder.internal.{prog_scan,pattern_util} to nyash.toml
- Normalize LLVM extern calls: nyash.console.* → nyash_console_*

Smoke tests:
- Add phase2211 tests (using_ssot_hako_parity_canary_vm.sh)
- Add phase2220, phase2230, phase2231 test structure
- Add phase2100 S3 backend selector tests
- Improve test_runner.sh with quiet/timeout controls

Documentation:
- Add docs/ENV_VARS.md (Phase 22.1 env vars reference)
- Add docs/development/runtime/C_CORE_ABI.md
- Update de-rust-roadmap.md with Phase 22.x details

Tools:
- Add tools/hakorune_emit_mir.sh (Hako-first MIR emission wrapper)
- Add tools/tlv_roundtrip_smoke.sh placeholder
- Improve ny_mir_builder.sh with better backend selection

Known issues (to be fixed):
- Parser infinite loop in static method parameter parsing
- Stage-B output contamination with "RC: 0" (needs NYASH_JSON_ONLY=1)
- phase2211/using_ssot_hako_parity_canary_vm.sh fork bomb (needs recursion guard)

Next steps: Fix parser infinite loop + Stage-B quiet mode for green tests
2025-11-09 15:11:18 +09:00

121 lines
4.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# hakorune_emit_mir.sh — Emit MIR(JSON) using Hakorune StageB + MirBuilder (Hakofirst)
#
# Usage: tools/hakorune_emit_mir.sh <input.hako> <out.json>
# Notes:
# - Runs the StageB compiler (Hako) to emit Program(JSON v0), then feeds it to MirBuilderBox.emit_from_program_json_v0.
# - Defaults to the Hakorune VM path; no inline Ny compiler; Stage3 enabled.
# - Keeps defaults conservative: no global flips; this is a helper for dev/CI scripts.
set -euo pipefail
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <input.hako> <out.json>" >&2
exit 2
fi
IN="$1"
OUT="$2"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
if ROOT_GIT=$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null); then
ROOT="$ROOT_GIT"
else
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
fi
# Resolve nyash/hakorune binary via test_runner helper (ensures consistent env)
if [ ! -f "$IN" ]; then
echo "[FAIL] input not found: $IN" >&2
exit 1
fi
# Resolve nyash/hakorune binary (simple detection; test_runner will override later if sourced)
if [ -z "${NYASH_BIN:-}" ]; then
if [ -x "$ROOT/target/release/hakorune" ]; then
export NYASH_BIN="$ROOT/target/release/hakorune"
else
export NYASH_BIN="$ROOT/target/release/nyash"
fi
fi
CODE="$(cat "$IN")"
# 1) StageB: Hako parser emits Program(JSON v0) to stdout
set +e
PROG_JSON_OUT=$(NYASH_DISABLE_NY_COMPILER=1 HAKO_DISABLE_NY_COMPILER=1 \
NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \
NYASH_ENABLE_USING=1 HAKO_ENABLE_USING=1 \
"$NYASH_BIN" --backend vm "$ROOT/lang/src/compiler/entry/compiler_stageb.hako" -- --source "$CODE" 2>/dev/null)
rc=$?
set -e
if [ $rc -ne 0 ] || [ -z "$PROG_JSON_OUT" ]; then
echo "[FAIL] Stage-B parse failed (rc=$rc)" >&2
exit 1
fi
# Quick validation for Program(JSON v0)
if ! printf '%s' "$PROG_JSON_OUT" | grep -q '"kind"\s*:\s*"Program"'; then
echo "[FAIL] StageB output is not Program(JSON)" >&2
printf '%s\n' "$PROG_JSON_OUT" | sed -n '1,80p' >&2 || true
exit 1
fi
# 2) Hako MirBuilder: convert Program(JSON v0) → MIR(JSON)
BUILDER_CODE=$(cat <<'HCODE'
using "hako.mir.builder" as MirBuilderBox
static box Main { method main(args) {
local prog_json = env.get("HAKO_BUILDER_PROGRAM_JSON")
if prog_json == null { print("Builder failed"); return 1 }
local mir_out = MirBuilderBox.emit_from_program_json_v0(prog_json, null)
if mir_out == null { print("Builder failed"); return 1 }
print("[MIR_OUT_BEGIN]")
print("" + mir_out)
print("[MIR_OUT_END]")
return 0
} }
HCODE
)
# Use the smoke test runner to execute builder code inline (-c), ensuring consistent parser/env setup
source "$ROOT/tools/smokes/v2/lib/test_runner.sh" >/dev/null 2>&1 || true
require_env >/dev/null 2>&1 || true
tmp_stdout="/tmp/hako_builder_out_$$.log"
tmp_stderr="/tmp/hako_builder_err_$$.log"
trap 'rm -f "$tmp_stdout" "$tmp_stderr" || true' EXIT
set +e
MIR_JSON=$(HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 \
HAKO_MIR_BUILDER_DEBUG=${HAKO_MIR_BUILDER_DEBUG:-0} \
HAKO_FAIL_FAST_ON_HAKO_IN_NYASH_VM=0 \
HAKO_ROUTE_HAKOVM=1 \
NYASH_ENABLE_USING=1 HAKO_ENABLE_USING=1 \
NYASH_USING_AST=1 NYASH_RESOLVE_FIX_BRACES=1 \
NYASH_PARSER_SEAM_TOLERANT=1 \
NYASH_DISABLE_NY_COMPILER=1 NYASH_PARSER_STAGE3=0 HAKO_PARSER_STAGE3=0 \
NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 \
HAKO_BUILDER_PROGRAM_JSON="$PROG_JSON_OUT" \
run_nyash_vm -c "$BUILDER_CODE" 2>"$tmp_stderr" | tee "$tmp_stdout" | awk '/\[MIR_OUT_BEGIN\]/{flag=1;next}/\[MIR_OUT_END\]/{flag=0}flag')
rc=$?
set -e
if [ $rc -ne 0 ] || [ -z "$MIR_JSON" ] || ! printf '%s' "$MIR_JSON" | grep -q '"functions"'; then
echo "[WARN] MirBuilder (Hako) failed (rc=$rc), falling back to Rust CLI builder" >&2
# Use runner CLI to convert Program(JSON) → MIR(JSON)
tmp_prog="/tmp/hako_emit_prog_$$.json"
printf '%s' "$PROG_JSON_OUT" > "$tmp_prog"
if "$NYASH_BIN" --program-json-to-mir "$OUT" --json-file "$tmp_prog" >/dev/null 2>&1; then
rm -f "$tmp_prog" || true
echo "[OK] MIR JSON written (delegate): $OUT"
exit 0
fi
echo "[FAIL] Both Hako builder and delegate failed" >&2
echo "-- stderr (tail) --" >&2; tail -n 80 "$tmp_stderr" >&2 || true
echo "-- stdout (tail) --" >&2; tail -n 80 "$tmp_stdout" >&2 || true
exit 1
fi
printf '%s' "$MIR_JSON" > "$OUT"
echo "[OK] MIR JSON written: $OUT"
exit 0