feat(plugin): Fix plugin BoxRef return and Box argument support

- Fixed deadlock in FileBox plugin copyFrom implementation (single lock)
- Added TLV Handle (tag=8) parsing in calls.rs for returned BoxRefs
- Improved plugin loader with config path consistency and detailed logging
- Fixed loader routing for proper Handle type_id/fini_method_id resolution
- Added detailed logging for TLV encoding/decoding in plugin_loader_v2

Test docs/examples/plugin_boxref_return.nyash now works correctly:
- cloneSelf() returns FileBox Handle properly
- copyFrom(Box) accepts plugin Box arguments
- Both FileBox instances close and fini correctly

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm
2025-08-21 00:41:26 +09:00
parent af32896574
commit cc2a820af7
274 changed files with 7244 additions and 4608 deletions

View File

@ -0,0 +1,23 @@
# 🌐 WASM/AOT WASM 問題・課題管理
## 📁 フォルダ概要
NyashのWebAssemblyWASMおよびAOT WASM機能の問題点、制限事項、今後の改善計画を管理します。
## 📋 ドキュメント一覧
### 現在の問題・制限
- **[current_issues.md](current_issues.md)**: 現在発生中の技術的問題
- **[compatibility_matrix.md](compatibility_matrix.md)**: wasmtimeバージョン互換性マトリクス
- **[unsupported_features.md](unsupported_features.md)**: 未実装MIR命令・機能一覧
### 改善計画
- **[improvement_roadmap.md](improvement_roadmap.md)**: WASM/AOT機能改善計画
- **[optimization_targets.md](optimization_targets.md)**: 性能最適化目標
### 技術仕様
- **[wasm_backend_spec.md](wasm_backend_spec.md)**: WASM Backend詳細仕様
- **[aot_pipeline_spec.md](aot_pipeline_spec.md)**: AOT変換パイプライン仕様
---
**目標**: NyashのWASM/AOT機能を Production Ready レベルまで向上させる

View File

@ -0,0 +1,185 @@
# 🔄 wasmtime互換性マトリクス
## 📅 最終更新: 2025-08-15
## 🎯 **現在の状況**
### 開発環境
```toml
# Cargo.toml
wasmtime = "18.0"
wabt = "0.10"
```
### 実行環境
```bash
# システムインストール
wasmtime 35.0.0 (509af9e5f 2025-07-22)
```
### 互換性状況
**非互換**: 18.0.4 vs 35.0.0 - 実行不可
---
## 📊 **バージョン互換性マトリクス**
| Nyash wasmtime | System wasmtime | 互換性 | 状況 | 対応 |
|----------------|-----------------|--------|------|------|
| **18.0.4** | **35.0.0** | ❌ | 現在 | 要修正 |
| 35.0.x | 35.0.x | ✅ | 目標 | 推奨 |
| 34.0.x | 35.0.x | ⚠️ | 検証必要 | テスト |
| 33.0.x | 35.0.x | ❌ | 古すぎ | 非推奨 |
---
## 🔧 **修正オプション**
### Option A: Nyash側更新 (推奨)
```toml
# Cargo.toml - 更新案
wasmtime = "35.0"
wabt = "0.10" # 互換性確認必要
```
**メリット**:
- ✅ 最新機能・性能向上
- ✅ セキュリティ修正取り込み
- ✅ 将来性
**リスク**:
- ⚠️ API変更による修正必要
- ⚠️ 既存.cwasmファイル互換性喪失
### Option B: システム側ダウングレード
```bash
# wasmtime 18.0.4 をインストール
curl -sSf https://wasmtime.dev/install.sh | bash -s -- --version 18.0.4
```
**メリット**:
- ✅ Nyashコード修正不要
- ✅ 即座対応可能
**デメリット**:
- ❌ 古いバージョン使用
- ❌ セキュリティリスク
- ❌ 他プロジェクトへの影響
---
## 🎯 **推奨対応手順**
### Step 1: 依存関係調査 (30分)
```bash
# 現在の依存関係確認
cargo tree | grep wasmtime
cargo tree | grep wabt
# API変更点調査
# https://github.com/bytecodealliance/wasmtime/releases
```
### Step 2: テスト環境構築 (30分)
```bash
# ブランチ作成
git checkout -b feature/wasmtime-35-upgrade
# Cargo.toml更新
# wasmtime = "35.0"
# 依存関係更新
cargo update
```
### Step 3: ビルド修正 (2-4時間)
予想される修正箇所:
- `src/backend/aot/compiler.rs`: Engine設定API
- `src/backend/wasm/mod.rs`: Module生成API
- `src/backend/aot/config.rs`: Config構造変更
### Step 4: 動作確認 (1時間)
```bash
# 基本コンパイル
cargo build --release
# WASM/AOT テスト
./target/release/nyash --aot test_simple.nyash
wasmtime --allow-precompiled test_simple.cwasm
```
---
## 📋 **wasmtime API変更予想箇所**
### 18.x → 35.x 主要変更点
#### Engine/Store API
```rust
// 18.x (予想)
let engine = Engine::default();
let store = Store::new(&engine, ());
// 35.x (要確認)
let engine = Engine::new(&Config::default())?;
let mut store = Store::new(&engine, ());
```
#### Module serialize/deserialize
```rust
// 18.x
module.serialize()?;
Module::deserialize(&engine, bytes)?;
// 35.x (API変更可能性)
module.serialize()?; // 戻り値型変更?
unsafe { Module::deserialize(&engine, bytes)? } // unsafe要求
```
#### Config API
```rust
// 18.x
let config = Config::new();
// 35.x
let mut config = Config::new();
config.cranelift_opt_level(OptLevel::Speed)?;
```
---
## ✅ **アクションアイテム**
### 緊急 (今日)
- [ ] wasmtime 35.0 API ドキュメント確認
- [ ] 修正工数見積もり (2-8時間予想)
### 短期 (今週)
- [ ] **wasmtime 35.0 への更新実装**
- [ ] 全WASM/AOT機能のテスト実行
- [ ] 互換性問題解決
### 中期 (来週)
- [ ] wasmtime自動バージョン検知機能
- [ ] CI/CDでの互換性テスト自動化
---
## 🎯 **成功指標**
### 技術指標
```bash
# ✅ 成功条件
./target/release/nyash --aot test.nyash # コンパイル成功
wasmtime --allow-precompiled test.cwasm # 実行成功
echo $? # 0 (正常終了)
```
### 性能指標
- コンパイル時間: 18.x と同等以上
- 実行速度: 18.x と同等以上
- メモリ使用量: 18.x と同等以下
---
**🚀 Next Action**: wasmtime 35.0 へのアップグレード実装を最優先で開始

View File

@ -0,0 +1,176 @@
# 🚨 WASM/AOT WASM 現在の問題・制限事項
## 📅 最終更新: 2025-08-15
## 🔴 **緊急度: 高**
### 1. **BoxCall命令未実装**
**問題**: `toString()`, `print()` 等のBox メソッド呼び出しがWASMで未対応
**エラー例**:
```bash
❌ WASM compilation error: Unsupported instruction: BoxCall {
dst: Some(ValueId(6)),
box_val: ValueId(4),
method: "toString",
args: [],
effects: EffectMask(16)
}
```
**影響範囲**:
- 基本的なBox操作toString, print等が全て使用不可
- 実用的なNyashプログラムがWASMでコンパイル不可
**修正必要ファイル**:
- `src/backend/wasm/codegen.rs`: BoxCall命令の実装
---
### 2. **wasmtimeバージョン互換性問題**
**問題**: コンパイル時wasmtimeとシステムwasmtimeのバージョン不一致
**エラー例**:
```bash
Error: Module was compiled with incompatible Wasmtime version '18.0.4'
System wasmtime: 35.0.0
```
**原因**:
```toml
# Cargo.toml
wasmtime = "18.0" # コンパイル時
# システム
wasmtime 35.0.0 # 実行時
```
**影響**:
- AOT (.cwasm) ファイルが実行不可
- 配布用実行ファイル生成失敗
**修正策**:
1. **短期**: Cargo.tomlのwasmtimeバージョン更新
2. **長期**: 互換性保証メカニズム実装
---
### 3. **WASM出力バイナリエラー**
**問題**: WAT → WASM変換でUTF-8エラー発生
**エラー例**:
```bash
❌ Generated WASM is not valid UTF-8
```
**推測原因**:
- WAT形式の生成に問題
- wabt crateとの連携ミス
**修正必要箇所**:
- `src/backend/wasm/codegen.rs`: WAT生成ロジック
- WASM バイナリ出力パイプライン
---
## 🟠 **緊急度: 中**
### 4. **RuntimeImports未実装機能**
**問題**: WASMで必要なランタイム関数が部分実装
**未実装機能**:
- Box メモリ管理 (malloc, free)
- 型キャスト・変換
- 配列・Map操作
- 例外ハンドリング
**ファイル**: `src/backend/wasm/runtime.rs`
---
### 5. **メモリ管理最適化不足**
**問題**: WASMメモリレイアウトが非効率
**課題**:
- Box ヘッダーサイズ固定 (12 bytes)
- ガベージコレクション未実装
- メモリ断片化対策なし
**ファイル**: `src/backend/wasm/memory.rs`
---
## 🟡 **緊急度: 低**
### 6. **デバッグ情報不足**
**問題**: WASM実行時のエラー情報が不十分
**改善点**:
- ソースマップ生成
- スタックトレース詳細化
- ブレークポイント対応
---
### 7. **最適化機能未実装**
**問題**: WASM出力が最適化されていない
**未実装最適化**:
- デッドコード除去
- インライン展開
- 定数畳み込み
---
## 📊 **問題優先度マトリクス**
| 問題 | 緊急度 | 重要度 | 修正工数 | 優先順位 |
|------|--------|--------|----------|----------|
| BoxCall未実装 | 高 | 高 | 中 | **1** |
| wasmtimeバージョン | 高 | 高 | 低 | **2** |
| WASM出力エラー | 高 | 中 | 中 | **3** |
| RuntimeImports | 中 | 高 | 高 | **4** |
| メモリ管理 | 中 | 中 | 高 | **5** |
| デバッグ情報 | 低 | 中 | 中 | **6** |
| 最適化 | 低 | 低 | 高 | **7** |
## 🎯 **修正ロードマップ**
### Phase 1: 基本機能復旧 (1週間)
1. **BoxCall命令実装**
2. **wasmtimeバージョン統一**
3. **WASM出力エラー修正**
### Phase 2: 機能拡充 (2週間)
4. **RuntimeImports完全実装**
5. **メモリ管理改善**
### Phase 3: 品質向上 (1週間)
6. **デバッグ情報強化**
7. **基本最適化実装**
## 📝 **テスト必要項目**
### 基本動作テスト
```bash
# BoxCall テスト
./target/release/nyash --compile-wasm test_boxcall.nyash
# AOT テスト
./target/release/nyash --aot test_simple.nyash
wasmtime --allow-precompiled test_simple.cwasm
```
### 互換性テスト
```bash
# バージョン確認
cargo tree | grep wasmtime
wasmtime --version
# 実行テスト
wasmtime test_output.wasm
```
---
**🎯 目標**: Phase 1完了でWASM基本機能復旧、Nyash WASMが実用レベルに到達

View File

@ -0,0 +1,228 @@
# 🚫 WASM Backend 未実装機能一覧
## 📅 最終更新: 2025-08-15
## 🎯 **概要**
NyashのWASM Backend で現在未実装のMIR命令・機能・Nyash言語機能を体系的にまとめました。
---
## 🔴 **緊急度: 高 - 基本機能**
### 1. **BoxCall命令**
**MIR命令**: `BoxCall { dst, box_val, method, args, effects }`
**未実装メソッド**:
```rust
// 基本Box操作
toString() // ❌ 文字列変換
equals(other) // ❌ 等価比較
clone() // ❌ オブジェクト複製
// StringBox
length() // ❌ 文字列長
substring(start, end) // ❌ 部分文字列
indexOf(str) // ❌ 文字列検索
// IntegerBox/Math
add(other) // ❌ 加算
subtract(other) // ❌ 減算
multiply(other) // ❌ 乗算
divide(other) // ❌ 除算
// ArrayBox
push(item) // ❌ 要素追加
pop() // ❌ 要素削除
get(index) // ❌ 要素取得
length() // ❌ 配列長
// ConsoleBox
log(message) // ❌ コンソール出力
warn(message) // ❌ 警告出力
error(message) // ❌ エラー出力
```
**修正ファイル**: `src/backend/wasm/codegen.rs`
---
### 2. **ExternCall命令**
**MIR命令**: `ExternCall { dst, extern_name, method, args, effects }`
**未実装機能**:
```rust
// ブラウザーAPI
console_log(msg) // ❌ JavaScript console.log
canvas_fillRect() // ❌ Canvas描画
fetch(url) // ❌ HTTP通信
// システムAPI
file_read(path) // ❌ ファイル読み取り
file_write(path, data) // ❌ ファイル書き込み
```
**修正ファイル**: `src/backend/wasm/runtime.rs`
---
## 🟠 **緊急度: 中 - 制御フロー**
### 3. **条件分岐最適化**
**MIR命令**: `Branch`, `Jump`, `Compare`
**問題**:
- ネストした条件分岐のブロック管理
- Switch文相当の最適化
- 短絡評価 (and, or) の効率化
### 4. **ループ最適化**
**MIR命令**: `Loop`, `Phi`
**未実装**:
- ループ内変数の最適化
- 無限ループ検出・対策
- ループアンローリング
---
## 🟡 **緊急度: 低 - 高級機能**
### 5. **メモリ管理高級機能**
**未実装機能**:
```rust
// 弱参照
WeakNew, WeakLoad, WeakCheck // ❌ 弱参照システム
// メモリ同期
MemCopy, AtomicFence // ❌ メモリ操作・同期
// ガベージコレクション
// 自動メモリ解放、循環参照検出
```
### 6. **並行処理**
**未実装機能**:
```rust
// 非同期・並行
Send, Recv // ❌ メッセージパッシング
Safepoint // ❌ GC安全点
// スレッド・タスク
spawn_task() // ❌ タスク生成
await_result() // ❌ 非同期待機
```
### 7. **例外処理**
**未実装機能**:
```rust
// 例外・エラーハンドリング
try_catch() // ❌ 例外キャッチ
throw_error() // ❌ 例外スロー
finally_block() // ❌ finally実行
```
---
## 📊 **実装優先度マトリクス**
| 機能カテゴリ | 緊急度 | 実装工数 | ユーザー影響 | 優先順位 |
|--------------|--------|----------|--------------|----------|
| **BoxCall基本** | 高 | 中 | 致命的 | **1** |
| **ExternCall** | 高 | 高 | 高 | **2** |
| **条件分岐** | 中 | 低 | 中 | **3** |
| **ループ最適化** | 中 | 中 | 中 | **4** |
| **メモリ管理** | 低 | 高 | 低 | **5** |
| **並行処理** | 低 | 高 | 低 | **6** |
| **例外処理** | 低 | 中 | 低 | **7** |
---
## 🛠️ **実装戦略**
### Phase 1: BoxCall基本実装 (1週間)
```rust
// 目標: 基本的なNyashプログラムがWASMで動作
impl WasmCodegen {
fn generate_box_call(&mut self, dst: Option<ValueId>, box_val: ValueId,
method: &str, args: Vec<ValueId>) -> Result<(), WasmError> {
match method {
"toString" => self.generate_to_string_call(dst, box_val),
"equals" => self.generate_equals_call(dst, box_val, args),
"length" => self.generate_length_call(dst, box_val),
// ... 基本メソッド追加
_ => Err(WasmError::UnsupportedInstruction(format!("Unknown method: {}", method)))
}
}
}
```
### Phase 2: ExternCall統合 (2週間)
```rust
// 目標: ブラウザーとの連携動作
impl RuntimeImports {
fn register_browser_apis(&mut self) {
self.register("console_log", console_log_impl);
self.register("canvas_fillRect", canvas_fill_rect_impl);
// ... ブラウザーAPI追加
}
}
```
### Phase 3: 最適化・高級機能 (1ヶ月)
- 制御フロー最適化
- メモリ管理改善
- パフォーマンス向上
---
## 📋 **テストケース**
### Level 1: 基本BoxCall
```nyash
# test_basic_boxcall.nyash
local str = "Hello"
local len = str.length() # BoxCall実装必要
print("Length: " + len.toString()) # BoxCall + ExternCall
```
### Level 2: Box操作
```nyash
# test_box_operations.nyash
local arr = new ArrayBox()
arr.push("item1") # BoxCall実装必要
local item = arr.get(0) # BoxCall実装必要
print(item.toString()) # BoxCall実装必要
```
### Level 3: 外部連携
```nyash
# test_extern_integration.nyash
local console = new ExternBox("console")
console.call("log", "Hello Browser!") # ExternCall実装必要
```
---
## ✅ **実装完了判定基準**
### 基本機能復旧
```bash
# 以下が全て成功すること
./target/release/nyash --compile-wasm test_basic_boxcall.nyash
./target/release/nyash --compile-wasm test_box_operations.nyash
./target/release/nyash --compile-wasm test_extern_integration.nyash
# WASM実行成功
wasmtime test_basic_boxcall.wasm
wasmtime test_box_operations.wasm
wasmtime test_extern_integration.wasm
```
### パフォーマンス基準
- コンパイル時間: インタープリター比 2倍以内
- 実行速度: インタープリター比 5倍以上高速
- メモリ使用量: 合理的範囲内
---
**🎯 目標**: Phase 1完了でNyash WASM基本機能が実用レベルに到達し、Phase 2でブラウザー連携が完全動作する状態を実現