#!/usr/bin/env bash # hakorune_emit_mir.sh — Emit MIR(JSON) using Hakorune Stage‑B + MirBuilder (Hako‑first) # # Usage: tools/hakorune_emit_mir.sh # Notes: # - Runs the Stage‑B 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; Stage‑3 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 " >&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) Stage‑B: 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] Stage‑B 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