trace: add execution route visibility + debug passthrough; phase2170 canaries; docs

- Add HAKO_TRACE_EXECUTION to trace executor route
  - Rust hv1_inline: stderr [trace] executor: hv1_inline (rust)
  - Hakovm dispatcher: stdout [trace] executor: hakovm (hako)
  - test_runner: trace lines for hv1_inline/core/hakovm routes
- Add HAKO_VERIFY_SHOW_LOGS and HAKO_DEBUG=1 (enables both)
  - verify_v1_inline_file() log passthrough with numeric rc extraction
  - test_runner exports via HAKO_DEBUG
- Canary expansion under phase2170 (state spec)
  - Array: push×5/10 → size, len/length alias, per‑recv/global, flow across blocks
  - Map: set dup-key non-increment, value_state get/has
  - run_all.sh: unify, remove SKIPs; all PASS
- Docs
  - ENV_VARS.md: add Debug/Tracing toggles and examples
  - PLAN.md/CURRENT_TASK.md: mark 21.7 green, add Quickstart lines

All changes gated by env vars; default behavior unchanged.
This commit is contained in:
nyash-codex
2025-11-08 23:45:29 +09:00
parent bf185ec2b2
commit fa3091061d
49 changed files with 1334 additions and 110 deletions

View File

@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_prog="/tmp/prog_registry_if_intint_$$.json"
cat >"$tmp_prog" <<'JSON'
{"version":0,"kind":"Program","body":[
{"type":"If","cond":{"type":"Compare","op":"<","lhs":{"type":"Int","value":1},"rhs":{"type":"Int","value":2}},
"then":{"type":"Return","expr":{"type":"Int","value":44}},
"else":{"type":"Return","expr":{"type":"Int","value":7}}}
]}
JSON
set +e
HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 HAKO_VERIFY_PRIMARY=core verify_program_via_builder_to_core "$tmp_prog" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_prog" || true
if [ "$rc" -eq 44 ]; then
echo "[PASS] mirbuilder_registry_if_compare_intint_core_exec_canary_vm"
exit 0
fi
echo "[FAIL] mirbuilder_registry_if_compare_intint_core_exec_canary_vm (rc=$rc, expect 44)" >&2; exit 1

View File

@ -0,0 +1,28 @@
#!/usr/bin/env bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_prog="/tmp/prog_registry_if_varint_$$.json"
cat >"$tmp_prog" <<'JSON'
{"version":0,"kind":"Program","body":[
{"type":"Local","name":"x","expr":{"type":"Int","value":5}},
{"type":"If","cond":{"type":"Compare","op":">","lhs":{"type":"Var","name":"x"},"rhs":{"type":"Int","value":3}},
"then":{"type":"Return","expr":{"type":"Int","value":1}},
"else":{"type":"Return","expr":{"type":"Int","value":0}}}
]}
JSON
set +e
HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 HAKO_VERIFY_PRIMARY=core verify_program_via_builder_to_core "$tmp_prog" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_prog" || true
if [ "$rc" -eq 1 ]; then
echo "[PASS] mirbuilder_registry_if_compare_varint_core_exec_canary_vm"
exit 0
fi
echo "[FAIL] mirbuilder_registry_if_compare_varint_core_exec_canary_vm (rc=$rc, expect 1)" >&2; exit 1

View File

@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_prog="/tmp/prog_registry_if_varvar_$$.json"
cat >"$tmp_prog" <<'JSON'
{"version":0,"kind":"Program","body":[
{"type":"Local","name":"a","expr":{"type":"Int","value":10}},
{"type":"Local","name":"b","expr":{"type":"Int","value":20}},
{"type":"If","cond":{"type":"Compare","op":"<=","lhs":{"type":"Var","name":"a"},"rhs":{"type":"Var","name":"b"}},
"then":{"type":"Return","expr":{"type":"Int","value":44}},
"else":{"type":"Return","expr":{"type":"Int","value":7}}}
]}
JSON
set +e
HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 HAKO_VERIFY_PRIMARY=core verify_program_via_builder_to_core "$tmp_prog" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_prog" || true
if [ "$rc" -eq 44 ]; then
echo "[PASS] mirbuilder_registry_if_compare_varvar_core_exec_canary_vm"
exit 0
fi
echo "[FAIL] mirbuilder_registry_if_compare_varvar_core_exec_canary_vm (rc=$rc, expect 44)" >&2; exit 1

View File

@ -0,0 +1,23 @@
#!/usr/bin/env bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_prog="/tmp/prog_registry_binop_intint_$$.json"
cat >"$tmp_prog" <<'JSON'
{"version":0,"kind":"Program","body":[{"type":"Return","expr":{"type":"Binary","op":"+","lhs":{"type":"Int","value":2},"rhs":{"type":"Int","value":3}}}]}
JSON
set +e
HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 HAKO_VERIFY_PRIMARY=core verify_program_via_builder_to_core "$tmp_prog" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_prog" || true
if [ "$rc" -eq 5 ]; then
echo "[PASS] mirbuilder_registry_return_binop_intint_core_exec_canary_vm"
exit 0
fi
echo "[FAIL] mirbuilder_registry_return_binop_intint_core_exec_canary_vm (rc=$rc, expect 5)" >&2; exit 1

View File

@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_prog="/tmp/prog_registry_binop_varint_$$.json"
cat >"$tmp_prog" <<'JSON'
{"version":0,"kind":"Program","body":[
{"type":"Local","name":"x","expr":{"type":"Int","value":7}},
{"type":"Return","expr":{"type":"Binary","op":"*","lhs":{"type":"Var","name":"x"},"rhs":{"type":"Int","value":6}}}
]}
JSON
set +e
HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 HAKO_VERIFY_PRIMARY=core verify_program_via_builder_to_core "$tmp_prog" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_prog" || true
if [ "$rc" -eq 42 ]; then
echo "[PASS] mirbuilder_registry_return_binop_varint_core_exec_canary_vm"
exit 0
fi
echo "[FAIL] mirbuilder_registry_return_binop_varint_core_exec_canary_vm (rc=$rc, expect 42)" >&2; exit 1

View File

@ -0,0 +1,23 @@
#!/usr/bin/env bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_prog="/tmp/prog_registry_retint_$$.json"
cat >"$tmp_prog" <<'JSON'
{"version":0,"kind":"Program","body":[{"type":"Return","expr":{"type":"Int","value":42}}]}
JSON
set +e
HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 HAKO_VERIFY_PRIMARY=core verify_program_via_builder_to_core "$tmp_prog" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_prog" || true
if [ "$rc" -eq 42 ]; then
echo "[PASS] mirbuilder_registry_return_int_core_exec_canary_vm"
exit 0
fi
echo "[FAIL] mirbuilder_registry_return_int_core_exec_canary_vm (rc=$rc, expect 42)" >&2; exit 1

View File

@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp="/tmp/prog_registry_logical_and_$$.json"
cat >"$tmp" <<'JSON'
{"version":0,"kind":"Program","body":[
{"type":"Local","name":"x","expr":{"type":"Bool","value":0}},
{"type":"Local","name":"y","expr":{"type":"Bool","value":1}},
{"type":"Return","expr":{"type":"Logical","op":"&&","lhs":{"type":"Var","name":"x"},"rhs":{"type":"Var","name":"y"}}}
]}
JSON
set +e
HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 HAKO_VERIFY_PRIMARY=core verify_program_via_builder_to_core "$tmp" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp" || true
if [ "$rc" -eq 0 ]; then
echo "[PASS] mirbuilder_registry_return_logical_and_varvar_core_exec_canary_vm"
exit 0
fi
echo "[FAIL] mirbuilder_registry_return_logical_and_varvar_core_exec_canary_vm (rc=$rc, expect 0)" >&2; exit 1

View File

@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp="/tmp/prog_registry_logical_or_$$.json"
cat >"$tmp" <<'JSON'
{"version":0,"kind":"Program","body":[
{"type":"Local","name":"a","expr":{"type":"Bool","value":1}},
{"type":"Local","name":"b","expr":{"type":"Bool","value":0}},
{"type":"Return","expr":{"type":"Logical","op":"||","lhs":{"type":"Var","name":"a"},"rhs":{"type":"Var","name":"b"}}}
]}
JSON
set +e
HAKO_MIR_BUILDER_INTERNAL=1 HAKO_MIR_BUILDER_REGISTRY=1 HAKO_VERIFY_PRIMARY=core verify_program_via_builder_to_core "$tmp" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp" || true
if [ "$rc" -eq 1 ]; then
echo "[PASS] mirbuilder_registry_return_logical_or_varvar_core_exec_canary_vm"
exit 0
fi
echo "[FAIL] mirbuilder_registry_return_logical_or_varvar_core_exec_canary_vm (rc=$rc, expect 1)" >&2; exit 1

View File

@ -0,0 +1,33 @@
#!/bin/bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_json="/tmp/mir_v1_array_len_alias_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": "i64", "value": 0}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "dst": 3, "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"len","receiver":1}, "args": [], "effects": []}},
{"op":"ret","value":3}
]}
]}
]
}
JSON
set +e
HAKO_VERIFY_PRIMARY=hakovm HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 2 ]; then echo "[PASS] array_len_alias_vm"; exit 0; fi
echo "[FAIL] array_len_alias_vm (rc=$rc, want=2)" >&2; exit 1

View File

@ -0,0 +1,33 @@
#!/bin/bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_json="/tmp/mir_v1_array_length_alias_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": "i64", "value": 0}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "dst": 3, "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"length","receiver":1}, "args": [], "effects": []}},
{"op":"ret","value":3}
]}
]}
]
}
JSON
set +e
HAKO_VERIFY_PRIMARY=hakovm HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 2 ]; then echo "[PASS] array_length_alias_vm"; exit 0; fi
echo "[FAIL] array_length_alias_vm (rc=$rc, want=2)" >&2; exit 1

View File

@ -0,0 +1,41 @@
#!/bin/bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_json="/tmp/mir_v1_array_push_size_10_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": "i64", "value": 1}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "dst": 3, "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"size","receiver":1}, "args": [], "effects": []}},
{"op":"ret","value":3}
]}
]}
]
}
JSON
set +e
HAKO_VERIFY_PRIMARY=hakovm HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 10 ]; then echo "[PASS] array_push_size_10_vm"; exit 0; fi
echo "[FAIL] array_push_size_10_vm (rc=$rc, want=10)" >&2; exit 1

View File

@ -0,0 +1,36 @@
#!/bin/bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_json="/tmp/mir_v1_array_push_size_5_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": "i64", "value": 111}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "dst": 3, "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"size","receiver":1}, "args": [], "effects": []}},
{"op":"ret","value":3}
]}
]}
]
}
JSON
set +e
HAKO_VERIFY_PRIMARY=hakovm HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 5 ]; then echo "[PASS] array_push_size_5_vm"; exit 0; fi
echo "[FAIL] array_push_size_5_vm (rc=$rc, want=5)" >&2; exit 1

View File

@ -0,0 +1,43 @@
#!/bin/bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_json="/tmp/mir_v1_flow_across_blocks_array_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": "i64", "value": 0}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"const","dst":10, "value": {"type": "i64", "value": 1}},
{"op":"const","dst":11, "value": {"type": "i64", "value": 1}},
{"op":"compare","dst":12, "lhs":10, "rhs":11, "cmp":"Eq"},
{"op":"branch","cond":12, "then":1, "else":2}
]},
{"id":1,"instructions":[
{"op":"mir_call", "dst": 3, "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"size","receiver":1}, "args": [], "effects": []}},
{"op":"ret","value":3}
]},
{"id":2,"instructions":[
{"op":"ret","value":2}
]}
]}
]
}
JSON
set +e
HAKO_VERIFY_PRIMARY=hakovm HAKO_V1_DISPATCHER_FLOW=1 HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 3 ]; then echo "[PASS] flow_across_blocks_array_size_canary_vm"; exit 0; fi
echo "[FAIL] flow_across_blocks_array_size_canary_vm (rc=$rc, want=3)" >&2; exit 1

View File

@ -0,0 +1,44 @@
#!/bin/bash
# Hakovm v1 dispatcher: ArrayBox push → size state increments (1→2→3)
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_json="/tmp/mir_v1_array_push_size_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": "i64", "value": 111}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "dst": 3, "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"size","receiver":1}, "args": [], "effects": []}},
{"op":"ret","value":3}
]}
]}
]
}
JSON
# Expect rc=3 when stateful mir_call is ON and primary=hakovm
set +e
HAKO_VERIFY_PRIMARY=hakovm \
HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 \
verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 3 ]; then
echo "[PASS] hv1_mircall_array_push_size_state_canary_vm"
exit 0
fi
echo "[FAIL] hv1_mircall_array_push_size_state_canary_vm (rc=$rc, want=3)" >&2
exit 1

View File

@ -0,0 +1,46 @@
#!/bin/bash
# Hakovm v1 dispatcher: MapBox set(new key) → size increments (1→2)
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_json="/tmp/mir_v1_map_set_size_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"MapBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": {"kind":"handle","box_type":"StringBox"}, "value": "k1"}},
{"op":"const", "dst": 3, "value": {"type": "i64", "value": 100}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"MapBox","method":"set","receiver":1}, "args": [2,3], "effects": []}},
{"op":"const", "dst": 4, "value": {"type": {"kind":"handle","box_type":"StringBox"}, "value": "k2"}},
{"op":"const", "dst": 5, "value": {"type": "i64", "value": 200}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"MapBox","method":"set","receiver":1}, "args": [4,5], "effects": []}},
{"op":"mir_call", "dst": 6, "mir_call": {"callee": {"type":"Method","box_name":"MapBox","method":"size","receiver":1}, "args": [], "effects": []}},
{"op":"ret","value":6}
]}
]}
]
}
JSON
# Expect rc=2 when stateful mir_call (Map.set) is ON and primary=hakovm
set +e
HAKO_VERIFY_PRIMARY=hakovm \
HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 \
verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 2 ]; then
echo "[PASS] hv1_mircall_map_set_size_state_canary_vm"
exit 0
fi
echo "[FAIL] hv1_mircall_map_set_size_state_canary_vm (rc=$rc, want=2)" >&2
exit 1

View File

@ -0,0 +1,38 @@
#!/bin/bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
tmp_json="/tmp/mir_v1_map_set_dup_key_size_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"MapBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": {"kind":"handle","box_type":"StringBox"}, "value": "k1"}},
{"op":"const", "dst": 3, "value": {"type": "i64", "value": 100}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"MapBox","method":"set","receiver":1}, "args": [2,3], "effects": []}},
{"op":"const", "dst": 5, "value": {"type": "i64", "value": 200}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"MapBox","method":"set","receiver":1}, "args": [2,5], "effects": []}},
{"op":"const", "dst": 6, "value": {"type": {"kind":"handle","box_type":"StringBox"}, "value": "k2"}},
{"op":"const", "dst": 7, "value": {"type": "i64", "value": 300}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"MapBox","method":"set","receiver":1}, "args": [6,7], "effects": []}},
{"op":"mir_call", "dst": 8, "mir_call": {"callee": {"type":"Method","box_name":"MapBox","method":"size","receiver":1}, "args": [], "effects": []}},
{"op":"ret","value":8}
]}
]}
]
}
JSON
set +e
HAKO_VERIFY_PRIMARY=hakovm HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
# k1 (new) -> size=1, k1 (dup) -> size stays 1, k2 (new) -> size=2
if [ "$rc" -eq 2 ]; then echo "[PASS] map_set_dup_key_size_canary_vm"; exit 0; fi
echo "[FAIL] map_set_dup_key_size_canary_vm (rc=$rc, want=2)" >&2; exit 1

View File

@ -0,0 +1,34 @@
#!/bin/bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
# value_state=1: Map.get returns stored value, Map.has reports presence
tmp_json="/tmp/mir_v1_map_value_state_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"MapBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": {"kind":"handle","box_type":"StringBox"}, "value": "k2"}},
{"op":"const", "dst": 3, "value": {"type": "i64", "value": 200}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"MapBox","method":"set","receiver":1}, "args": [2,3], "effects": []}},
{"op":"mir_call", "dst": 4, "mir_call": {"callee": {"type":"Method","box_name":"MapBox","method":"get","receiver":1}, "args": [2], "effects": []}},
{"op":"ret","value":4}
]}
]}
]
}
JSON
set +e
HAKO_VERIFY_PRIMARY=hakovm HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_VALUESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 200 ]; then echo "[PASS] map_value_state_get_has_canary_vm"; exit 0; fi
echo "[FAIL] map_value_state_get_has_canary_vm (rc=$rc, want=200)" >&2; exit 1

View File

@ -0,0 +1,34 @@
#!/bin/bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
# per_recv=0: global length key. push on A then size on B → 1
tmp_json="/tmp/mir_v1_perrecv_global_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": "i64", "value": 0}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "dst": 4, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"mir_call", "dst": 5, "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"size","receiver":4}, "args": [], "effects": []}},
{"op":"ret","value":5}
]}
]}
]
}
JSON
set +e
HAKO_VERIFY_PRIMARY=hakovm HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=0 verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 1 ]; then echo "[PASS] per_recv_global_canary_vm"; exit 0; fi
echo "[FAIL] per_recv_global_canary_vm (rc=$rc, want=1)" >&2; exit 1

View File

@ -0,0 +1,34 @@
#!/bin/bash
set -euo pipefail
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
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"; require_env || exit 2
# per_recv=1: per-receiver length key. push on A then size on B → 0
tmp_json="/tmp/mir_v1_perrecv_per_$$.json"
cat > "$tmp_json" <<'JSON'
{
"schema_version": "1.0",
"functions": [
{"name":"main","blocks":[
{"id":0,"instructions":[
{"op":"mir_call", "dst": 1, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"const", "dst": 2, "value": {"type": "i64", "value": 0}},
{"op":"mir_call", "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"push","receiver":1}, "args": [2], "effects": []}},
{"op":"mir_call", "dst": 4, "mir_call": {"callee": {"type":"Constructor","box_type":"ArrayBox"}, "args": [], "effects": []}},
{"op":"mir_call", "dst": 5, "mir_call": {"callee": {"type":"Method","box_name":"ArrayBox","method":"size","receiver":4}, "args": [], "effects": []}},
{"op":"ret","value":5}
]}
]}
]
}
JSON
set +e
HAKO_VERIFY_PRIMARY=hakovm HAKO_VM_MIRCALL_SIZESTATE=1 HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 verify_mir_rc "$tmp_json" >/dev/null 2>&1
rc=$?
set -e
rm -f "$tmp_json" || true
if [ "$rc" -eq 0 ]; then echo "[PASS] per_recv_per_canary_vm"; exit 0; fi
echo "[FAIL] per_recv_per_canary_vm (rc=$rc, want=0)" >&2; exit 1

View File

@ -0,0 +1,20 @@
#!/bin/bash
set -euo pipefail
DIR="$(cd "$(dirname "$0")" && pwd)"
bash "$DIR/hv1_mircall_array_push_size_state_canary_vm.sh"
bash "$DIR/hv1_mircall_map_set_size_state_canary_vm.sh"
bash "$DIR/array_push_size_5_vm.sh"
bash "$DIR/array_push_size_10_vm.sh"
bash "$DIR/array_len_alias_vm.sh"
bash "$DIR/array_length_alias_vm.sh"
bash "$DIR/per_recv_global_canary_vm.sh"
bash "$DIR/per_recv_per_canary_vm.sh"
bash "$DIR/map_set_dup_key_size_canary_vm.sh"
bash "$DIR/map_value_state_get_has_canary_vm.sh"
bash "$DIR/flow_across_blocks_array_size_canary_vm.sh"
# dup-key non-increment now enforced
echo "[PASS] phase2170 all"