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
121 lines
4.4 KiB
Bash
121 lines
4.4 KiB
Bash
#!/usr/bin/env bash
|
||
# hakorune_emit_mir.sh — Emit MIR(JSON) using Hakorune Stage‑B + MirBuilder (Hako‑first)
|
||
#
|
||
# Usage: tools/hakorune_emit_mir.sh <input.hako> <out.json>
|
||
# 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 <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) 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
|