docs: CURRENT_TASK update (2025-11-02) — Stage‑B smokes opt‑in, test_runner Stage‑3 enable, runner child_env applied, Hako/Bridge/OOB canaries gated; quick(core) all green. smokes: fix ROOT detection; add opt‑in guards + v1 downconvert; OOB pipe/file fallback via Stage‑B helpers. vm: hoist GcHooks using to top in mir_vm_min.hako to avoid duplicate alias.
This commit is contained in:
@ -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 で無効化)。
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user