phase: 20.49 COMPLETE; 20.50 Flow+String minimal reps; 20.51 selfhost v0/v1 minimal (Option A/B); hv1-inline binop/unop/copy; docs + run_all + CURRENT_TASK -> 21.0

This commit is contained in:
nyash-codex
2025-11-06 15:41:52 +09:00
parent 2dc370223d
commit 77d4fd72b3
1658 changed files with 6288 additions and 2612 deletions

View File

@ -86,6 +86,7 @@ filter_noise() {
| grep -v "^🔌 plugin host initialized" \
| grep -v "^✅ plugin host fully configured" \
| grep -v "Failed to load nyash.toml - plugins disabled" \
| grep -v "^⚠️ Failed to load plugin config (hakorune.toml/nyash.toml) - plugins disabled" \
| grep -v "^🚀 Nyash VM Backend - Executing file:" \
| grep -v "^🚀 Hakorune VM Backend - Executing file:"
}
@ -178,7 +179,7 @@ run_nyash_vm() {
if [ "$program" = "-c" ]; then
local code="$1"
shift
local tmpfile="/tmp/nyash_test_$$.nyash"
local tmpfile="/tmp/nyash_test_$$.hako"
echo "$code" > "$tmpfile"
# (shim removed) provider tag shortcut — hv1 inline is stable now
# 軽量ASIFixテスト用: ブロック終端の余剰セミコロンを寛容に除去
@ -189,7 +190,7 @@ run_nyash_vm() {
# Optional preinclude for include-based code
local runfile="$tmpfile"
if [ "${NYASH_PREINCLUDE:-0}" = "1" ] || [ "${HAKO_PREINCLUDE:-0}" = "1" ]; then
local prefile="/tmp/nyash_pre_$$.nyash"
local prefile="/tmp/nyash_pre_$$.hako"
"$NYASH_ROOT/tools/dev/hako_preinclude.sh" "$tmpfile" "$prefile" >/dev/null || true
runfile="$prefile"
fi
@ -197,6 +198,7 @@ run_nyash_vm() {
if grep -q '^include\s\"' "$tmpfile" 2>/dev/null && [ "${NYASH_PREINCLUDE:-0}" != "1" ] && [ "${HAKO_PREINCLUDE:-0}" != "1" ]; then
echo "[WARN] VM backend does not support include. Prefer using+alias, or set NYASH_PREINCLUDE=1 for dev." >&2
fi
HAKO_FAIL_FAST_ON_HAKO_IN_NYASH_VM=0 \
NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 \
NYASH_DISABLE_NY_COMPILER=1 HAKO_DISABLE_NY_COMPILER=1 \
NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \
@ -215,7 +217,7 @@ run_nyash_vm() {
# Optional preinclude
local runfile2="$program"
if [ "${NYASH_PREINCLUDE:-0}" = "1" ] || [ "${HAKO_PREINCLUDE:-0}" = "1" ]; then
local prefile2="/tmp/nyash_pre_$$.nyash"
local prefile2="/tmp/nyash_pre_$$.hako"
"$NYASH_ROOT/tools/dev/hako_preinclude.sh" "$program" "$prefile2" >/dev/null || true
runfile2="$prefile2"
fi
@ -245,6 +247,7 @@ run_nyash_vm() {
echo "[WARN] include is deprecated in 20.36+. Prefer using+alias. Preinclude is dev-only (NYASH_PREINCLUDE=1)." >&2
fi
fi
HAKO_FAIL_FAST_ON_HAKO_IN_NYASH_VM=0 \
NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 \
NYASH_DISABLE_NY_COMPILER=1 HAKO_DISABLE_NY_COMPILER=1 \
NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \
@ -269,13 +272,21 @@ verify_mir_rc() {
if [ "${HAKO_VERIFY_V1_FORCE_CORE:-0}" = "1" ]; then
"$NYASH_BIN" --mir-json-file "$json_path" >/dev/null 2>&1; return $?
fi
# hv1 直行(NyashParserバイパス: vm.rs冒頭で NYASH_VERIFY_JSON を検知して MIR 実行
local out_v1; out_v1=$(HAKO_V1_FLOW_TRACE=1 HAKO_V1_EXTERN_PROVIDER=1 HAKO_V1_DISPATCHER_FLOW=1 HAKO_V1_ALLOW_PHI_EXPERIMENT=1 \
HAKO_FAIL_FAST_ON_HAKO_IN_NYASH_VM=0 HAKO_ROUTE_HAKOVM=1 \
NYASH_VERIFY_JSON="$(cat "$json_path")" \
"$NYASH_BIN" --backend vm /dev/null 2>/dev/null | tr -d '\r' | awk '/^-?[0-9]+$/{n=$0} END{if(n!="") print n}')
if [[ "$out_v1" =~ ^-?[0-9]+$ ]]; then
local n=$out_v1; if [ $n -lt 0 ]; then n=$(( (n % 256 + 256) % 256 )); else n=$(( n % 256 )); fi; return $n
# hv1 直行(main.rs 早期経路)。成功時は rc を採用、失敗時は Core にフォールバック。
# ただしフロー検証dispatcher flow / phi 実験)が有効な場合は Core を優先hv1-inline は最小実装のため)。
if [ "${HAKO_VERIFY_V1_FORCE_HAKOVM:-0}" != "1" ]; then
local hv1_rc; hv1_rc=$(verify_v1_inline_file "$json_path" || true)
if [[ "$hv1_rc" =~ ^-?[0-9]+$ ]]; then
local n=$hv1_rc; if [ $n -lt 0 ]; then n=$(( (n % 256 + 256) % 256 )); else n=$(( n % 256 )); fi; return $n
fi
fi
# 強制 hv1-c ラッパ): NyVmDispatcherV1Box.run を直接呼び出して rc を取得
if [ "${HAKO_VERIFY_V1_FORCE_HAKOVM:-0}" = "1" ]; then
local hv1_rc_force; hv1_rc_force=$(verify_v1_inline_file "$json_path" || true)
if [[ "$hv1_rc_force" =~ ^-?[0-9]+$ ]]; then
local n=$hv1_rc_force; if [ $n -lt 0 ]; then n=$(( (n % 256 + 256) % 256 )); else n=$(( n % 256 )); fi; return $n
fi
return 1
fi
# No include+preinclude fallback succeeded → Core にフォールバック
"$NYASH_BIN" --mir-json-file "$json_path" >/dev/null 2>&1
@ -348,7 +359,7 @@ static box Main { method main(args) {
HCODE
)
code="${code/__MIR_JSON__/$json_literal3}"
local tmpwrap="/tmp/hako_core_wrap_$$.nyash"
local tmpwrap="/tmp/hako_core_wrap_$$.hako"
echo "$code" > "$tmpwrap"
NYASH_PREINCLUDE=1 run_nyash_vm "$tmpwrap" >/dev/null 2>&1; local r=$?; rm -f "$tmpwrap"; return $r
fi
@ -589,7 +600,7 @@ run_nyash_llvm() {
if [ "$program" = "-c" ]; then
local code="$1"
shift
local tmpfile="/tmp/nyash_test_$$.nyash"
local tmpfile="/tmp/nyash_test_$$.hako"
echo "$code" > "$tmpfile"
# 軽量ASIFixテスト用: ブロック終端の余剰セミコロンを寛容に除去
if [ "${SMOKES_ASI_STRIP_SEMI:-1}" = "1" ]; then
@ -714,3 +725,48 @@ output_junit() {
</testsuite>
EOF
}
# v1 JSON 正規化(オブジェクトキー順序ソート、配列順は保持)→ SHA256 ハッシュ
v1_normalized_hash() {
local json_path="$1"
if [ ! -f "$json_path" ]; then
echo "[FAIL] v1_normalized_hash: json not found: $json_path" >&2
return 2
fi
if ! command -v jq >/dev/null 2>&1; then
echo "[FAIL] v1_normalized_hash: jq required" >&2
return 2
fi
local canon
canon=$(jq -S -c . < "$json_path") || return 1
printf "%s" "$canon" | sha256sum | awk '{print $1}'
}
# 2つの v1 JSON ファイルの正規化ハッシュを比較等しければ0
compare_v1_hash() {
local a="$1"; local b="$2"
local ha hb
ha=$(v1_normalized_hash "$a" || true)
hb=$(v1_normalized_hash "$b" || true)
if [ -z "$ha" ] || [ -z "$hb" ]; then
return 2
fi
[ "$ha" = "$hb" ]
}
# Run hv1 inline (early route) and return numeric rc (0-255). Returns non-zero exit on failure to execute.
verify_v1_inline_file() {
local json_path="$1"
if [ ! -f "$json_path" ]; then
echo "[FAIL] verify_v1_inline_file: json not found: $json_path" >&2
return 2
fi
local out
out=$(HAKO_ROUTE_HAKOVM=1 HAKO_VERIFY_V1_FORCE_HAKOVM=1 NYASH_VERIFY_JSON="$(cat "$json_path")" \
"$NYASH_BIN" --backend vm /dev/null 2>/dev/null | tr -d '\r' | awk '/^-?[0-9]+$/{n=$0} END{if(n!="") print n}')
if [[ "$out" =~ ^-?[0-9]+$ ]]; then
# echo numeric rc and return success; caller normalizes/returns as exit code
echo "$out"
return 0
fi
return 1
}