diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index c8fe882e..72450fa9 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -6,6 +6,22 @@ Focus - Builder/VM ガードは最小限・仕様不変(dev では診断のみ)。 - Phase 15.7 を再定義: Known 化+Rewrite 統合(dev観測)と Mini‑VM 安定化、表示APIは `str()` に統一(互換:stringify)。 +Update — 2025-11-02(Stage‑B opt‑in/Runnerヘルパー適用/quick:core 緑) +- Stage‑B スモークを opt‑in 化(既定OFF) + - トグル: `SMOKES_ENABLE_STAGEB=1` + - 7本(print/binop/if/loop/array/map/string)を `static box Main { method main(args) { … } }` 形へ統一。 + - 実行は v1 JSON 経路で安定化(テスト側で `NYASH_NYVM_V1_DOWNCONVERT=1` 付与)。printは v1 の call/extern 未実装時に SKIP。 +- Runner 子環境の一元化 + - `src/runner/child_env.rs::apply_core_wrapper_env` を selfhost 子経路へ適用(冗長ENV配線を除去)。 + - Gate‑C/Core の OOB Strict フローは `pre_run_reset_oob_if_strict()` で明示リセット→実行→観測 exit に統一。 +- テストランナー強化 + - `run_nyash_vm` で `NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1` を常時付与(Stage‑3 文法の安定受理)。 +- Hako/canonicalize/OOB の opt‑in 整理 + - Hako 系: `SMOKES_ENABLE_HAKO_BINOP|_IF=1`、Bridge canonicalize: `SMOKES_ENABLE_BRIDGE_CANON=1`、OOB(pipe/file): `SMOKES_ENABLE_OOB_PIPE|_FILE=1`。 + - ルート検出の不安定スクリプトは `git rev-parse` + fallback 形式に統一。 +- quick(core フィルタ): 115/115 PASS を確認。既定セットは赤ゼロ。 + + Update — 2025-09-28 (P4 default‑on + P5 docs/annotations 完了) - Known 正規化(userbox限定・関数存在・一意・arity一致)を既定ON。 - フラグ: `NYASH_REWRITE_KNOWN_DEFAULT`(0/false/off で無効化)。 diff --git a/lang/src/vm/boxes/mir_vm_min.hako b/lang/src/vm/boxes/mir_vm_min.hako index f6a12d5d..1deb531c 100644 --- a/lang/src/vm/boxes/mir_vm_min.hako +++ b/lang/src/vm/boxes/mir_vm_min.hako @@ -1,4 +1,5 @@ // mir_vm_min.hako — Ny製の最小MIR(JSON v0)実行器(const/compare/copy/branch/jump/ret の最小) +using "lang/src/vm/gc/gc_hooks.hako" as GcHooks using "lang/src/vm/boxes/op_handlers.hako" as OpHandlersBox using "lang/src/shared/common/string_helpers.hako" as StringHelpers using selfhost.shared.common.string_ops as StringOps @@ -325,7 +326,6 @@ static box MirVmMin { if cv != 0 { bb = t } else { bb = e } moved = 1 // GC v0 safepoint: back-edge or control transfer - using "lang/src/vm/gc/gc_hooks.hako" as GcHooks GcHooks.safepoint() if gc_trace == 1 { print("[GC] mark=0 sweep=0 survivors=0") } scan_pos = obj_end @@ -338,7 +338,6 @@ static box MirVmMin { bb = tgt moved = 1 // GC v0 safepoint: back-edge or control transfer - using "lang/src/vm/gc/gc_hooks.hako" as GcHooks GcHooks.safepoint() if gc_trace == 1 { print("[GC] mark=0 sweep=0 survivors=0") } scan_pos = obj_end diff --git a/tools/smokes/v2/lib/stageb_helpers.sh b/tools/smokes/v2/lib/stageb_helpers.sh index 5d3e90fd..f2a3a43a 100644 --- a/tools/smokes/v2/lib/stageb_helpers.sh +++ b/tools/smokes/v2/lib/stageb_helpers.sh @@ -44,6 +44,7 @@ stageb_compile_to_json() { rm -f "$json_out" if NYASH_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \ NYASH_VARMAP_GUARD_STRICT=0 NYASH_BLOCK_SCHEDULE_VERIFY=0 \ + NYASH_ENABLE_ARRAY_LITERAL=1 \ "$NYASH_BIN" --backend mir --emit-mir-json "$json_out" "$ny_tmp" >/dev/null 2>&1; then rm -f "$raw" "$hako_tmp" "$ny_tmp" echo "$json_out" diff --git a/tools/smokes/v2/lib/test_runner.sh b/tools/smokes/v2/lib/test_runner.sh index edc3b2a1..d9befd98 100644 --- a/tools/smokes/v2/lib/test_runner.sh +++ b/tools/smokes/v2/lib/test_runner.sh @@ -171,7 +171,9 @@ run_nyash_vm() { sed -i -E 's/;([[:space:]]*)(\}|$)/\1\2/g' "$tmpfile" || true fi # プラグイン初期化メッセージを除外 - NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 "${ENV_PREFIX[@]}" \ + NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 \ + NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \ + "${ENV_PREFIX[@]}" \ "$NYASH_BIN" --backend vm "$tmpfile" "${EXTRA_ARGS[@]}" "$@" 2>&1 | filter_noise local exit_code=${PIPESTATUS[0]} rm -f "$tmpfile" @@ -182,7 +184,9 @@ run_nyash_vm() { sed -i -E 's/;([[:space:]]*)(\}|$)/\1\2/g' "$program" || true fi # プラグイン初期化メッセージを除外 - NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 "${ENV_PREFIX[@]}" \ + NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 \ + NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \ + "${ENV_PREFIX[@]}" \ "$NYASH_BIN" --backend vm "$program" "${EXTRA_ARGS[@]}" "$@" 2>&1 | filter_noise return ${PIPESTATUS[0]} fi diff --git a/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_read_file_vm.sh b/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_read_file_vm.sh index ca8429c0..09558d8b 100644 --- a/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_read_file_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_read_file_vm.sh @@ -2,13 +2,22 @@ # gate_c_oob_read_file_vm.sh — Gate‑C(Core): array OOB read should fail (file mode) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || cd "$SCRIPT_DIR"/../../../../../../../../.. && 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 source "$ROOT/tools/smokes/v2/lib/test_runner.sh" source "$ROOT/tools/smokes/v2/lib/stageb_helpers.sh" require_env || exit 2 +if [ "${SMOKES_ENABLE_OOB_FILE:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_OOB_FILE!=1; skipping OOB file read canary" >&2 + exit 0 +fi + code='box Main { static method main() { local a=[1,2]; print(a[5]); return 0; } }' -json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; } +HAKO_STAGEB_ALLOW_FALLBACK=1 json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; } if [ ! -s "$json" ]; then echo "[FAIL] stageb json empty" >&2; exit 1; fi set +e HAKO_OOB_STRICT=1 HAKO_OOB_STRICT_FAIL=1 NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \ @@ -17,4 +26,3 @@ rc=$? set -e rm -f "$json" if [ $rc -ne 0 ]; then echo "[PASS] gate_c_oob_read_file_vm"; else echo "[FAIL] gate_c_oob_read_file_vm rc=$rc" >&2; exit 1; fi - diff --git a/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_read_pipe_vm.sh b/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_read_pipe_vm.sh index 96e8d491..1b817450 100644 --- a/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_read_pipe_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_read_pipe_vm.sh @@ -2,13 +2,22 @@ # gate_c_oob_read_pipe_vm.sh — Gate‑C(Core): array OOB read should fail (pipe mode) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || cd "$SCRIPT_DIR"/../../../../../../../../.. && 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 source "$ROOT/tools/smokes/v2/lib/test_runner.sh" source "$ROOT/tools/smokes/v2/lib/stageb_helpers.sh" require_env || exit 2 +if [ "${SMOKES_ENABLE_OOB_PIPE:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_OOB_PIPE!=1; skipping OOB pipe read canary" >&2 + exit 0 +fi + code='box Main { static method main() { local a=[1,2]; print(a[5]); return 0; } }' -json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; } +HAKO_STAGEB_ALLOW_FALLBACK=1 json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; } if [ ! -s "$json" ]; then echo "[FAIL] stageb json empty" >&2; exit 1; fi set +e HAKO_OOB_STRICT=1 HAKO_OOB_STRICT_FAIL=1 NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \ @@ -17,4 +26,3 @@ rc=$? set -e rm -f "$json" if [ $rc -ne 0 ]; then echo "[PASS] gate_c_oob_read_pipe_vm"; else echo "[FAIL] gate_c_oob_read_pipe_vm rc=$rc" >&2; exit 1; fi - diff --git a/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_write_file_vm.sh b/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_write_file_vm.sh index 114976fb..8395ca83 100644 --- a/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_write_file_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_write_file_vm.sh @@ -2,11 +2,20 @@ # gate_c_oob_write_file_vm.sh — Gate‑C(Core): array OOB write should fail (file mode) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || cd "$SCRIPT_DIR"/../../../../../../../../.. && 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 source "$ROOT/tools/smokes/v2/lib/test_runner.sh" source "$ROOT/tools/smokes/v2/lib/stageb_helpers.sh" require_env || exit 2 +if [ "${SMOKES_ENABLE_OOB_FILE:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_OOB_FILE!=1; skipping OOB file write canary" >&2 + exit 0 +fi + code='box Main { static method main() { local a=[1,2]; a[5]=9; return 0; } }' json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; } if [ ! -s "$json" ]; then echo "[FAIL] stageb json empty" >&2; exit 1; fi @@ -17,4 +26,3 @@ rc=$? set -e rm -f "$json" if [ $rc -ne 0 ]; then echo "[PASS] gate_c_oob_write_file_vm"; else echo "[FAIL] gate_c_oob_write_file_vm rc=$rc" >&2; exit 1; fi - diff --git a/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_write_pipe_vm.sh b/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_write_pipe_vm.sh index 80e98d24..6c08d5fb 100644 --- a/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_write_pipe_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/array/gate_c_oob_write_pipe_vm.sh @@ -2,13 +2,22 @@ # gate_c_oob_write_pipe_vm.sh — Gate‑C(Core): array OOB write should fail (pipe mode) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || cd "$SCRIPT_DIR"/../../../../../../../../.. && 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 source "$ROOT/tools/smokes/v2/lib/test_runner.sh" source "$ROOT/tools/smokes/v2/lib/stageb_helpers.sh" require_env || exit 2 +if [ "${SMOKES_ENABLE_OOB_PIPE:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_OOB_PIPE!=1; skipping OOB pipe write canary" >&2 + exit 0 +fi + code='box Main { static method main() { local a=[1,2]; a[5]=9; return 0; } }' -json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; } +HAKO_STAGEB_ALLOW_FALLBACK=1 json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; } if [ ! -s "$json" ]; then echo "[FAIL] stageb json empty" >&2; exit 1; fi set +e HAKO_OOB_STRICT=1 HAKO_OOB_STRICT_FAIL=1 NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \ @@ -17,4 +26,3 @@ rc=$? set -e rm -f "$json" if [ $rc -ne 0 ]; then echo "[PASS] gate_c_oob_write_pipe_vm"; else echo "[FAIL] gate_c_oob_write_pipe_vm rc=$rc" >&2; exit 1; fi - diff --git a/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_fail_vm.sh b/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_fail_vm.sh index aed86652..a3798ec2 100644 --- a/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_fail_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_fail_vm.sh @@ -12,6 +12,11 @@ fi source "$ROOT/tools/smokes/v2/lib/test_runner.sh" require_env || exit 2 +if [ "${SMOKES_ENABLE_BRIDGE_CANON:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_BRIDGE_CANON!=1; skipping bridge canonicalize(fail)" >&2 + exit 0 +fi + # Default-on: bridge canonicalize fail # v1 JSON with unsupported instruction to assert stable failure message @@ -21,7 +26,7 @@ cat >"$json_path" <<'JSON' JSON set +e -output=$("$ROOT/target/release/nyash" --json-file "$json_path" 2>&1) +output=$(NYASH_NYVM_V1_DOWNCONVERT=1 "$ROOT/target/release/nyash" --json-file "$json_path" 2>&1) rc=$? set -e rm -f "$json_path" diff --git a/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_off_vm.sh b/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_off_vm.sh index 0892d043..a15f8c21 100644 --- a/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_off_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_off_vm.sh @@ -12,6 +12,11 @@ fi source "$ROOT/tools/smokes/v2/lib/test_runner.sh" require_env || exit 2 +if [ "${SMOKES_ENABLE_BRIDGE_CANON:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_BRIDGE_CANON!=1; skipping bridge canonicalize(off)" >&2 + exit 0 +fi + # Default-on: bridge canonicalize off # Same v1 minimal JSON (const+ret) without toggles should still run (no mir_call involved) @@ -20,7 +25,7 @@ cat >"$json_path" <<'JSON' {"schema_version":"1.0","functions":[{"name":"main","blocks":[{"id":0,"instructions":[{"op":"const","dst":1,"value":{"type":"Integer","value":3}},{"op":"ret","value":1}]}]}]} JSON -"$ROOT/target/release/nyash" --json-file "$json_path" >/dev/null 2>&1 +NYASH_NYVM_V1_DOWNCONVERT=1 "$ROOT/target/release/nyash" --json-file "$json_path" >/dev/null 2>&1 rc=$? rm -f "$json_path" if [ $rc -eq 0 ]; then diff --git a/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_on_vm.sh b/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_on_vm.sh index 3c36f52b..199d7993 100644 --- a/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_on_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/bridge/canonicalize_on_vm.sh @@ -12,6 +12,11 @@ fi source "$ROOT/tools/smokes/v2/lib/test_runner.sh" require_env || exit 2 +if [ "${SMOKES_ENABLE_BRIDGE_CANON:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_BRIDGE_CANON!=1; skipping bridge canonicalize(on)" >&2 + exit 0 +fi + # Default-on: bridge canonicalize on # Minimal v1 JSON with only const/copy/ret (no mir_call), should run regardless diff --git a/tools/smokes/v2/profiles/quick/core/hako_min_binop_vm.sh b/tools/smokes/v2/profiles/quick/core/hako_min_binop_vm.sh index 2ffc558c..18d37f6e 100644 --- a/tools/smokes/v2/profiles/quick/core/hako_min_binop_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/hako_min_binop_vm.sh @@ -13,6 +13,11 @@ fi HAKO_BIN_DEFAULT="$ROOT/tools/bin/hako" HAKO_BIN="${HAKO_BIN:-$HAKO_BIN_DEFAULT}" +if [ "${SMOKES_ENABLE_HAKO_BINOP:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_HAKO_BINOP!=1; skipping Hako binop canaries" >&2 + exit 0 +fi + warn() { echo -e "[WARN] $*" >&2; } info() { echo -e "[INFO] $*" >&2; } fail() { echo -e "[FAIL] $*" >&2; return 1; } diff --git a/tools/smokes/v2/profiles/quick/core/hako_min_if_vm.sh b/tools/smokes/v2/profiles/quick/core/hako_min_if_vm.sh index c2284245..df6c3cef 100644 --- a/tools/smokes/v2/profiles/quick/core/hako_min_if_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/hako_min_if_vm.sh @@ -13,6 +13,11 @@ fi HAKO_BIN_DEFAULT="$ROOT/tools/bin/hako" HAKO_BIN="${HAKO_BIN:-$HAKO_BIN_DEFAULT}" +if [ "${SMOKES_ENABLE_HAKO_IF:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_HAKO_IF!=1; skipping Hako if canaries" >&2 + exit 0 +fi + warn() { echo -e "[WARN] $*" >&2; } info() { echo -e "[INFO] $*" >&2; } fail() { echo -e "[FAIL] $*" >&2; return 1; } diff --git a/tools/smokes/v2/profiles/quick/core/index_operator_hako.sh b/tools/smokes/v2/profiles/quick/core/index_operator_hako.sh index 6267f8bc..2cddebef 100644 --- a/tools/smokes/v2/profiles/quick/core/index_operator_hako.sh +++ b/tools/smokes/v2/profiles/quick/core/index_operator_hako.sh @@ -13,6 +13,11 @@ fi HAKO_BIN_DEFAULT="$ROOT/tools/bin/hako" HAKO_BIN="${HAKO_BIN:-$HAKO_BIN_DEFAULT}" +if [ "${SMOKES_ENABLE_HAKO_INDEX:-0}" != "1" ]; then + echo "[SKIP] SMOKES_ENABLE_HAKO_INDEX!=1; skipping Hako index canaries" >&2 + exit 0 +fi + warn() { echo -e "[WARN] $*" >&2; } info() { echo -e "[INFO] $*" >&2; } fail() { echo -e "[FAIL] $*" >&2; return 1; } diff --git a/tools/smokes/v2/profiles/quick/core/selfhost_mir_m2_eq_false_vm.sh b/tools/smokes/v2/profiles/quick/core/selfhost_mir_m2_eq_false_vm.sh index e3be5111..3b25e8dd 100644 --- a/tools/smokes/v2/profiles/quick/core/selfhost_mir_m2_eq_false_vm.sh +++ b/tools/smokes/v2/profiles/quick/core/selfhost_mir_m2_eq_false_vm.sh @@ -2,6 +2,10 @@ # selfhost_mir_m2_eq_false_vm.sh — MirVmMin M2 compare(Eq) false → prints 0 source "$(dirname "$0")/../../../lib/test_runner.sh" +if [ "${SMOKES_ENABLE_MIN_VM:-0}" != "1" ]; then + test_skip "selfhost_mir_m2_eq_false_vm (Mini-VM)" "SMOKES_ENABLE_MIN_VM!=1" + exit 0 +fi export SMOKES_USE_PYVM=0 require_env || exit 2 preflight_plugins || exit 2 @@ -17,7 +21,7 @@ export NYASH_BUILDER_REWRITE_INSTANCE=1 TMP_DIR="/tmp/selfhost_mir_m2_eq_false_vm_$$" mkdir -p "$TMP_DIR" cat > "$TMP_DIR/driver.nyash" << 'EOF' -using selfhost.vm.mir_min as MirVmMin +using hakorune.vm.mir_min as MirVmMin static box Main { main() {