Files
hakorune/tools/pyvm_vs_llvmlite.sh

69 lines
1.6 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -euo pipefail
if [[ "${NYASH_CLI_VERBOSE:-0}" == "1" ]]; then
set -x
fi
APP="${1:-apps/tests/esc_dirname_smoke.hako}"
OUT="app_pyvm_cmp"
if [[ ! -f "$APP" ]]; then
echo "error: app not found: $APP" >&2
exit 2
fi
# 1) Build nyash with llvm harness enabled (build_llvm.sh does the right thing)
echo "[cmp] building AOT via llvmlite harness ..." >&2
./tools/build_llvm.sh "$APP" -o "$OUT" >/dev/null
# 2) Run AOT executable and capture stdout + exit code
echo "[cmp] running AOT (llvmlite) ..." >&2
set +e
OUT_LL=$("./$OUT" 2>&1)
CODE_LL=$?
set -e
# 3) Run PyVM path (VM mode delegated to Python)
echo "[cmp] running PyVM ..." >&2
set +e
BIN=${NYASH_BIN:-./target/release/hakorune}
OUT_PY=$(NYASH_VM_USE_PY=1 "$BIN" --backend vm "$APP" 2>&1)
CODE_PY=$?
set -e
echo "=== llvmlite (AOT) stdout ==="
echo "$OUT_LL" | sed -n '1,120p'
echo "=== PyVM stdout ==="
echo "$OUT_PY" | sed -n '1,120p'
echo "=== exit codes ==="
echo "llvmlite: $CODE_LL"
echo "PyVM : $CODE_PY"
# Strict compare only when requested. Default: exit code parity.
STRICT=${CMP_STRICT:-0}
if [[ "$STRICT" == "1" ]]; then
DIFF=0
if [[ "$OUT_LL" != "$OUT_PY" ]]; then
echo "[cmp] stdout differs" >&2
DIFF=1
fi
if [[ "$CODE_LL" -ne "$CODE_PY" ]]; then
echo "[cmp] exit code differs" >&2
DIFF=1
fi
if [[ "$DIFF" -eq 0 ]]; then
echo "✅ parity OK (stdout + exit code)"
else
echo "❌ parity mismatch" >&2
exit 1
fi
else
if [[ "$CODE_LL" -eq "$CODE_PY" ]]; then
echo "✅ parity OK (exit code)"
else
echo "❌ exit code mismatch" >&2
exit 1
fi
fi