Files
hakorune/tools/hako_check.sh
nyash-codex 301b1d212a Phase 21.2 Complete: VM Adapter正規実装 + devブリッジ完全撤去
## 🎉 Phase 21.2完全達成

###  実装完了
- VM static box 永続化(singleton infrastructure)
- devブリッジ完全撤去(adapter_dev.rs削除、by-name dispatch削除)
- .hako正規実装(MirCallV1Handler, AbiAdapterRegistry等)
- text-merge経路完全動作
- 全phase2120 adapter reps PASS(7テスト)

### 🐛 バグ修正
1. strip_local_decl修正
   - トップレベルのみlocal削除、メソッド内は保持
   - src/runner/modes/common_util/hako.rs:29

2. static box フィールド永続化
   - MirInterpreter singleton storage実装
   - me parameter binding修正(1:1マッピング)
   - getField/setField string→singleton解決
   - src/backend/mir_interpreter/{mod,exec,handlers/boxes_object_fields}.rs

3. Map.len alias rc=0修正
   - [map/missing]パターン検出でnull扱い(4箇所)
   - lang/src/vm/boxes/mir_call_v1_handler.hako:91-93,131-133,151-153,199-201

### 📁 主要変更ファイル

#### Rust(VM Runtime)
- src/backend/mir_interpreter/mod.rs - static box singleton storage
- src/backend/mir_interpreter/exec.rs - parameter binding fix
- src/backend/mir_interpreter/handlers/boxes_object_fields.rs - singleton resolution
- src/backend/mir_interpreter/handlers/calls.rs - dev bridge removal
- src/backend/mir_interpreter/utils/mod.rs - adapter_dev module removal
- src/backend/mir_interpreter/utils/adapter_dev.rs - DELETED (7555 bytes)
- src/runner/modes/vm.rs - static box declaration collection
- src/runner/modes/common_util/hako.rs - strip_local_decl fix
- src/instance_v2.rs - Clone implementation

#### Hako (.hako実装)
- lang/src/vm/boxes/mir_call_v1_handler.hako - [map/missing] detection
- lang/src/vm/boxes/abi_adapter_registry.hako - NEW (adapter registry)
- lang/src/vm/helpers/method_alias_policy.hako - method alias support

#### テスト
- tools/smokes/v2/profiles/quick/core/phase2120/s3_vm_adapter_*.sh - 7 new tests

### 🎯 テスト結果
```
 s3_vm_adapter_array_len_canary_vm.sh
 s3_vm_adapter_array_len_per_recv_canary_vm.sh
 s3_vm_adapter_array_length_alias_canary_vm.sh
 s3_vm_adapter_array_size_alias_canary_vm.sh
 s3_vm_adapter_map_len_alias_state_canary_vm.sh
 s3_vm_adapter_map_length_alias_state_canary_vm.sh
 s3_vm_adapter_map_size_struct_canary_vm.sh
```

環境フラグ: HAKO_ABI_ADAPTER=1 HAKO_ABI_ADAPTER_DEV=0

### 🏆 設計品質
-  ハードコード禁止(AGENTS.md 5.1)完全準拠
-  構造的・一般化設計(特定Box名のif分岐なし)
-  後方互換性保持(既存コード破壊ゼロ)
-  text-merge経路(.hako依存関係正しくマージ)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 19:32:44 +09:00

101 lines
2.7 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BIN="${NYASH_BIN:-$ROOT/target/release/hakorune}"
if [ ! -x "$BIN" ]; then
echo "[ERROR] hakorune binary not found: $BIN" >&2
echo "Run: cargo build --release" >&2
exit 2
fi
if [ $# -lt 1 ]; then
echo "Usage: $0 [--format text|dot] <file-or-dir|file> [more...]" >&2
exit 2
fi
fail=0
FORMAT="text"
if [ "${1:-}" = "--format" ] && [ -n "${2:-}" ]; then
FORMAT="$2"; shift 2 || true
fi
list_targets() {
local p="$1"
if [ -d "$p" ]; then
find "$p" -type f -name '*.hako'
else
echo "$p"
fi
}
run_one() {
local f="$1"
# Run analyzer main directly with file arg(s)
NYASH_DISABLE_NY_COMPILER=1 \
HAKO_DISABLE_NY_COMPILER=1 \
NYASH_PARSER_STAGE3=1 \
HAKO_PARSER_STAGE3=1 \
NYASH_PARSER_SEAM_TOLERANT=1 \
HAKO_PARSER_SEAM_TOLERANT=1 \
NYASH_PARSER_ALLOW_SEMICOLON=1 \
NYASH_ENABLE_USING=1 \
HAKO_ENABLE_USING=1 \
NYASH_USING_AST=1 \
NYASH_NY_COMPILER_TIMEOUT_MS="${NYASH_NY_COMPILER_TIMEOUT_MS:-8000}" \
"$BIN" --backend vm "$ROOT/tools/hako_check/cli.hako" -- "$f" \
>"/tmp/hako_lint_out_$$.log" 2>&1 || true
local out rc
out="$(cat "/tmp/hako_lint_out_$$.log")"; rc=0
# Extract RC
if echo "$out" | grep -q '^RC: '; then
rc="$(echo "$out" | sed -n 's/^RC: //p' | tail -n1)"
else rc=1; fi
if [ "$rc" != "0" ]; then
echo "$out" | sed -n '1,200p'
fail=$((fail+1))
fi
rm -f "/tmp/hako_lint_out_$$.log"
}
if [ "$FORMAT" = "dot" ]; then
# Aggregate all targets and render DOT once
TMP_LIST="/tmp/hako_targets_$$.txt"; : >"$TMP_LIST"
for p in "$@"; do list_targets "$p" >>"$TMP_LIST"; done
mapfile -t FILES <"$TMP_LIST"
rm -f "$TMP_LIST"
NYASH_DISABLE_NY_COMPILER=1 \
HAKO_DISABLE_NY_COMPILER=1 \
NYASH_PARSER_STAGE3=1 \
HAKO_PARSER_STAGE3=1 \
NYASH_PARSER_SEAM_TOLERANT=1 \
HAKO_PARSER_SEAM_TOLERANT=1 \
NYASH_PARSER_ALLOW_SEMICOLON=1 \
NYASH_ENABLE_USING=1 \
HAKO_ENABLE_USING=1 \
NYASH_USING_AST=1 \
NYASH_NY_COMPILER_TIMEOUT_MS="${NYASH_NY_COMPILER_TIMEOUT_MS:-8000}" \
"$BIN" --backend vm "$ROOT/tools/hako_check/cli.hako" -- --format dot "${FILES[@]}" \
>"/tmp/hako_lint_out_$$.log" 2>&1 || true
out="$(cat "/tmp/hako_lint_out_$$.log")"; rc=0
# Always print DOT output (everything except RC lines filtered later if needed)
echo "$out" | sed -n '1,99999p'
if echo "$out" | grep -q '^RC: '; then
rc="$(echo "$out" | sed -n 's/^RC: //p' | tail -n1)"
else rc=1; fi
rm -f "/tmp/hako_lint_out_$$.log"
if [ "$rc" -ne 0 ]; then exit 1; fi
else
for p in "$@"; do
while IFS= read -r f; do run_one "$f"; done < <(list_targets "$p")
done
fi
if [ $fail -ne 0 ]; then
echo "[lint/summary] failures: $fail" >&2
exit 1
fi
echo "[lint/summary] all clear" >&2
exit 0