🏗️ feat: Phase 9.78b準備 - インタープリター・VM統合アーキテクチャ設計
Phase 9.78b: Codexの天才的分析に基づくアーキテクチャ再設計準備 ## 📋 実施内容 1. Codex分析結果のアーカイブ - 実装詳細共有 → モデル共有・実行時共有への転換提案 - 8ステップの段階的実装計画 2. Phase 9.78a作業の保存 - MIR生成でのNewBox命令統一(保持) - ScopeTracker基本実装(一時コメントアウト) - VM拡張の方向性(TODOコメント付き) 3. ビルドエラー修正 - ScopeTrackerインポート問題を一時的に解決 - ビルド成功(警告のみ) ## 📚 作成ドキュメント - architecture-redesign-proposal.md - Codexの設計提案 - phase_9_78b_interpreter_architecture_refactoring.md - 実装計画 - codex-analysis/* - 分析結果アーカイブ ## 🎯 次のステップ Phase 9.78b Step 1: BoxDeclarationをcore::modelへ移動
This commit is contained in:
791
build_error.txt
791
build_error.txt
@ -1,791 +0,0 @@
|
|||||||
warning: unused imports: `BasicBlockIdGenerator`, `BasicBlock`, `CompareOp`, `EffectMask`, `MirFunction`, and `ValueIdGenerator`
|
|
||||||
--> src/mir/loop_builder.rs:9:21
|
|
||||||
|
|
|
||||||
9 | MirInstruction, BasicBlock, BasicBlockId, MirFunction, ValueId,
|
|
||||||
| ^^^^^^^^^^ ^^^^^^^^^^^
|
|
||||||
10 | ConstValue, CompareOp, BasicBlockIdGenerator, ValueIdGenerator, EffectMask
|
|
||||||
| ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_imports)]` on by default
|
|
||||||
|
|
||||||
warning: unused import: `HashSet`
|
|
||||||
--> src/mir/loop_builder.rs:13:33
|
|
||||||
|
|
|
||||||
13 | use std::collections::{HashMap, HashSet};
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
||||||
warning: unexpected `cfg` condition value: `llvm`
|
|
||||||
--> src/backend/mod.rs:13:7
|
|
||||||
|
|
|
||||||
13 | #[cfg(feature = "llvm")]
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: expected values for `feature` are: `all-examples`, `cli`, `default`, `dynamic-file`, `gui`, `gui-examples`, and `wasm-backend`
|
|
||||||
= help: consider adding `llvm` as a feature in `Cargo.toml`
|
|
||||||
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration
|
|
||||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
|
||||||
|
|
||||||
warning: unexpected `cfg` condition value: `llvm`
|
|
||||||
--> src/backend/mod.rs:23:7
|
|
||||||
|
|
|
||||||
23 | #[cfg(feature = "llvm")]
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: expected values for `feature` are: `all-examples`, `cli`, `default`, `dynamic-file`, `gui`, `gui-examples`, and `wasm-backend`
|
|
||||||
= help: consider adding `llvm` as a feature in `Cargo.toml`
|
|
||||||
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration
|
|
||||||
|
|
||||||
warning: unused import: `MirInstruction`
|
|
||||||
--> src/backend/vm_phi.rs:9:41
|
|
||||||
|
|
|
||||||
9 | use crate::mir::{BasicBlockId, ValueId, MirInstruction};
|
|
||||||
| ^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused import: `super::Usize`
|
|
||||||
--> src/bid/types.rs:1:5
|
|
||||||
|
|
|
||||||
1 | use super::Usize;
|
|
||||||
| ^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused import: `std::os::raw::c_char`
|
|
||||||
--> src/bid/plugin_api.rs:2:5
|
|
||||||
|
|
|
||||||
2 | use std::os::raw::c_char;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused imports: `NyashHostVtable`, `NyashMethodInfo`, and `NyashPluginInfo`
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:7:18
|
|
||||||
|
|
|
||||||
7 | use crate::bid::{NyashPluginInfo, NyashMethodInfo, NyashHostVtable};
|
|
||||||
| ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused imports: `SeekFrom` and `Seek`
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:10:28
|
|
||||||
|
|
|
||||||
10 | use std::io::{Read, Write, Seek, SeekFrom};
|
|
||||||
| ^^^^ ^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused imports: `c_char` and `c_void`
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:11:20
|
|
||||||
|
|
|
||||||
11 | use std::os::raw::{c_char, c_void};
|
|
||||||
| ^^^^^^ ^^^^^^
|
|
||||||
|
|
||||||
warning: unused imports: `CStr` and `CString`
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:13:16
|
|
||||||
|
|
|
||||||
13 | use std::ffi::{CStr, CString};
|
|
||||||
| ^^^^ ^^^^^^^
|
|
||||||
|
|
||||||
warning: unused import: `std::ffi::c_void`
|
|
||||||
--> src/bid/loader.rs:3:5
|
|
||||||
|
|
|
||||||
3 | use std::ffi::c_void;
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused imports: `TlvDecoder` and `TlvEncoder`
|
|
||||||
--> src/bid/generic_plugin_box.rs:2:23
|
|
||||||
|
|
|
||||||
2 | use crate::bid::tlv::{TlvEncoder, TlvDecoder};
|
|
||||||
| ^^^^^^^^^^ ^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused import: `crate::bid::types::BidTag`
|
|
||||||
--> src/bid/generic_plugin_box.rs:3:5
|
|
||||||
|
|
|
||||||
3 | use crate::bid::types::BidTag;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused import: `BoxBase`
|
|
||||||
--> src/runtime/plugin_loader_v2.rs:7:43
|
|
||||||
|
|
|
||||||
7 | use crate::box_trait::{NyashBox, BoxCore, BoxBase, StringBox};
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
||||||
warning: unused import: `std::ffi::c_void`
|
|
||||||
--> src/runtime/plugin_loader_v2.rs:11:5
|
|
||||||
|
|
|
||||||
11 | use std::ffi::c_void;
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused variable: `registry`
|
|
||||||
--> src/box_factory/plugin.rs:53:13
|
|
||||||
|
|
|
||||||
53 | let registry = get_global_registry();
|
|
||||||
| ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_registry`
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_variables)]` on by default
|
|
||||||
|
|
||||||
warning: unused variable: `args`
|
|
||||||
--> src/instance_v2.rs:147:28
|
|
||||||
|
|
|
||||||
147 | pub fn init(&mut self, args: &[Box<dyn NyashBox>]) -> Result<(), String> {
|
|
||||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_args`
|
|
||||||
|
|
||||||
warning: unused variable: `nyash_value`
|
|
||||||
--> src/instance_v2.rs:289:21
|
|
||||||
|
|
|
||||||
289 | if let Some(nyash_value) = self.fields_ng.lock().unwrap().get(field_name) {
|
|
||||||
| ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_nyash_value`
|
|
||||||
|
|
||||||
warning: unused variable: `block_id`
|
|
||||||
--> src/mir/loop_builder.rs:246:39
|
|
||||||
|
|
|
||||||
246 | fn mark_block_unsealed(&mut self, block_id: BasicBlockId) -> Result<(), String> {
|
|
||||||
| ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_block_id`
|
|
||||||
|
|
||||||
warning: unused variable: `block_id`
|
|
||||||
--> src/mir/loop_builder.rs:273:49
|
|
||||||
|
|
|
||||||
273 | fn get_variable_at_block(&self, name: &str, block_id: BasicBlockId) -> Option<ValueId> {
|
|
||||||
| ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_block_id`
|
|
||||||
|
|
||||||
warning: unused variable: `dst`
|
|
||||||
--> src/backend/vm_phi.rs:48:9
|
|
||||||
|
|
|
||||||
48 | dst: ValueId,
|
|
||||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_dst`
|
|
||||||
|
|
||||||
warning: unused variable: `f`
|
|
||||||
--> src/bid/plugin_api.rs:167:36
|
|
||||||
|
|
|
||||||
167 | pub fn with_alloc<F>(mut self, f: F) -> Self
|
|
||||||
| ^ help: if this is intentional, prefix it with an underscore: `_f`
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> src/bid/plugin_api.rs:167:26
|
|
||||||
|
|
|
||||||
167 | pub fn with_alloc<F>(mut self, f: F) -> Self
|
|
||||||
| ----^^^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_mut)]` on by default
|
|
||||||
|
|
||||||
warning: unused variable: `f`
|
|
||||||
--> src/bid/plugin_api.rs:176:35
|
|
||||||
|
|
|
||||||
176 | pub fn with_free<F>(mut self, f: F) -> Self
|
|
||||||
| ^ help: if this is intentional, prefix it with an underscore: `_f`
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> src/bid/plugin_api.rs:176:25
|
|
||||||
|
|
|
||||||
176 | pub fn with_free<F>(mut self, f: F) -> Self
|
|
||||||
| ----^^^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
||||||
warning: unused variable: `f`
|
|
||||||
--> src/bid/plugin_api.rs:183:34
|
|
||||||
|
|
|
||||||
183 | pub fn with_log<F>(mut self, f: F) -> Self
|
|
||||||
| ^ help: if this is intentional, prefix it with an underscore: `_f`
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> src/bid/plugin_api.rs:183:24
|
|
||||||
|
|
|
||||||
183 | pub fn with_log<F>(mut self, f: F) -> Self
|
|
||||||
| ----^^^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
||||||
warning: unused variable: `args`
|
|
||||||
--> src/runtime/plugin_loader_v2.rs:236:46
|
|
||||||
|
|
|
||||||
236 | pub fn create_box(&self, box_type: &str, args: &[Box<dyn NyashBox>]) -> BidResult<Box<dyn NyashBox>> {
|
|
||||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_args`
|
|
||||||
|
|
||||||
warning: type `FileMode` is more private than the item `FileBoxRegistry::open`
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:44:5
|
|
||||||
|
|
|
||||||
44 | pub fn open(&mut self, path: &str, mode: FileMode) -> Result<BidHandle, std::io::Error> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `FileBoxRegistry::open` is reachable at visibility `pub`
|
|
||||||
|
|
|
||||||
note: but type `FileMode` is only usable at visibility `pub(self)`
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:29:1
|
|
||||||
|
|
|
||||||
29 | enum FileMode {
|
|
||||||
| ^^^^^^^^^^^^^
|
|
||||||
= note: `#[warn(private_interfaces)]` on by default
|
|
||||||
|
|
||||||
warning: field `block_var_maps` is never read
|
|
||||||
--> src/mir/loop_builder.rs:35:5
|
|
||||||
|
|
|
||||||
27 | pub struct LoopBuilder<'a> {
|
|
||||||
| ----------- field in this struct
|
|
||||||
...
|
|
||||||
35 | block_var_maps: HashMap<BasicBlockId, HashMap<String, ValueId>>,
|
|
||||||
| ^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(dead_code)]` on by default
|
|
||||||
|
|
||||||
warning: fields `type_name_holder` and `method_holders` are never read
|
|
||||||
--> src/bid/metadata.rs:148:5
|
|
||||||
|
|
|
||||||
143 | pub struct PluginMetadata {
|
|
||||||
| -------------- fields in this struct
|
|
||||||
...
|
|
||||||
148 | type_name_holder: Option<CString>,
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
149 | method_holders: Vec<(NyashMethodInfo, CString)>,
|
|
||||||
| ^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: fields `path` and `mode` are never read
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:24:5
|
|
||||||
|
|
|
||||||
22 | struct FileBoxState {
|
|
||||||
| ------------ fields in this struct
|
|
||||||
23 | file: File,
|
|
||||||
24 | path: String,
|
|
||||||
| ^^^^
|
|
||||||
25 | mode: FileMode,
|
|
||||||
| ^^^^
|
|
||||||
|
|
||||||
warning: fields `box_types` and `init_fn` are never read
|
|
||||||
--> src/runtime/plugin_loader_v2.rs:20:5
|
|
||||||
|
|
|
||||||
15 | pub struct LoadedPluginV2 {
|
|
||||||
| -------------- fields in this struct
|
|
||||||
...
|
|
||||||
20 | box_types: Vec<String>,
|
|
||||||
| ^^^^^^^^^
|
|
||||||
...
|
|
||||||
23 | init_fn: Option<unsafe extern "C" fn() -> i32>,
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
||||||
warning: unused `Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:62:9
|
|
||||||
|
|
|
||||||
62 | self.add_predecessor(header_id, preheader_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
= note: `#[warn(unused_must_use)]` on by default
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
62 | let _ = self.add_predecessor(header_id, preheader_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: unused `Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:66:9
|
|
||||||
|
|
|
||||||
66 | self.mark_block_unsealed(header_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
66 | let _ = self.mark_block_unsealed(header_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: unused `Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:78:9
|
|
||||||
|
|
|
||||||
78 | self.add_predecessor(body_id, header_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
78 | let _ = self.add_predecessor(body_id, header_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: unused `Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:79:9
|
|
||||||
|
|
|
||||||
79 | self.add_predecessor(after_loop_id, header_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
79 | let _ = self.add_predecessor(after_loop_id, header_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: unused `Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:93:9
|
|
||||||
|
|
|
||||||
93 | self.add_predecessor(header_id, latch_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
93 | let _ = self.add_predecessor(header_id, latch_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: creating a shared reference to mutable static
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:102:12
|
|
||||||
|
|
|
||||||
102 | if FILEBOX_REGISTRY.is_none() {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ shared reference to mutable static
|
|
||||||
|
|
|
||||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2024/static-mut-references.html>
|
|
||||||
= note: shared references to mutable statics are dangerous; it's undefined behavior if the static is mutated or if a mutable reference is created for it while the shared reference lives
|
|
||||||
= note: `#[warn(static_mut_refs)]` on by default
|
|
||||||
|
|
||||||
warning: creating a shared reference to mutable static
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:105:9
|
|
||||||
|
|
|
||||||
105 | FILEBOX_REGISTRY.as_ref().unwrap().clone()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ shared reference to mutable static
|
|
||||||
|
|
|
||||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2024/static-mut-references.html>
|
|
||||||
= note: shared references to mutable statics are dangerous; it's undefined behavior if the static is mutated or if a mutable reference is created for it while the shared reference lives
|
|
||||||
|
|
||||||
warning: unused imports: `BoolBox`, `IntegerBox`, and `StringBox`
|
|
||||||
--> src/ast.rs:885:28
|
|
||||||
|
|
|
||||||
885 | use crate::box_trait::{StringBox, IntegerBox, BoolBox};
|
|
||||||
| ^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_imports)]` on by default
|
|
||||||
|
|
||||||
warning: unused import: `Mutex`
|
|
||||||
--> src/instance_v2.rs:387:26
|
|
||||||
|
|
|
||||||
387 | use std::sync::{Arc, Mutex};
|
|
||||||
| ^^^^^
|
|
||||||
|
|
||||||
warning: unused imports: `BasicBlockIdGenerator`, `BasicBlock`, `CompareOp`, `EffectMask`, `MirFunction`, and `ValueIdGenerator`
|
|
||||||
--> src/mir/loop_builder.rs:9:21
|
|
||||||
|
|
|
||||||
9 | MirInstruction, BasicBlock, BasicBlockId, MirFunction, ValueId,
|
|
||||||
| ^^^^^^^^^^ ^^^^^^^^^^^
|
|
||||||
10 | ConstValue, CompareOp, BasicBlockIdGenerator, ValueIdGenerator, EffectMask
|
|
||||||
| ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused import: `BasicBlock`
|
|
||||||
--> src/mir/verification.rs:311:75
|
|
||||||
|
|
|
||||||
311 | use crate::mir::{MirFunction, FunctionSignature, MirType, EffectMask, BasicBlock};
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused imports: `BasicBlock`, `EffectMask`, `FunctionSignature`, `MirFunction`, `MirModule`, and `MirType`
|
|
||||||
--> src/backend/vm.rs:860:22
|
|
||||||
|
|
|
||||||
860 | use crate::mir::{MirModule, MirFunction, FunctionSignature, MirType, EffectMask, BasicBlock};
|
|
||||||
| ^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused imports: `BidHandle` and `BoxTypeId`
|
|
||||||
--> src/runtime/tests.rs:10:22
|
|
||||||
|
|
|
||||||
10 | use crate::bid::{BidHandle, BoxTypeId};
|
|
||||||
| ^^^^^^^^^ ^^^^^^^^^
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> src/mir/basic_block.rs:314:13
|
|
||||||
|
|
|
||||||
314 | let mut bb = BasicBlock::new(bb_id);
|
|
||||||
| ----^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_mut)]` on by default
|
|
||||||
|
|
||||||
warning: unused variable: `child`
|
|
||||||
--> src/mir/ownership_verifier_simple.rs:313:13
|
|
||||||
|
|
|
||||||
313 | let child = value_gen.next();
|
|
||||||
| ^^^^^ help: if this is intentional, prefix it with an underscore: `_child`
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> src/bid/plugin_api.rs:167:26
|
|
||||||
|
|
|
||||||
167 | pub fn with_alloc<F>(mut self, f: F) -> Self
|
|
||||||
| ----^^^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
||||||
warning: unused variable: `config`
|
|
||||||
--> src/config/nyash_toml_v2.rs:179:13
|
|
||||||
|
|
|
||||||
179 | let config: toml::Value = toml::from_str(toml_str).unwrap();
|
|
||||||
| ^^^^^^ help: if this is intentional, prefix it with an underscore: `_config`
|
|
||||||
|
|
||||||
warning: unused variable: `nyash_config`
|
|
||||||
--> src/config/nyash_toml_v2.rs:180:13
|
|
||||||
|
|
|
||||||
180 | let nyash_config = NyashConfigV2::from_file("test.toml");
|
|
||||||
| ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_nyash_config`
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> src/tests/box_tests.rs:11:13
|
|
||||||
|
|
|
||||||
11 | let mut array = ArrayBox::new();
|
|
||||||
| ----^^^^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> src/tests/box_tests.rs:90:13
|
|
||||||
|
|
|
||||||
90 | let mut stream = NyashStreamBox::from_data(vec![72, 101, 108, 108, 111]); // "Hello"
|
|
||||||
| ----^^^^^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
||||||
warning: `nyash-rust` (lib) generated 41 warnings (run `cargo fix --lib -p nyash-rust` to apply 17 suggestions)
|
|
||||||
warning: `nyash-rust` (lib test) generated 52 warnings (39 duplicates) (run `cargo fix --lib -p nyash-rust --tests` to apply 10 suggestions)
|
|
||||||
Compiling nyash-rust v0.1.0 (/mnt/c/git/nyash-project/nyash)
|
|
||||||
warning: unexpected `cfg` condition value: `llvm`
|
|
||||||
--> src/runner.rs:22:7
|
|
||||||
|
|
|
||||||
22 | #[cfg(feature = "llvm")]
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: expected values for `feature` are: `all-examples`, `cli`, `default`, `dynamic-file`, `gui`, `gui-examples`, and `wasm-backend`
|
|
||||||
= help: consider adding `llvm` as a feature in `Cargo.toml`
|
|
||||||
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration
|
|
||||||
|
|
||||||
warning: unexpected `cfg` condition value: `llvm`
|
|
||||||
--> src/runner.rs:503:15
|
|
||||||
|
|
|
||||||
503 | #[cfg(feature = "llvm")]
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: expected values for `feature` are: `all-examples`, `cli`, `default`, `dynamic-file`, `gui`, `gui-examples`, and `wasm-backend`
|
|
||||||
= help: consider adding `llvm` as a feature in `Cargo.toml`
|
|
||||||
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration
|
|
||||||
|
|
||||||
warning: unexpected `cfg` condition value: `llvm`
|
|
||||||
--> src/runner.rs:526:19
|
|
||||||
|
|
|
||||||
526 | #[cfg(not(feature = "llvm"))]
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: expected values for `feature` are: `all-examples`, `cli`, `default`, `dynamic-file`, `gui`, `gui-examples`, and `wasm-backend`
|
|
||||||
= help: consider adding `llvm` as a feature in `Cargo.toml`
|
|
||||||
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> src/runner.rs:286:17
|
|
||||||
|
|
|
||||||
286 | let mut printer = if self.config.mir_verbose {
|
|
||||||
| ----^^^^^^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_mut)]` on by default
|
|
||||||
|
|
||||||
warning: type `FileMode` is more private than the item `bid::plugins::filebox::FileBoxRegistry::open`
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:44:5
|
|
||||||
|
|
|
||||||
44 | pub fn open(&mut self, path: &str, mode: FileMode) -> Result<BidHandle, std::io::Error> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `bid::plugins::filebox::FileBoxRegistry::open` is reachable at visibility `pub`
|
|
||||||
|
|
|
||||||
note: but type `FileMode` is only usable at visibility `pub(self)`
|
|
||||||
--> src/bid/plugins/filebox/mod.rs:29:1
|
|
||||||
|
|
|
||||||
29 | enum FileMode {
|
|
||||||
| ^^^^^^^^^^^^^
|
|
||||||
= note: `#[warn(private_interfaces)]` on by default
|
|
||||||
|
|
||||||
warning: unused `std::result::Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:62:9
|
|
||||||
|
|
|
||||||
62 | self.add_predecessor(header_id, preheader_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
= note: `#[warn(unused_must_use)]` on by default
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
62 | let _ = self.add_predecessor(header_id, preheader_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: unused `std::result::Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:66:9
|
|
||||||
|
|
|
||||||
66 | self.mark_block_unsealed(header_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
66 | let _ = self.mark_block_unsealed(header_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: unused `std::result::Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:78:9
|
|
||||||
|
|
|
||||||
78 | self.add_predecessor(body_id, header_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
78 | let _ = self.add_predecessor(body_id, header_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: unused `std::result::Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:79:9
|
|
||||||
|
|
|
||||||
79 | self.add_predecessor(after_loop_id, header_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
79 | let _ = self.add_predecessor(after_loop_id, header_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: unused `std::result::Result` that must be used
|
|
||||||
--> src/mir/loop_builder.rs:93:9
|
|
||||||
|
|
|
||||||
93 | self.add_predecessor(header_id, latch_id);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: this `Result` may be an `Err` variant, which should be handled
|
|
||||||
help: use `let _ = ...` to ignore the resulting value
|
|
||||||
|
|
|
||||||
93 | let _ = self.add_predecessor(header_id, latch_id);
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
warning: unused import: `VMValue`
|
|
||||||
--> tests/mir_phase6_vm_ref_ops.rs:11:31
|
|
||||||
|
|
|
||||||
11 | use nyash_rust::backend::{VM, VMValue};
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_imports)]` on by default
|
|
||||||
|
|
||||||
warning: unused import: `NyashBox`
|
|
||||||
--> tests/mir_phase6_vm_ref_ops.rs:12:41
|
|
||||||
|
|
|
||||||
12 | use nyash_rust::box_trait::{IntegerBox, NyashBox};
|
|
||||||
| ^^^^^^^^
|
|
||||||
|
|
||||||
warning: unused variable: `vm`
|
|
||||||
--> tests/mir_phase6_vm_ref_ops.rs:139:13
|
|
||||||
|
|
|
||||||
139 | let mut vm = VM::new();
|
|
||||||
| ^^ help: if this is intentional, prefix it with an underscore: `_vm`
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_variables)]` on by default
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> tests/mir_phase6_vm_ref_ops.rs:139:9
|
|
||||||
|
|
|
||||||
139 | let mut vm = VM::new();
|
|
||||||
| ----^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_mut)]` on by default
|
|
||||||
|
|
||||||
warning: unused import: `std::collections::HashMap`
|
|
||||||
--> tests/integration_tests.rs:9:5
|
|
||||||
|
|
|
||||||
9 | use std::collections::HashMap;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_imports)]` on by default
|
|
||||||
|
|
||||||
warning: function `execute_nyash_code` is never used
|
|
||||||
--> tests/integration_tests.rs:12:4
|
|
||||||
|
|
|
||||||
12 | fn execute_nyash_code(code: &str) -> Result<String, String> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(dead_code)]` on by default
|
|
||||||
|
|
||||||
error: couldn't read `examples/C:/Windows/Fonts/arial.ttf`: No such file or directory (os error 2)
|
|
||||||
--> examples/simple_notepad_win.rs:32:57
|
|
||||||
|
|
|
||||||
32 | std::sync::Arc::new(egui::FontData::from_static(include_bytes!(
|
|
||||||
| _________________________________________________________^
|
|
||||||
33 | | "C:/Windows/Fonts/arial.ttf"
|
|
||||||
34 | | ))),
|
|
||||||
| |_________^
|
|
||||||
|
|
||||||
warning: `nyash-rust` (bin "nyash") generated 45 warnings (35 duplicates) (run `cargo fix --bin "nyash"` to apply 1 suggestion)
|
|
||||||
warning: `nyash-rust` (test "mir_phase6_vm_ref_ops") generated 4 warnings (run `cargo fix --test "mir_phase6_vm_ref_ops"` to apply 2 suggestions)
|
|
||||||
warning: `nyash-rust` (test "integration_tests") generated 2 warnings (run `cargo fix --test "integration_tests"` to apply 1 suggestion)
|
|
||||||
error[E0432]: unresolved import `nyash_rust::backend::wasm`
|
|
||||||
--> tests/wasm_poc2_box_operations.rs:17:26
|
|
||||||
|
|
|
||||||
17 | use nyash_rust::backend::wasm::WasmBackend;
|
|
||||||
| ^^^^ could not find `wasm` in `backend`
|
|
||||||
|
|
|
||||||
note: found an item that was configured out
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:9:9
|
|
||||||
|
|
|
||||||
9 | pub mod wasm;
|
|
||||||
| ^^^^
|
|
||||||
note: the item is gated behind the `wasm-backend` feature
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:8:7
|
|
||||||
|
|
|
||||||
8 | #[cfg(feature = "wasm-backend")]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `nyash_rust::backend::wasm`
|
|
||||||
--> tests/wasm_poc1_basic_operations.rs:15:26
|
|
||||||
|
|
|
||||||
15 | use nyash_rust::backend::wasm::WasmBackend;
|
|
||||||
| ^^^^ could not find `wasm` in `backend`
|
|
||||||
|
|
|
||||||
note: found an item that was configured out
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:9:9
|
|
||||||
|
|
|
||||||
9 | pub mod wasm;
|
|
||||||
| ^^^^
|
|
||||||
note: the item is gated behind the `wasm-backend` feature
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:8:7
|
|
||||||
|
|
|
||||||
8 | #[cfg(feature = "wasm-backend")]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `nyash_rust::backend::wasm`
|
|
||||||
--> tests/wasm_string_constants.rs:15:26
|
|
||||||
|
|
|
||||||
15 | use nyash_rust::backend::wasm::WasmBackend;
|
|
||||||
| ^^^^ could not find `wasm` in `backend`
|
|
||||||
|
|
|
||||||
note: found an item that was configured out
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:9:9
|
|
||||||
|
|
|
||||||
9 | pub mod wasm;
|
|
||||||
| ^^^^
|
|
||||||
note: the item is gated behind the `wasm-backend` feature
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:8:7
|
|
||||||
|
|
|
||||||
8 | #[cfg(feature = "wasm-backend")]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0432`.
|
|
||||||
error: could not compile `nyash-rust` (test "wasm_poc2_box_operations") due to 1 previous error
|
|
||||||
warning: build failed, waiting for other jobs to finish...
|
|
||||||
error: could not compile `nyash-rust` (test "wasm_string_constants") due to 1 previous error
|
|
||||||
error: could not compile `nyash-rust` (test "wasm_poc1_basic_operations") due to 1 previous error
|
|
||||||
error[E0433]: failed to resolve: unresolved import
|
|
||||||
--> tests/array_state_sharing_test.rs:4:16
|
|
||||||
|
|
|
||||||
4 | use crate::boxes::array::ArrayBox;
|
|
||||||
| ^^^^^
|
|
||||||
| |
|
|
||||||
| unresolved import
|
|
||||||
| help: a similar path exists: `nyash_rust::boxes`
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `crate::interpreter`
|
|
||||||
--> tests/array_state_sharing_test.rs:3:16
|
|
||||||
|
|
|
||||||
3 | use crate::interpreter::Interpreter;
|
|
||||||
| ^^^^^^^^^^^
|
|
||||||
| |
|
|
||||||
| unresolved import
|
|
||||||
| help: a similar path exists: `nyash_rust::interpreter`
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `crate::box_trait`
|
|
||||||
--> tests/array_state_sharing_test.rs:5:16
|
|
||||||
|
|
|
||||||
5 | use crate::box_trait::{NyashBox, IntegerBox, StringBox};
|
|
||||||
| ^^^^^^^^^
|
|
||||||
| |
|
|
||||||
| unresolved import
|
|
||||||
| help: a similar path exists: `nyash_rust::box_trait`
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `crate::mir`
|
|
||||||
--> tests/mir_phase8_5_hierarchical_25_instructions.rs:7:12
|
|
||||||
|
|
|
||||||
7 | use crate::mir::{
|
|
||||||
| ^^^
|
|
||||||
| |
|
|
||||||
| unresolved import
|
|
||||||
| help: a similar path exists: `nyash_rust::mir`
|
|
||||||
|
|
||||||
Some errors have detailed explanations: E0432, E0433.
|
|
||||||
For more information about an error, try `rustc --explain E0432`.
|
|
||||||
error: could not compile `nyash-rust` (test "array_state_sharing_test") due to 3 previous errors
|
|
||||||
error: could not compile `nyash-rust` (test "mir_phase8_5_hierarchical_25_instructions") due to 1 previous error
|
|
||||||
error[E0432]: unresolved import `eframe`
|
|
||||||
--> examples/simple_notepad_win.rs:4:5
|
|
||||||
|
|
|
||||||
4 | use eframe::egui;
|
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
|
||||||
--> examples/simple_notepad_win.rs:6:14
|
|
||||||
|
|
|
||||||
6 | fn main() -> eframe::Result {
|
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
|
||||||
--> examples/simple_notepad_win.rs:7:19
|
|
||||||
|
|
|
||||||
7 | let options = eframe::NativeOptions {
|
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
|
||||||
--> examples/simple_notepad_win.rs:14:5
|
|
||||||
|
|
|
||||||
14 | eframe::run_native(
|
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
|
||||||
--> examples/simple_notepad_win.rs:69:6
|
|
||||||
|
|
|
||||||
69 | impl eframe::App for NyashNotepad {
|
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
|
||||||
--> examples/simple_notepad_win.rs:70:60
|
|
||||||
|
|
|
||||||
70 | fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error: could not compile `nyash-rust` (example "simple_notepad_win") due to 7 previous errors
|
|
||||||
warning: unused import: `BoxCore`
|
|
||||||
--> src/main.rs:71:32
|
|
||||||
|
|
|
||||||
71 | use box_trait::{StringBox, BoxCore};
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
||||||
error[E0599]: no method named `to_string_box` found for struct `box_trait::StringBox` in the current scope
|
|
||||||
--> src/main.rs:77:31
|
|
||||||
|
|
|
||||||
77 | assert_eq!(string_box.to_string_box().value, "test");
|
|
||||||
| ^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
::: src/box_trait.rs:96:8
|
|
||||||
|
|
|
||||||
96 | fn to_string_box(&self) -> StringBox;
|
|
||||||
| ------------- the method is available for `box_trait::StringBox` here
|
|
||||||
...
|
|
||||||
127 | pub struct StringBox {
|
|
||||||
| -------------------- method `to_string_box` not found for this struct
|
|
||||||
|
|
|
||||||
= help: items from traits can only be used if the trait is in scope
|
|
||||||
help: trait `NyashBox` which provides `to_string_box` is implemented but not in scope; perhaps you want to import it
|
|
||||||
|
|
|
||||||
70 + use crate::box_trait::NyashBox;
|
|
||||||
|
|
|
||||||
help: there is a method `to_string` with a similar name
|
|
||||||
|
|
|
||||||
77 - assert_eq!(string_box.to_string_box().value, "test");
|
|
||||||
77 + assert_eq!(string_box.to_string().value, "test");
|
|
||||||
|
|
|
||||||
|
|
||||||
warning: variable does not need to be mutable
|
|
||||||
--> src/runner.rs:286:17
|
|
||||||
|
|
|
||||||
286 | let mut printer = if self.config.mir_verbose {
|
|
||||||
| ----^^^^^^^
|
|
||||||
| |
|
|
||||||
| help: remove this `mut`
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0599`.
|
|
||||||
warning: `nyash-rust` (bin "nyash" test) generated 43 warnings (41 duplicates)
|
|
||||||
error: could not compile `nyash-rust` (bin "nyash" test) due to 1 previous error; 43 warnings emitted
|
|
||||||
|
|||||||
@ -1,267 +1,275 @@
|
|||||||
Compiling proc-macro2 v1.0.95
|
|
||||||
Compiling unicode-ident v1.0.18
|
|
||||||
Compiling serde v1.0.219
|
|
||||||
Compiling cfg-if v1.0.1
|
|
||||||
Compiling wasm-bindgen-shared v0.2.100
|
|
||||||
Compiling memchr v2.7.5
|
|
||||||
Compiling log v0.4.27
|
|
||||||
Compiling bumpalo v3.19.0
|
|
||||||
Compiling rustversion v1.0.21
|
|
||||||
Compiling utf8parse v0.2.2
|
|
||||||
Compiling autocfg v1.5.0
|
|
||||||
Compiling regex-syntax v0.8.5
|
|
||||||
Compiling is_terminal_polyfill v1.70.1
|
|
||||||
Compiling anstyle v1.0.11
|
|
||||||
Compiling colorchoice v1.0.4
|
|
||||||
Compiling crossbeam-utils v0.8.21
|
|
||||||
Compiling wasm-bindgen v0.2.100
|
|
||||||
Compiling once_cell v1.21.3
|
|
||||||
Compiling anstyle-query v1.1.3
|
|
||||||
Compiling serde_json v1.0.142
|
|
||||||
Compiling hashbrown v0.15.5
|
|
||||||
Compiling equivalent v1.0.2
|
|
||||||
Compiling itoa v1.0.15
|
|
||||||
Compiling strsim v0.11.1
|
|
||||||
Compiling heck v0.5.0
|
|
||||||
Compiling clap_lex v0.7.5
|
|
||||||
Compiling ryu v1.0.20
|
|
||||||
Compiling thiserror v2.0.12
|
|
||||||
Compiling rayon-core v1.12.1
|
|
||||||
Compiling toml_write v0.1.2
|
|
||||||
Compiling anyhow v1.0.98
|
|
||||||
Compiling anstyle-parse v0.2.7
|
|
||||||
Compiling either v1.15.0
|
|
||||||
Compiling libc v0.2.174
|
|
||||||
Compiling winnow v0.7.12
|
|
||||||
Compiling half v2.6.0
|
|
||||||
Compiling iana-time-zone v0.1.63
|
|
||||||
Compiling jiff v0.2.15
|
|
||||||
Compiling aho-corasick v1.1.3
|
|
||||||
Compiling indexmap v2.10.0
|
|
||||||
Compiling anstream v0.6.19
|
|
||||||
Compiling plotters-backend v0.3.7
|
|
||||||
Compiling ciborium-io v0.2.2
|
|
||||||
Compiling itertools v0.10.5
|
|
||||||
Compiling libloading v0.8.8
|
|
||||||
Compiling same-file v1.0.6
|
|
||||||
Compiling lazy_static v1.5.0
|
|
||||||
Compiling cast v0.3.0
|
|
||||||
Compiling oorandom v11.1.5
|
|
||||||
Compiling anes v0.1.6
|
|
||||||
Compiling ciborium-ll v0.2.2
|
|
||||||
Compiling num-traits v0.2.19
|
|
||||||
Compiling plotters-svg v0.3.7
|
|
||||||
Compiling walkdir v2.5.0
|
|
||||||
Compiling clap_builder v4.5.42
|
|
||||||
Compiling regex-automata v0.4.9
|
|
||||||
Compiling criterion-plot v0.5.0
|
|
||||||
Compiling regex v1.11.1
|
|
||||||
Compiling env_filter v0.1.3
|
|
||||||
Compiling crossbeam-epoch v0.9.18
|
|
||||||
Compiling env_logger v0.11.8
|
|
||||||
Compiling crossbeam-deque v0.8.6
|
|
||||||
Compiling quote v1.0.40
|
|
||||||
Compiling syn v2.0.104
|
|
||||||
Compiling rayon v1.10.0
|
|
||||||
Compiling is-terminal v0.4.16
|
|
||||||
Compiling chrono v0.4.41
|
|
||||||
Compiling plotters v0.3.7
|
|
||||||
Compiling wasm-bindgen-backend v0.2.100
|
|
||||||
Compiling serde_derive v1.0.219
|
|
||||||
Compiling clap_derive v4.5.41
|
|
||||||
Compiling thiserror-impl v2.0.12
|
|
||||||
Compiling wasm-bindgen-macro-support v0.2.100
|
|
||||||
Compiling wasm-bindgen-macro v0.2.100
|
|
||||||
Compiling clap v4.5.42
|
|
||||||
Compiling js-sys v0.3.77
|
|
||||||
Compiling console_error_panic_hook v0.1.7
|
|
||||||
Compiling toml_datetime v0.6.11
|
|
||||||
Compiling serde_spanned v0.6.9
|
|
||||||
Compiling ciborium v0.2.2
|
|
||||||
Compiling toml_edit v0.22.27
|
|
||||||
Compiling tinytemplate v1.2.1
|
|
||||||
Compiling criterion v0.5.1
|
|
||||||
Compiling toml v0.8.23
|
|
||||||
Compiling web-sys v0.3.77
|
|
||||||
Compiling nyash-rust v0.1.0 (/mnt/c/git/nyash-project/nyash)
|
Compiling nyash-rust v0.1.0 (/mnt/c/git/nyash-project/nyash)
|
||||||
error: couldn't read `examples/C:/Windows/Fonts/arial.ttf`: No such file or directory (os error 2)
|
warning: unused macro definition: `debug_trace`
|
||||||
--> examples/simple_notepad_win.rs:32:57
|
--> src/interpreter/core.rs:33:14
|
||||||
|
|
|
|
||||||
32 | std::sync::Arc::new(egui::FontData::from_static(include_bytes!(
|
33 | macro_rules! debug_trace {
|
||||||
| _________________________________________________________^
|
|
||||||
33 | | "C:/Windows/Fonts/arial.ttf"
|
|
||||||
34 | | ))),
|
|
||||||
| |_________^
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `nyash_rust::backend::wasm`
|
|
||||||
--> tests/wasm_poc1_basic_operations.rs:15:26
|
|
||||||
|
|
|
||||||
15 | use nyash_rust::backend::wasm::WasmBackend;
|
|
||||||
| ^^^^ could not find `wasm` in `backend`
|
|
||||||
|
|
|
||||||
note: found an item that was configured out
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:9:9
|
|
||||||
|
|
|
||||||
9 | pub mod wasm;
|
|
||||||
| ^^^^
|
|
||||||
note: the item is gated behind the `wasm-backend` feature
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:8:7
|
|
||||||
|
|
|
||||||
8 | #[cfg(feature = "wasm-backend")]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `nyash_rust::backend::wasm`
|
|
||||||
--> tests/wasm_poc2_box_operations.rs:17:26
|
|
||||||
|
|
|
||||||
17 | use nyash_rust::backend::wasm::WasmBackend;
|
|
||||||
| ^^^^ could not find `wasm` in `backend`
|
|
||||||
|
|
|
||||||
note: found an item that was configured out
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:9:9
|
|
||||||
|
|
|
||||||
9 | pub mod wasm;
|
|
||||||
| ^^^^
|
|
||||||
note: the item is gated behind the `wasm-backend` feature
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:8:7
|
|
||||||
|
|
|
||||||
8 | #[cfg(feature = "wasm-backend")]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `nyash_rust::backend::wasm`
|
|
||||||
--> tests/wasm_string_constants.rs:15:26
|
|
||||||
|
|
|
||||||
15 | use nyash_rust::backend::wasm::WasmBackend;
|
|
||||||
| ^^^^ could not find `wasm` in `backend`
|
|
||||||
|
|
|
||||||
note: found an item that was configured out
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:9:9
|
|
||||||
|
|
|
||||||
9 | pub mod wasm;
|
|
||||||
| ^^^^
|
|
||||||
note: the item is gated behind the `wasm-backend` feature
|
|
||||||
--> /mnt/c/git/nyash-project/nyash/src/backend/mod.rs:8:7
|
|
||||||
|
|
|
||||||
8 | #[cfg(feature = "wasm-backend")]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0432`.
|
|
||||||
error: could not compile `nyash-rust` (test "wasm_poc1_basic_operations") due to 1 previous error
|
|
||||||
warning: build failed, waiting for other jobs to finish...
|
|
||||||
error: could not compile `nyash-rust` (test "wasm_string_constants") due to 1 previous error
|
|
||||||
error: could not compile `nyash-rust` (test "wasm_poc2_box_operations") due to 1 previous error
|
|
||||||
error[E0433]: failed to resolve: unresolved import
|
|
||||||
--> tests/array_state_sharing_test.rs:4:16
|
|
||||||
|
|
|
||||||
4 | use crate::boxes::array::ArrayBox;
|
|
||||||
| ^^^^^
|
|
||||||
| |
|
|
||||||
| unresolved import
|
|
||||||
| help: a similar path exists: `nyash_rust::boxes`
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `crate::mir`
|
|
||||||
--> tests/mir_phase8_5_hierarchical_25_instructions.rs:7:12
|
|
||||||
|
|
|
||||||
7 | use crate::mir::{
|
|
||||||
| ^^^
|
|
||||||
| |
|
|
||||||
| unresolved import
|
|
||||||
| help: a similar path exists: `nyash_rust::mir`
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `crate::interpreter`
|
|
||||||
--> tests/array_state_sharing_test.rs:3:16
|
|
||||||
|
|
|
||||||
3 | use crate::interpreter::Interpreter;
|
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[warn(unused_macros)]` on by default
|
||||||
|
|
||||||
|
warning: unused imports: `BasicBlockIdGenerator`, `BasicBlock`, `CompareOp`, `EffectMask`, `MirFunction`, and `ValueIdGenerator`
|
||||||
|
--> src/mir/loop_builder.rs:9:21
|
||||||
|
|
|
||||||
|
9 | MirInstruction, BasicBlock, BasicBlockId, MirFunction, ValueId,
|
||||||
|
| ^^^^^^^^^^ ^^^^^^^^^^^
|
||||||
|
10 | ConstValue, CompareOp, BasicBlockIdGenerator, ValueIdGenerator, EffectMask
|
||||||
|
| ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[warn(unused_imports)]` on by default
|
||||||
|
|
||||||
|
warning: unused import: `HashSet`
|
||||||
|
--> src/mir/loop_builder.rs:13:33
|
||||||
|
|
|
||||||
|
13 | use std::collections::{HashMap, HashSet};
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
|
warning: unexpected `cfg` condition value: `llvm`
|
||||||
|
--> src/backend/mod.rs:13:7
|
||||||
|
|
|
||||||
|
13 | #[cfg(feature = "llvm")]
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: expected values for `feature` are: `all-examples`, `cli`, `default`, `dynamic-file`, `gui`, `gui-examples`, `plugins`, and `wasm-backend`
|
||||||
|
= help: consider adding `llvm` as a feature in `Cargo.toml`
|
||||||
|
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration
|
||||||
|
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||||
|
|
||||||
|
warning: unexpected `cfg` condition value: `llvm`
|
||||||
|
--> src/backend/mod.rs:23:7
|
||||||
|
|
|
||||||
|
23 | #[cfg(feature = "llvm")]
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: expected values for `feature` are: `all-examples`, `cli`, `default`, `dynamic-file`, `gui`, `gui-examples`, `plugins`, and `wasm-backend`
|
||||||
|
= help: consider adding `llvm` as a feature in `Cargo.toml`
|
||||||
|
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration
|
||||||
|
|
||||||
|
warning: unused import: `MirInstruction`
|
||||||
|
--> src/backend/vm_phi.rs:9:41
|
||||||
|
|
|
||||||
|
9 | use crate::mir::{BasicBlockId, ValueId, MirInstruction};
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: unused import: `super::Usize`
|
||||||
|
--> src/bid/types.rs:1:5
|
||||||
|
|
|
||||||
|
1 | use super::Usize;
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: unused import: `std::os::raw::c_char`
|
||||||
|
--> src/bid/plugin_api.rs:2:5
|
||||||
|
|
|
||||||
|
2 | use std::os::raw::c_char;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: unused imports: `NyashHostVtable`, `NyashMethodInfo`, and `NyashPluginInfo`
|
||||||
|
--> src/bid/plugins/filebox/mod.rs:7:18
|
||||||
|
|
|
||||||
|
7 | use crate::bid::{NyashPluginInfo, NyashMethodInfo, NyashHostVtable};
|
||||||
|
| ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: unused imports: `SeekFrom` and `Seek`
|
||||||
|
--> src/bid/plugins/filebox/mod.rs:10:28
|
||||||
|
|
|
||||||
|
10 | use std::io::{Read, Write, Seek, SeekFrom};
|
||||||
|
| ^^^^ ^^^^^^^^
|
||||||
|
|
||||||
|
warning: unused imports: `c_char` and `c_void`
|
||||||
|
--> src/bid/plugins/filebox/mod.rs:11:20
|
||||||
|
|
|
||||||
|
11 | use std::os::raw::{c_char, c_void};
|
||||||
|
| ^^^^^^ ^^^^^^
|
||||||
|
|
||||||
|
warning: unused imports: `CStr` and `CString`
|
||||||
|
--> src/bid/plugins/filebox/mod.rs:13:16
|
||||||
|
|
|
||||||
|
13 | use std::ffi::{CStr, CString};
|
||||||
|
| ^^^^ ^^^^^^^
|
||||||
|
|
||||||
|
warning: unused import: `std::ffi::c_void`
|
||||||
|
--> src/bid/loader.rs:4:5
|
||||||
|
|
|
||||||
|
4 | use std::ffi::c_void;
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: unused imports: `TlvDecoder` and `TlvEncoder`
|
||||||
|
--> src/bid/generic_plugin_box.rs:5:23
|
||||||
|
|
|
||||||
|
5 | use crate::bid::tlv::{TlvEncoder, TlvDecoder};
|
||||||
|
| ^^^^^^^^^^ ^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: unused import: `crate::bid::types::BidTag`
|
||||||
|
--> src/bid/generic_plugin_box.rs:6:5
|
||||||
|
|
|
||||||
|
6 | use crate::bid::types::BidTag;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: unused import: `BoxBase`
|
||||||
|
--> src/runtime/plugin_loader_v2.rs:10:47
|
||||||
|
|
|
||||||
|
10 | use crate::box_trait::{NyashBox, BoxCore, BoxBase, StringBox};
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
|
warning: unused import: `std::ffi::c_void`
|
||||||
|
--> src/runtime/plugin_loader_v2.rs:14:9
|
||||||
|
|
|
||||||
|
14 | use std::ffi::c_void;
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0782]: expected a type, found a trait
|
||||||
|
--> src/backend/vm.rs:175:22
|
||||||
|
|
|
||||||
|
175 | box_factory: Arc<BoxFactory>,
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: you can add the `dyn` keyword if you want a trait object
|
||||||
|
|
|
||||||
|
175 | box_factory: Arc<dyn BoxFactory>,
|
||||||
|
| +++
|
||||||
|
|
||||||
|
error[E0782]: expected a type, found a trait
|
||||||
|
--> src/backend/vm.rs:207:26
|
||||||
|
|
|
||||||
|
207 | box_factory: Arc<BoxFactory>,
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: you can add the `dyn` keyword if you want a trait object
|
||||||
|
|
|
||||||
|
207 | box_factory: Arc<dyn BoxFactory>,
|
||||||
|
| +++
|
||||||
|
|
||||||
|
error[E0782]: expected a type, found a trait
|
||||||
|
--> src/backend/vm.rs:230:26
|
||||||
|
|
|
||||||
|
230 | box_factory: Arc<BoxFactory>,
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: you can add the `dyn` keyword if you want a trait object
|
||||||
|
|
|
||||||
|
230 | box_factory: Arc<dyn BoxFactory>,
|
||||||
|
| +++
|
||||||
|
|
||||||
|
error[E0782]: expected a type, found a trait
|
||||||
|
--> src/backend/vm.rs:197:35
|
||||||
|
|
|
||||||
|
197 | box_factory: Arc::new(BoxFactory::new()),
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: you can add the `dyn` keyword if you want a trait object
|
||||||
|
|
|
||||||
|
197 | box_factory: Arc::new(<dyn BoxFactory>::new()),
|
||||||
|
| ++++ +
|
||||||
|
|
||||||
|
warning: unused variable: `registry`
|
||||||
|
--> src/box_factory/plugin.rs:53:13
|
||||||
|
|
|
||||||
|
53 | let registry = get_global_registry();
|
||||||
|
| ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_registry`
|
||||||
|
|
|
||||||
|
= note: `#[warn(unused_variables)]` on by default
|
||||||
|
|
||||||
|
warning: unused variable: `arc_box`
|
||||||
|
--> src/scope_tracker.rs:33:17
|
||||||
|
|
|
||||||
|
33 | for arc_box in scope.into_iter().rev() {
|
||||||
|
| ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_arc_box`
|
||||||
|
|
||||||
|
warning: variable does not need to be mutable
|
||||||
|
--> src/interpreter/expressions/calls.rs:739:13
|
||||||
|
|
|
||||||
|
739 | let mut is_builtin = is_builtin_box(parent);
|
||||||
|
| ----^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| unresolved import
|
| help: remove this `mut`
|
||||||
| help: a similar path exists: `nyash_rust::interpreter`
|
|
||||||
|
|
||||||
error[E0432]: unresolved import `crate::box_trait`
|
|
||||||
--> tests/array_state_sharing_test.rs:5:16
|
|
||||||
|
|
|
|
||||||
5 | use crate::box_trait::{NyashBox, IntegerBox, StringBox};
|
= note: `#[warn(unused_mut)]` on by default
|
||||||
| ^^^^^^^^^
|
|
||||||
|
warning: variable does not need to be mutable
|
||||||
|
--> src/interpreter/objects.rs:1106:17
|
||||||
|
|
|
||||||
|
1106 | let mut is_builtin = is_builtin_box(parent_name);
|
||||||
|
| ----^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| unresolved import
|
| help: remove this `mut`
|
||||||
| help: a similar path exists: `nyash_rust::box_trait`
|
|
||||||
|
|
||||||
Some errors have detailed explanations: E0432, E0433.
|
warning: unused variable: `args`
|
||||||
For more information about an error, try `rustc --explain E0432`.
|
--> src/instance_v2.rs:147:28
|
||||||
error: could not compile `nyash-rust` (test "array_state_sharing_test") due to 3 previous errors
|
|
||||||
error: could not compile `nyash-rust` (test "mir_phase8_5_hierarchical_25_instructions") due to 1 previous error
|
|
||||||
error[E0432]: unresolved import `eframe`
|
|
||||||
--> examples/simple_notepad_win.rs:4:5
|
|
||||||
|
|
|
|
||||||
4 | use eframe::egui;
|
147 | pub fn init(&mut self, args: &[Box<dyn NyashBox>]) -> Result<(), String> {
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
| ^^^^ help: if this is intentional, prefix it with an underscore: `_args`
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
warning: unused variable: `nyash_value`
|
||||||
--> examples/simple_notepad_win.rs:6:14
|
--> src/instance_v2.rs:289:21
|
||||||
|
|
|
|
||||||
6 | fn main() -> eframe::Result {
|
289 | if let Some(nyash_value) = self.fields_ng.lock().unwrap().get(field_name) {
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
| ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_nyash_value`
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
warning: unused variable: `block_id`
|
||||||
--> examples/simple_notepad_win.rs:7:19
|
--> src/mir/loop_builder.rs:246:39
|
||||||
|
|
|
|
||||||
7 | let options = eframe::NativeOptions {
|
246 | fn mark_block_unsealed(&mut self, block_id: BasicBlockId) -> Result<(), String> {
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
| ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_block_id`
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
warning: unused variable: `block_id`
|
||||||
--> examples/simple_notepad_win.rs:14:5
|
--> src/mir/loop_builder.rs:273:49
|
||||||
|
|
|
|
||||||
14 | eframe::run_native(
|
273 | fn get_variable_at_block(&self, name: &str, block_id: BasicBlockId) -> Option<ValueId> {
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
| ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_block_id`
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
warning: unused variable: `dst`
|
||||||
--> examples/simple_notepad_win.rs:69:6
|
--> src/backend/vm_phi.rs:48:9
|
||||||
|
|
|
|
||||||
69 | impl eframe::App for NyashNotepad {
|
48 | dst: ValueId,
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
| ^^^ help: if this is intentional, prefix it with an underscore: `_dst`
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `eframe`
|
warning: unused variable: `f`
|
||||||
--> examples/simple_notepad_win.rs:70:60
|
--> src/bid/plugin_api.rs:167:36
|
||||||
|
|
|
|
||||||
70 | fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
167 | pub fn with_alloc<F>(mut self, f: F) -> Self
|
||||||
| ^^^^^^ use of unresolved module or unlinked crate `eframe`
|
| ^ help: if this is intentional, prefix it with an underscore: `_f`
|
||||||
|
|
|
||||||
= help: if you wanted to use a crate named `eframe`, use `cargo add eframe` to add it to your `Cargo.toml`
|
|
||||||
|
|
||||||
error: could not compile `nyash-rust` (example "simple_notepad_win") due to 7 previous errors
|
warning: variable does not need to be mutable
|
||||||
error[E0599]: no method named `to_string_box` found for struct `box_trait::StringBox` in the current scope
|
--> src/bid/plugin_api.rs:167:26
|
||||||
--> src/main.rs:77:31
|
|
||||||
|
|
|
||||||
77 | assert_eq!(string_box.to_string_box().value, "test");
|
|
||||||
| ^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
::: src/box_trait.rs:96:8
|
|
||||||
|
|
|
||||||
96 | fn to_string_box(&self) -> StringBox;
|
|
||||||
| ------------- the method is available for `box_trait::StringBox` here
|
|
||||||
...
|
|
||||||
127 | pub struct StringBox {
|
|
||||||
| -------------------- method `to_string_box` not found for this struct
|
|
||||||
|
|
|
||||||
= help: items from traits can only be used if the trait is in scope
|
|
||||||
help: trait `NyashBox` which provides `to_string_box` is implemented but not in scope; perhaps you want to import it
|
|
||||||
|
|
|
||||||
70 + use crate::box_trait::NyashBox;
|
|
||||||
|
|
|
||||||
help: there is a method `to_string` with a similar name
|
|
||||||
|
|
|
||||||
77 - assert_eq!(string_box.to_string_box().value, "test");
|
|
||||||
77 + assert_eq!(string_box.to_string().value, "test");
|
|
||||||
|
|
|
|
||||||
|
167 | pub fn with_alloc<F>(mut self, f: F) -> Self
|
||||||
|
| ----^^^^
|
||||||
|
| |
|
||||||
|
| help: remove this `mut`
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0599`.
|
warning: unused variable: `f`
|
||||||
error: could not compile `nyash-rust` (bin "nyash" test) due to 1 previous error
|
--> src/bid/plugin_api.rs:176:35
|
||||||
|
|
|
||||||
|
176 | pub fn with_free<F>(mut self, f: F) -> Self
|
||||||
|
| ^ help: if this is intentional, prefix it with an underscore: `_f`
|
||||||
|
|
||||||
|
warning: variable does not need to be mutable
|
||||||
|
--> src/bid/plugin_api.rs:176:25
|
||||||
|
|
|
||||||
|
176 | pub fn with_free<F>(mut self, f: F) -> Self
|
||||||
|
| ----^^^^
|
||||||
|
| |
|
||||||
|
| help: remove this `mut`
|
||||||
|
|
||||||
|
warning: unused variable: `f`
|
||||||
|
--> src/bid/plugin_api.rs:183:34
|
||||||
|
|
|
||||||
|
183 | pub fn with_log<F>(mut self, f: F) -> Self
|
||||||
|
| ^ help: if this is intentional, prefix it with an underscore: `_f`
|
||||||
|
|
||||||
|
warning: variable does not need to be mutable
|
||||||
|
--> src/bid/plugin_api.rs:183:24
|
||||||
|
|
|
||||||
|
183 | pub fn with_log<F>(mut self, f: F) -> Self
|
||||||
|
| ----^^^^
|
||||||
|
| |
|
||||||
|
| help: remove this `mut`
|
||||||
|
|
||||||
|
warning: unused variable: `args`
|
||||||
|
--> src/runtime/plugin_loader_v2.rs:270:46
|
||||||
|
|
|
||||||
|
270 | pub fn create_box(&self, box_type: &str, args: &[Box<dyn NyashBox>]) -> BidResult<Box<dyn NyashBox>> {
|
||||||
|
| ^^^^ help: if this is intentional, prefix it with an underscore: `_args`
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0782`.
|
||||||
|
warning: `nyash-rust` (lib) generated 33 warnings
|
||||||
|
error: could not compile `nyash-rust` (lib) due to 4 previous errors; 33 warnings emitted
|
||||||
|
|||||||
@ -0,0 +1,53 @@
|
|||||||
|
src/interpreter/core.rs:33:14: warning: unused macro definition: `debug_trace`
|
||||||
|
src/mir/loop_builder.rs:9:21: warning: unused imports: `BasicBlockIdGenerator`, `BasicBlock`, `CompareOp`, `EffectMask`, `MirFunction`, and `ValueIdGenerator`
|
||||||
|
src/mir/loop_builder.rs:13:33: warning: unused import: `HashSet`
|
||||||
|
src/backend/mod.rs:13:7: warning: unexpected `cfg` condition value: `llvm`
|
||||||
|
src/backend/mod.rs:23:7: warning: unexpected `cfg` condition value: `llvm`
|
||||||
|
src/backend/vm_phi.rs:9:41: warning: unused import: `MirInstruction`
|
||||||
|
src/bid/types.rs:1:5: warning: unused import: `super::Usize`
|
||||||
|
src/bid/plugin_api.rs:2:5: warning: unused import: `std::os::raw::c_char`
|
||||||
|
src/bid/plugins/filebox/mod.rs:7:18: warning: unused imports: `NyashHostVtable`, `NyashMethodInfo`, and `NyashPluginInfo`
|
||||||
|
src/bid/plugins/filebox/mod.rs:10:28: warning: unused imports: `SeekFrom` and `Seek`
|
||||||
|
src/bid/plugins/filebox/mod.rs:11:20: warning: unused imports: `c_char` and `c_void`
|
||||||
|
src/bid/plugins/filebox/mod.rs:13:16: warning: unused imports: `CStr` and `CString`
|
||||||
|
src/bid/loader.rs:4:5: warning: unused import: `std::ffi::c_void`
|
||||||
|
src/bid/generic_plugin_box.rs:5:23: warning: unused imports: `TlvDecoder` and `TlvEncoder`
|
||||||
|
src/bid/generic_plugin_box.rs:6:5: warning: unused import: `crate::bid::types::BidTag`
|
||||||
|
src/runtime/plugin_loader_v2.rs:10:47: warning: unused import: `BoxBase`
|
||||||
|
src/runtime/plugin_loader_v2.rs:14:9: warning: unused import: `std::ffi::c_void`
|
||||||
|
src/box_factory/plugin.rs:53:13: warning: unused variable: `registry`: help: if this is intentional, prefix it with an underscore: `_registry`
|
||||||
|
src/interpreter/expressions/calls.rs:739:13: warning: variable does not need to be mutable
|
||||||
|
src/interpreter/objects.rs:1106:17: warning: variable does not need to be mutable
|
||||||
|
src/instance_v2.rs:147:28: warning: unused variable: `args`: help: if this is intentional, prefix it with an underscore: `_args`
|
||||||
|
src/instance_v2.rs:289:21: warning: unused variable: `nyash_value`: help: if this is intentional, prefix it with an underscore: `_nyash_value`
|
||||||
|
src/mir/loop_builder.rs:246:39: warning: unused variable: `block_id`: help: if this is intentional, prefix it with an underscore: `_block_id`
|
||||||
|
src/mir/loop_builder.rs:273:49: warning: unused variable: `block_id`: help: if this is intentional, prefix it with an underscore: `_block_id`
|
||||||
|
src/backend/vm_phi.rs:48:9: warning: unused variable: `dst`: help: if this is intentional, prefix it with an underscore: `_dst`
|
||||||
|
src/bid/plugin_api.rs:167:36: warning: unused variable: `f`: help: if this is intentional, prefix it with an underscore: `_f`
|
||||||
|
src/bid/plugin_api.rs:167:26: warning: variable does not need to be mutable
|
||||||
|
src/bid/plugin_api.rs:176:35: warning: unused variable: `f`: help: if this is intentional, prefix it with an underscore: `_f`
|
||||||
|
src/bid/plugin_api.rs:176:25: warning: variable does not need to be mutable
|
||||||
|
src/bid/plugin_api.rs:183:34: warning: unused variable: `f`: help: if this is intentional, prefix it with an underscore: `_f`
|
||||||
|
src/bid/plugin_api.rs:183:24: warning: variable does not need to be mutable
|
||||||
|
src/runtime/plugin_loader_v2.rs:270:46: warning: unused variable: `args`: help: if this is intentional, prefix it with an underscore: `_args`
|
||||||
|
src/bid/plugins/filebox/mod.rs:44:5: warning: type `FileMode` is more private than the item `FileBoxRegistry::open`: method `FileBoxRegistry::open` is reachable at visibility `pub`
|
||||||
|
src/mir/loop_builder.rs:35:5: warning: field `block_var_maps` is never read
|
||||||
|
src/bid/metadata.rs:148:5: warning: fields `type_name_holder` and `method_holders` are never read
|
||||||
|
src/bid/plugins/filebox/mod.rs:24:5: warning: fields `path` and `mode` are never read
|
||||||
|
src/runtime/plugin_loader_v2.rs:24:5: warning: fields `box_types` and `init_fn` are never read
|
||||||
|
src/mir/loop_builder.rs:62:9: warning: unused `Result` that must be used
|
||||||
|
src/mir/loop_builder.rs:66:9: warning: unused `Result` that must be used
|
||||||
|
src/mir/loop_builder.rs:78:9: warning: unused `Result` that must be used
|
||||||
|
src/mir/loop_builder.rs:79:9: warning: unused `Result` that must be used
|
||||||
|
src/mir/loop_builder.rs:93:9: warning: unused `Result` that must be used
|
||||||
|
src/bid/plugins/filebox/mod.rs:102:12: warning: creating a shared reference to mutable static: shared reference to mutable static
|
||||||
|
src/bid/plugins/filebox/mod.rs:105:9: warning: creating a shared reference to mutable static: shared reference to mutable static
|
||||||
|
warning: `nyash-rust` (lib) generated 44 warnings (run `cargo fix --lib -p nyash-rust` to apply 19 suggestions)
|
||||||
|
Checking nyash-rust v0.1.0 (/mnt/c/git/nyash-project/nyash)
|
||||||
|
src/backend/vm.rs:18:12: error[E0432]: unresolved import `crate::scope_tracker`: unresolved import, help: a similar path exists: `nyash_rust::scope_tracker`
|
||||||
|
src/runner.rs:22:7: warning: unexpected `cfg` condition value: `llvm`
|
||||||
|
src/runner.rs:503:15: warning: unexpected `cfg` condition value: `llvm`
|
||||||
|
src/runner.rs:526:19: warning: unexpected `cfg` condition value: `llvm`
|
||||||
|
src/runner.rs:286:17: warning: variable does not need to be mutable
|
||||||
|
warning: `nyash-rust` (bin "nyash") generated 36 warnings (32 duplicates)
|
||||||
|
error: could not compile `nyash-rust` (bin "nyash") due to 1 previous error; 36 warnings emitted
|
||||||
|
|||||||
@ -368,56 +368,54 @@ cargo build --release -j32 --features wasm-backend
|
|||||||
- ✅ substring(start, end)メソッド実装完了
|
- ✅ substring(start, end)メソッド実装完了
|
||||||
- ✅ fini後のアクセスエラー削除(is_finalized()チェック削除)
|
- ✅ fini後のアクセスエラー削除(is_finalized()チェック削除)
|
||||||
|
|
||||||
## 🚀 **実装中: Phase 9.78a VM統一Box処理**
|
## 🛑 **一時停止: Phase 9.78a VM統一Box処理**
|
||||||
|
|
||||||
### 🎯 **目標: すべてのBox型をVMで統一的に処理**
|
### 📊 **完了した作業 (2025-08-21)**
|
||||||
|
|
||||||
**発見された問題**:
|
#### ✅ **Step 1: MIR生成修正** - 完了・保持
|
||||||
- ❌ ユーザー定義Box未対応(NewBoxで文字列返すだけ)
|
`src/mir/builder.rs`の変更:
|
||||||
- ❌ birth/finiライフサイクル欠落
|
- すべてのBox型に対してNewBox命令を生成
|
||||||
- ❌ メソッド呼び出しハードコード
|
- RefNew命令の使用を廃止
|
||||||
|
- **評価**: 良い変更、そのまま保持
|
||||||
|
|
||||||
**解決策**: インタープリターと同等の統一処理を実装
|
#### ✅ **VM実装準備** - ビルド可能な状態で一時停止
|
||||||
|
- ScopeTrackerモジュール追加
|
||||||
|
- VM構造体の拡張(コメントアウト状態)
|
||||||
|
- NewBox/BoxCall実装の簡易版
|
||||||
|
- **状態**: コンパイル成功、警告のみ
|
||||||
|
|
||||||
### 📊 **実装ステップ(詳細分析済み)**
|
### 🔄 **次のステップ: インタープリター整理**
|
||||||
|
|
||||||
#### **Step 1: MIR生成修正** ✅ 分析完了
|
#### **整理計画**
|
||||||
**場所**: `src/mir/builder.rs` - `build_new_expression()`
|
1. **BoxDeclarationをAST層へ移動**
|
||||||
```rust
|
- 現在: `interpreter::BoxDeclaration`
|
||||||
// 現在: RefNew命令(不適切)
|
- 目標: `ast::BoxDeclaration`
|
||||||
// 修正: NewBox命令を生成
|
|
||||||
emit(MirInstruction::NewBox {
|
|
||||||
dst,
|
|
||||||
box_type: class,
|
|
||||||
args: arg_values
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
#### **Step 2: VM構造体拡張** 🔄 実装予定
|
2. **SharedState依存の削減**
|
||||||
**場所**: `src/backend/vm.rs`
|
- 現在: インタープリター固有の設計
|
||||||
```rust
|
- 目標: VM/MIRと共有可能な設計
|
||||||
pub struct VM {
|
|
||||||
// 追加
|
3. **統一ランタイム基盤の作成**
|
||||||
box_factory: Arc<BoxFactory>,
|
```rust
|
||||||
plugin_loader: Option<Arc<PluginLoaderV2>>,
|
pub struct NyashRuntime {
|
||||||
scope_tracker: ScopeTracker,
|
box_registry: Arc<UnifiedBoxRegistry>,
|
||||||
box_declarations: Arc<RwLock<HashMap<String, BoxDeclaration>>>,
|
box_declarations: Arc<RwLock<HashMap<String, BoxDeclaration>>>,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### **Step 3: NewBox統一実装** 🔄 実装予定
|
### 📝 **保存された変更の概要**
|
||||||
- BoxFactory経由で作成
|
|
||||||
- ユーザー定義Boxのbirth実行
|
|
||||||
- スコープ登録(fini用)
|
|
||||||
|
|
||||||
#### **Step 4: BoxCall統一実装** 🔄 実装予定
|
**保持している良い変更**:
|
||||||
- ビルトイン/ユーザー定義/プラグイン統一処理
|
- ✅ MIR生成のNewBox命令統一
|
||||||
- メソッドディスパッチ共通化
|
- ✅ ScopeTrackerの基本実装
|
||||||
|
- ✅ VM拡張の方向性(TODOコメント付き)
|
||||||
|
|
||||||
#### **Step 5: ライフサイクル管理** 🔄 実装予定
|
**一時的にコメントアウト**:
|
||||||
- ScopeTracker実装
|
- BoxFactory/UnifiedBoxRegistry使用部分
|
||||||
- スコープ終了時の自動fini
|
- interpreter::BoxDeclaration依存
|
||||||
- 逆順実行(作成順と逆)
|
- プラグインローダー統合
|
||||||
|
|
||||||
|
**ビルド状態**: ✅ 正常(警告44個、エラー0個)
|
||||||
|
|
||||||
### 🔧 **共有コンポーネント**
|
### 🔧 **共有コンポーネント**
|
||||||
- `BoxFactory` - すでに存在、VMでも使用
|
- `BoxFactory` - すでに存在、VMでも使用
|
||||||
|
|||||||
147
docs/CURRENT_VM_CHANGES.md
Normal file
147
docs/CURRENT_VM_CHANGES.md
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
# 🔄 現在のVM変更状態 (2025-08-21)
|
||||||
|
|
||||||
|
## 📊 Phase 9.78a VM統一Box処理の実装状況
|
||||||
|
|
||||||
|
### ✅ 完了したステップ
|
||||||
|
|
||||||
|
#### **Step 1: MIR生成修正** ✅
|
||||||
|
`src/mir/builder.rs`の変更内容:
|
||||||
|
```rust
|
||||||
|
// 変更前: RefNew命令(不適切)
|
||||||
|
match class.as_str() {
|
||||||
|
"IntegerBox" | "StringBox" | "BoolBox" => {
|
||||||
|
emit(MirInstruction::Const { ... })
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
emit(MirInstruction::RefNew { ... })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 変更後: NewBox命令(統一)
|
||||||
|
emit(MirInstruction::NewBox {
|
||||||
|
dst,
|
||||||
|
box_type: class,
|
||||||
|
args: arg_values,
|
||||||
|
})
|
||||||
|
```
|
||||||
|
**評価**: ✅ 良い変更。すべてのBox型を統一的に扱える。
|
||||||
|
|
||||||
|
#### **Step 2: VM構造体拡張** 🔧 部分完了
|
||||||
|
`src/backend/vm.rs`の変更内容:
|
||||||
|
1. **新規インポート追加**:
|
||||||
|
- `BoxFactory` → ❌ trait/struct混在問題
|
||||||
|
- `InstanceBox` ✅
|
||||||
|
- `BoxDeclaration` → ⚠️ interpreter依存
|
||||||
|
- `ScopeTracker` ✅
|
||||||
|
|
||||||
|
2. **VM構造体への追加**:
|
||||||
|
```rust
|
||||||
|
box_factory: Arc<BoxFactory>, // ❌ エラー:traitには dyn 必要
|
||||||
|
plugin_loader: Option<Arc<PluginLoaderV2>>,
|
||||||
|
scope_tracker: ScopeTracker,
|
||||||
|
box_declarations: Arc<RwLock<HashMap<String, BoxDeclaration>>>,
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **新規メソッド追加**:
|
||||||
|
- `new_with_factory()` → 名前変更必要
|
||||||
|
- `new_with_plugins()`
|
||||||
|
|
||||||
|
#### **Step 3: NewBox統一実装** 🔧 部分完了
|
||||||
|
VM内のNewBox命令処理を統一実装に更新:
|
||||||
|
```rust
|
||||||
|
// BoxFactory経由で作成
|
||||||
|
let new_box = match self.box_factory.create_box(box_type, arg_boxes) {
|
||||||
|
Ok(boxed) => boxed,
|
||||||
|
Err(e) => return Err(...),
|
||||||
|
};
|
||||||
|
```
|
||||||
|
**問題**: BoxFactoryがtraitなのでコンパイルエラー
|
||||||
|
|
||||||
|
#### **Step 4: BoxCall統一実装** ✅ 完了
|
||||||
|
- `call_unified_method()`を追加
|
||||||
|
- 現在は簡易実装(call_box_methodに委譲)
|
||||||
|
|
||||||
|
#### **Step 5: ライフサイクル管理** 🔧 部分完了
|
||||||
|
- `ScopeTracker`を新規作成
|
||||||
|
- `execute_function()`でスコープ管理追加
|
||||||
|
- fini実装は簡易版
|
||||||
|
|
||||||
|
### 🚨 現在の問題点
|
||||||
|
|
||||||
|
1. **BoxFactory trait問題**:
|
||||||
|
- VMはBoxFactoryをstructとして期待
|
||||||
|
- 実際はtraitとして定義されている
|
||||||
|
- `UnifiedBoxRegistry`を使うべきか?
|
||||||
|
|
||||||
|
2. **BoxDeclaration依存問題**:
|
||||||
|
- `interpreter::BoxDeclaration`を使用
|
||||||
|
- VMからinterpreterへの依存は良くない
|
||||||
|
|
||||||
|
3. **ビルドエラー**:
|
||||||
|
```
|
||||||
|
error[E0782]: expected a type, found a trait
|
||||||
|
--> src/backend/vm.rs:175:22
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 推奨アクション
|
||||||
|
|
||||||
|
### **Option A: 置いておく(推奨)** ✅
|
||||||
|
**理由**:
|
||||||
|
- MIR生成修正(Step 1)は良い変更で保持すべき
|
||||||
|
- VM拡張の方向性は正しい
|
||||||
|
- インタープリター整理後に再開が効率的
|
||||||
|
|
||||||
|
**実行手順**:
|
||||||
|
```bash
|
||||||
|
# 現在の変更を一時保存
|
||||||
|
git stash push -m "Phase 9.78a VM unified Box handling WIP"
|
||||||
|
|
||||||
|
# または feature ブランチに保存
|
||||||
|
git checkout -b feature/vm-unified-box-wip
|
||||||
|
git add -A
|
||||||
|
git commit -m "WIP: Phase 9.78a VM unified Box handling"
|
||||||
|
git checkout main
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Option B: 部分的に保持**
|
||||||
|
**保持すべき部分**:
|
||||||
|
- ✅ MIR生成修正(Step 1)
|
||||||
|
- ✅ ScopeTracker実装
|
||||||
|
|
||||||
|
**巻き戻すべき部分**:
|
||||||
|
- ❌ VM構造体へのBoxFactory追加
|
||||||
|
- ❌ interpreter::BoxDeclaration依存
|
||||||
|
|
||||||
|
### **Option C: 全て巻き戻す**
|
||||||
|
**非推奨**: MIR生成修正は価値があり、保持すべき
|
||||||
|
|
||||||
|
## 📝 今後の計画
|
||||||
|
|
||||||
|
1. **Phase 1**: インタープリター整理
|
||||||
|
- BoxDeclarationをast.rsへ移動
|
||||||
|
- SharedState依存を減らす
|
||||||
|
- NyashRuntime共通基盤作成
|
||||||
|
|
||||||
|
2. **Phase 2**: VM実装再開
|
||||||
|
- 整理されたインターフェースを使用
|
||||||
|
- UnifiedBoxRegistryベースで実装
|
||||||
|
- プラグインシステム統合
|
||||||
|
|
||||||
|
## 🔧 技術的詳細
|
||||||
|
|
||||||
|
### 変更されたファイル
|
||||||
|
- `src/mir/builder.rs`: -72行(RefNew → NewBox)
|
||||||
|
- `src/backend/vm.rs`: +164行(構造体拡張、メソッド追加)
|
||||||
|
- `src/lib.rs`: +1行(scope_trackerモジュール)
|
||||||
|
- `src/scope_tracker.rs`: 新規ファイル(68行)
|
||||||
|
|
||||||
|
### 依存関係の問題
|
||||||
|
```
|
||||||
|
VM → interpreter::BoxDeclaration ❌
|
||||||
|
VM → BoxFactory (trait) ❌
|
||||||
|
VM → UnifiedBoxRegistry ✅ (推奨)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**結論**: **Option A(置いておく)**を推奨します。現在の実装は方向性として正しく、インタープリター整理後に続きから再開するのが最も効率的です。
|
||||||
241
docs/architecture-redesign-proposal.md
Normal file
241
docs/architecture-redesign-proposal.md
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
# 🌟 Nyash アーキテクチャ再設計提案
|
||||||
|
|
||||||
|
*by Codex exec (2025-08-21)*
|
||||||
|
|
||||||
|
## 🎯 核心的洞察
|
||||||
|
|
||||||
|
**「実装詳細共有」から「モデル共有・実行時共有」への転換**
|
||||||
|
|
||||||
|
現在の問題の本質は、InterpreterとVMが「実装詳細」を共有しようとしていること。正しいアプローチは「モデル(宣言)」と「ランタイム(実行環境)」を共有し、実行戦略だけを分離すること。
|
||||||
|
|
||||||
|
## 🏗️ 新アーキテクチャ層構造
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ AST/Model │ ← 純粋なデータモデル(依存なし)
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
┌──────▼──────┐
|
||||||
|
│ Runtime │ ← 型システム・クラス管理・インスタンス生成
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
┌──────┴──────┬──────────┬────────────┐
|
||||||
|
│ Interpreter │ VM │ Plugins │
|
||||||
|
└─────────────┴──────────┴────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 各層の責務
|
||||||
|
|
||||||
|
**AST/Model層**
|
||||||
|
- 言語の純データモデル
|
||||||
|
- BoxDeclaration、ASTNode、型シグネチャ
|
||||||
|
- 実行時情報を含まない
|
||||||
|
|
||||||
|
**Runtime層**
|
||||||
|
- BoxClass/BoxFactoryによる型システム
|
||||||
|
- インスタンス生成とライフサイクル管理
|
||||||
|
- メソッドディスパッチと呼び出し規約
|
||||||
|
|
||||||
|
**Backend層**
|
||||||
|
- Interpreter: AST直接実行
|
||||||
|
- VM: MIR/Bytecode実行
|
||||||
|
- 両者ともRuntimeを通じてBoxを操作
|
||||||
|
|
||||||
|
## 🔧 具体的な設計
|
||||||
|
|
||||||
|
### 1. BoxDeclarationの移動
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// core::model::box_declaration.rs
|
||||||
|
pub struct BoxDeclaration {
|
||||||
|
pub name: String,
|
||||||
|
pub type_params: Vec<TypeParam>,
|
||||||
|
pub fields: Vec<FieldDecl>,
|
||||||
|
pub methods: Vec<MethodDecl>,
|
||||||
|
pub static_methods: Vec<StaticDecl>,
|
||||||
|
pub attrs: AttrSet,
|
||||||
|
pub source_span: Option<Span>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct FieldDecl {
|
||||||
|
pub name: String,
|
||||||
|
pub ty: TypeRef,
|
||||||
|
pub attrs: AttrSet,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct MethodDecl {
|
||||||
|
pub name: String,
|
||||||
|
pub sig: FnSig,
|
||||||
|
pub body: FnBodyRef, // AST or MIR reference
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. NyashRuntimeの導入
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// runtime::mod.rs
|
||||||
|
pub struct NyashRuntime {
|
||||||
|
box_registry: BoxRegistry,
|
||||||
|
type_space: TypeSpace,
|
||||||
|
fn_space: FnSpace,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ExecutionSession {
|
||||||
|
runtime: Arc<NyashRuntime>,
|
||||||
|
root_box: SharedBox,
|
||||||
|
frames: Vec<Frame>,
|
||||||
|
env: Environment,
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedBox = Arc<dyn NyashBox>
|
||||||
|
pub type SharedBox = Arc<dyn NyashBox>;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. BoxClass/Factoryシステム
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// runtime::box_class.rs
|
||||||
|
pub trait BoxClass: Send + Sync {
|
||||||
|
fn name(&self) -> &str;
|
||||||
|
fn instantiate(
|
||||||
|
&self,
|
||||||
|
args: &[SharedBox],
|
||||||
|
sess: &mut ExecutionSession
|
||||||
|
) -> Result<SharedBox>;
|
||||||
|
fn lookup_method(&self, name: &str) -> Option<MethodHandle>;
|
||||||
|
fn lifecycle(&self) -> Option<&dyn BoxLifecycle>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait BoxFactory: Send + Sync {
|
||||||
|
fn can_build(&self, decl: &BoxDeclaration) -> bool;
|
||||||
|
fn build_class(
|
||||||
|
&self,
|
||||||
|
decl: &BoxDeclaration,
|
||||||
|
rt: &NyashRuntime
|
||||||
|
) -> Result<Arc<dyn BoxClass>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait BoxLifecycle {
|
||||||
|
fn on_birth(&self, ctx: &mut InstanceCtx) -> Result<()>;
|
||||||
|
fn on_fini(&self, ctx: &mut InstanceCtx);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 統一されたBox管理
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// runtime::registry.rs
|
||||||
|
pub struct BoxRegistry {
|
||||||
|
classes: RwLock<HashMap<String, Arc<dyn BoxClass>>>,
|
||||||
|
factories: RwLock<Vec<Arc<dyn BoxFactory>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BoxRegistry {
|
||||||
|
pub fn register_class(&self, class: Arc<dyn BoxClass>) {
|
||||||
|
// 登録処理
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_class(&self, name: &str) -> Option<Arc<dyn BoxClass>> {
|
||||||
|
// クラス取得
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_instance(
|
||||||
|
&self,
|
||||||
|
class_name: &str,
|
||||||
|
args: &[SharedBox],
|
||||||
|
sess: &mut ExecutionSession
|
||||||
|
) -> Result<SharedBox> {
|
||||||
|
let class = self.get_class(class_name)?;
|
||||||
|
class.instantiate(args, sess)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 実装手順(最小破壊的移行)
|
||||||
|
|
||||||
|
### Step 1: BoxDeclarationの移動
|
||||||
|
```rust
|
||||||
|
// 1. core::model モジュールを作成
|
||||||
|
// 2. BoxDeclarationを移動
|
||||||
|
// 3. インタープリターで一時的に別名を使用
|
||||||
|
use core::model::BoxDeclaration as InterpreterBoxDecl;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: NyashRuntimeの骨組み作成
|
||||||
|
```rust
|
||||||
|
// 最初は空の実装から始める
|
||||||
|
pub struct NyashRuntime {
|
||||||
|
// 段階的に追加
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct NyashRuntimeBuilder {
|
||||||
|
// SharedStateからの移行を支援
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: BoxFactoryのdyn化
|
||||||
|
```rust
|
||||||
|
// 現在の trait BoxFactory を使用
|
||||||
|
// すべて Arc<dyn BoxFactory> として扱う
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: グローバル登録の排除
|
||||||
|
```rust
|
||||||
|
// 削除: register_user_defined_factory(...)
|
||||||
|
// 追加: NyashRuntimeBuilder::with_factory(...)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: SharedStateの段階的分解
|
||||||
|
```rust
|
||||||
|
// 一時的なシム
|
||||||
|
pub struct SharedStateShim {
|
||||||
|
runtime: Arc<NyashRuntime>,
|
||||||
|
session: ExecutionSession,
|
||||||
|
}
|
||||||
|
|
||||||
|
// 互換性のためのFrom実装
|
||||||
|
impl From<SharedState> for SharedStateShim {
|
||||||
|
// 移行ロジック
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 6-8: 統一と最適化
|
||||||
|
- Interpreter/VMのコンストラクタ統一
|
||||||
|
- birth/finiライフサイクルの一元化
|
||||||
|
- 最終的なSharedState削除
|
||||||
|
|
||||||
|
## 🎯 得られる利点
|
||||||
|
|
||||||
|
1. **依存関係の明確化**
|
||||||
|
- VM→Interpreter依存が完全に解消
|
||||||
|
- 両者はRuntimeのみに依存
|
||||||
|
|
||||||
|
2. **テスタビリティ向上**
|
||||||
|
- グローバル状態なし
|
||||||
|
- 並行テスト可能
|
||||||
|
|
||||||
|
3. **保守性向上**
|
||||||
|
- 責務が明確に分離
|
||||||
|
- 新しいBackend追加が容易
|
||||||
|
|
||||||
|
4. **Everything is Box哲学の貫徹**
|
||||||
|
- 統一的なBox管理
|
||||||
|
- birth/finiライフサイクルの一元化
|
||||||
|
|
||||||
|
## ⚠️ 実装上の注意点
|
||||||
|
|
||||||
|
1. **trait objectは必ず`Arc<dyn Trait>`**
|
||||||
|
- `Arc<Trait>`は使わない
|
||||||
|
- dynキーワードを忘れない
|
||||||
|
|
||||||
|
2. **段階的移行**
|
||||||
|
- 各ステップでテストが通ることを確認
|
||||||
|
- 互換性レイヤーを活用
|
||||||
|
|
||||||
|
3. **ロックの最小化**
|
||||||
|
- Runtimeは基本的に不変
|
||||||
|
- 必要最小限のRwLock使用
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
この設計により、Nyashはよりシンプルでエレガントなアーキテクチャとなり、InterpreterとVMの統合が自然に実現されます。
|
||||||
238
docs/archive/codex-analysis/2025-08-21-codex-response-full.md
Normal file
238
docs/archive/codex-analysis/2025-08-21-codex-response-full.md
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
# Codex exec 天才的分析回答 (2025-08-21)
|
||||||
|
|
||||||
|
**モデル**: GPT-5
|
||||||
|
**実行時間**: 2025-08-20T08:13:13 - 08:14:35
|
||||||
|
**トークン使用**: 14,603 (入力: 6,325 + 出力: 8,278)
|
||||||
|
|
||||||
|
## 結論
|
||||||
|
|
||||||
|
依存の向きと責務を正し、Interpreter/VMの「実装詳細共有」をやめて「モデル共有・実行時共有」に転換します。鍵は「Everything is Box」をタイプシステムとクラス実装にも一貫させつつ、「AST/宣言モデル」と「Runtimeクラス・インスタンス」を厳密に分離することです。
|
||||||
|
|
||||||
|
## 層構造
|
||||||
|
|
||||||
|
- **AST/Model**: 言語の純データモデル。依存先なし。
|
||||||
|
- **Runtime**: 型系・クラス登録・インスタンス生成・ライフサイクル・呼出し規約。ASTにのみ依存。
|
||||||
|
- **Backends**: Interpreter と VM。どちらも Runtime にのみ依存(ASTは入力として読むが、構造体はRuntimeを介して使う)。
|
||||||
|
- **Plugins**: BoxClass/Factory を提供。RuntimeのAPIにのみ依存。グローバルへは一切依存しない。
|
||||||
|
|
||||||
|
依存関係: AST → Runtime → Interpreter/VM(Plugins は Runtime へ)
|
||||||
|
|
||||||
|
## 各質問への回答
|
||||||
|
|
||||||
|
### 1) アーキテクチャ再設計
|
||||||
|
|
||||||
|
**境界の引き直し**:
|
||||||
|
- AST/Model: 宣言とシグネチャの「静的情報」だけを保持。
|
||||||
|
- Runtime: クラス定義(vtable/ディスパッチ)、レジストリ、インスタンス化、birth/fini、呼出し規約、セッション(Fiber/Frame)等。
|
||||||
|
- Backends: 実行方式(AST直解釈 or MIR/Bytecode)だけを差し替える。Boxは常にRuntimeで生成・管理。
|
||||||
|
|
||||||
|
**セッション単位**:
|
||||||
|
- `NyashRuntime` は「不変に近い共有資産」(クラス登録、型定義、グローバルな定数等)。
|
||||||
|
- `ExecutionSession` は「実行ごとの可変状態」(root/global box、スタック、環境変数、I/O handles等)。Interpreter/VMどちらも同じセッション型を使う。
|
||||||
|
|
||||||
|
### 2) BoxDeclaration の適切配置
|
||||||
|
|
||||||
|
**場所**: `ast::model`(もしくは `core::model`)に移動。Interpreter固有の型は参照しない。
|
||||||
|
|
||||||
|
**必要な情報(純データ)**:
|
||||||
|
- `name: String`
|
||||||
|
- `type_params: Vec<TypeParam>`
|
||||||
|
- `fields: Vec<FieldDecl { name, ty: TypeRef, attrs }>`
|
||||||
|
- `methods: Vec<MethodDecl { name, sig: FnSig, body: FnBodyRef }>`
|
||||||
|
- `static_methods: Vec<StaticDecl { name, sig: FnSig, body: FnBodyRef }>`
|
||||||
|
- `attrs: AttrSet`
|
||||||
|
- `source_span: Option<Span>`(任意)
|
||||||
|
|
||||||
|
**不要な情報(AST層から排除)**:
|
||||||
|
- 実行時ハンドル(`Arc<dyn NyashBox>`、`InstanceBox` 等)
|
||||||
|
- 共有状態やミューテックス
|
||||||
|
- インタープリターのクロージャ/関数ポインタ
|
||||||
|
|
||||||
|
**Body表現**:
|
||||||
|
- AST直実行であれば `FnBodyRef::Ast(AstNodeId)`。
|
||||||
|
- VM/MIR 変換後は `FnBodyRef::Mir(MirFuncId)` を追加可能(後方互換のため enum)。
|
||||||
|
|
||||||
|
### 3) SharedState の解体
|
||||||
|
|
||||||
|
**役割で分割**:
|
||||||
|
|
||||||
|
**ランタイム共通へ移すもの**:
|
||||||
|
- `box_declarations` → `NyashRuntime.type_space`(宣言と型定義)
|
||||||
|
- `static_box_definitions` → `NyashRuntime.class_space`(宣言→クラスの束縛)
|
||||||
|
- `static_functions` → `NyashRuntime.fn_space`(宣言・シグネチャ中心。実行体は `FnBodyRef`)
|
||||||
|
- `included_files` → ビルド/ロードフェーズの `ModuleLoaderState`(実行時からは外す)
|
||||||
|
|
||||||
|
**実行ごとの状態**:
|
||||||
|
- `global_box` → `ExecutionSession.root_box: SharedBox`(Interpreter/VM共通)
|
||||||
|
|
||||||
|
**新コントラクト**:
|
||||||
|
- `NyashRuntime` は基本不変。`Arc`で共有。
|
||||||
|
- 変更を伴うロード時は `NyashRuntimeBuilder` を使い、確定後に `NyashRuntime` をクローン共有。
|
||||||
|
- 実行時は `ExecutionSession` が唯一の可変中核(スタック、環境、root/global box など)。
|
||||||
|
|
||||||
|
### 4) BoxFactory/Registry の統一設計
|
||||||
|
|
||||||
|
**コアの型**
|
||||||
|
|
||||||
|
```rust
|
||||||
|
trait NyashBox: Any + Send + Sync {
|
||||||
|
// インスタンスの振る舞い
|
||||||
|
// get_field/set_field/call_method 等
|
||||||
|
// as_any で downcast 可能
|
||||||
|
}
|
||||||
|
|
||||||
|
trait BoxClass: Send + Sync {
|
||||||
|
fn name(&self) -> &str;
|
||||||
|
fn instantiate(&self, args: &[SharedBox], sess: &mut ExecutionSession) -> Result<SharedBox>;
|
||||||
|
fn lookup_method(&self, name: &str) -> Option<MethodHandle>;
|
||||||
|
fn lifecycle() -> Option<&dyn BoxLifecycle>;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait BoxFactory: Send + Sync {
|
||||||
|
fn can_build(&self, decl: &BoxDeclaration) -> bool;
|
||||||
|
fn build_class(&self, decl: &BoxDeclaration, rt: &NyashRuntime) -> Result<Arc<dyn BoxClass>>;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**レジストリ**
|
||||||
|
- `BoxRegistry`(Runtime内)
|
||||||
|
- `register_class(class: Arc<dyn BoxClass>)`
|
||||||
|
- `get_class(name: &str) -> Option<Arc<dyn BoxClass>>`
|
||||||
|
- `register_factory(factory: Arc<dyn BoxFactory>)`
|
||||||
|
- `materialize_from_decl(decl: &BoxDeclaration)`(必要に応じ lazy materialize)
|
||||||
|
|
||||||
|
**ライフサイクル(birth/fini)**
|
||||||
|
- `trait BoxLifecycle { fn on_birth(&self, &mut InstanceCtx) -> Result<()>; fn on_fini(&self, &mut InstanceCtx); }`
|
||||||
|
- `BoxClass::lifecycle() -> Option<&dyn BoxLifecycle>`
|
||||||
|
- 生成は `instantiate` の内部で birth を呼ぶ。破棄は `Drop` フックか `Session` の `on_scope_exit` で fini を呼ぶ。
|
||||||
|
|
||||||
|
**プラグイン**
|
||||||
|
- Runtimeに明示登録するのみ(グローバル関数禁止)
|
||||||
|
- `NyashRuntimeBuilder::with_factory(Arc<dyn BoxFactory>)`
|
||||||
|
- 動的ロードは別フェーズ(feature flagで opt-in)。基本は静的リンク/明示登録。
|
||||||
|
|
||||||
|
**dyn の注意点**:
|
||||||
|
- VM/Interpreter ともに `Arc<dyn BoxFactory>` / `Arc<dyn BoxClass>` / `SharedBox = Arc<dyn NyashBox>` を使用。`Arc<BoxFactory>` は使わない。
|
||||||
|
|
||||||
|
### 5) 具体的な実装手順(最小破壊で段階導入)
|
||||||
|
|
||||||
|
**Step 1: BoxDeclaration の移動**
|
||||||
|
- `interpreter::BoxDeclaration` を `core::model::BoxDeclaration` へ抽出。
|
||||||
|
- インタープリターは `use core::model::BoxDeclaration as InterpreterBoxDecl` の一時別名でコンパイル維持。
|
||||||
|
|
||||||
|
**Step 2: NyashRuntime の導入(空の骨組み→段階拡張)**
|
||||||
|
- `NyashRuntime { box_registry, type_space, fn_space }` を追加。
|
||||||
|
- `NyashRuntimeBuilder` を作り、現行の `SharedState` から必要データを移送できるようにする。
|
||||||
|
|
||||||
|
**Step 3: BoxRegistry と Factory の dyn 化**
|
||||||
|
- `BoxFactory`/`BoxClass` を上記インターフェースへ統一(dyn前提)。
|
||||||
|
- 旧 `UserDefinedBoxFactory` は `Arc<dyn BoxFactory>` で登録するようにリライト。
|
||||||
|
|
||||||
|
**Step 4: グローバル登録の排除**
|
||||||
|
- `register_user_defined_factory(...)` のようなグローバル関数は削除/非推奨に。
|
||||||
|
- 代わりに `NyashRuntimeBuilder::with_factory(...)` を使用。
|
||||||
|
|
||||||
|
**Step 5: SharedState の分解**
|
||||||
|
- `global_box` を `ExecutionSession.root_box` に移動。
|
||||||
|
- 残るマップ類をそれぞれ `type_space / fn_space / class_space` へ移譲。
|
||||||
|
- Interpreter 側は `SharedStateShim { runtime: Arc<NyashRuntime>, session: ExecutionSession }` を暫定導入して最小変更で通す。
|
||||||
|
|
||||||
|
**Step 6: Interpreter/VM のコンストラクタ統一**
|
||||||
|
- `NyashInterpreter::new(runtime: Arc<NyashRuntime>)`
|
||||||
|
- `VM::new(runtime: Arc<NyashRuntime>)`
|
||||||
|
- 双方 `ExecutionSession::new(runtime.clone())` から root などを初期化。
|
||||||
|
|
||||||
|
**Step 7: birth/fini の統一呼出し点**
|
||||||
|
- すべてのインスタンス生成を `BoxClass::instantiate` 経由に統一。
|
||||||
|
- 破棄時の fini 呼出しを `ExecutionSession` のスコープ管理に集約。
|
||||||
|
|
||||||
|
**Step 8: 段階的移行と互換**
|
||||||
|
- 旧APIの薄いアダプタを用意(例えば `impl From<SharedState> for NyashRuntimeBuilder`)。
|
||||||
|
- 段階ごとにテストが通るかを確認し、最後に `SharedState` を削除。
|
||||||
|
|
||||||
|
## 各論の要点
|
||||||
|
|
||||||
|
**依存関係の整理**
|
||||||
|
- VM→Interpreter 依存を完全に撤去。両者は Runtime のみを参照。
|
||||||
|
- Interpreter固有の「実行戦略」は Backend に閉じ込め、Box管理・生成は Runtime に一元化。
|
||||||
|
- `ASTNode` は Backend の評価対象だが、Box生成はすべて `BoxRegistry` を介す。
|
||||||
|
|
||||||
|
**Everything is Box の貫徹(シンプルに)**
|
||||||
|
- 値は `SharedBox = Arc<dyn NyashBox>`。
|
||||||
|
- 型/クラスは値ではなく「クラスオブジェクト」として `Arc<dyn BoxClass>`(必要であればメタ階層で `ClassBox` を実装して値化できるが、初期段階では過剰にしない)。
|
||||||
|
- つまり「実行時に扱う実体は必ず Box」、クラスは Box を生み出す工場であり、インスタンスはランタイム一元管理。
|
||||||
|
|
||||||
|
**テスタビリティと並行実行**
|
||||||
|
- ランタイムは不変に近い `Arc` 共有、セッションは疎結合で複数同時に生成可能。
|
||||||
|
- グローバル無効化、明示 DI(Runtime/Session 引数渡し)。
|
||||||
|
- テストでは毎回 `NyashRuntimeBuilder` から新鮮な Runtime を生成可能。並行テストで衝突なし。
|
||||||
|
|
||||||
|
**VM実装の容易化**
|
||||||
|
- VM は Bytecode/MIR のみを意識。Box生成/呼出しは Runtime の `BoxClass/Registry` に任せる。
|
||||||
|
- birth/fini も `instantiate`/`Session` に含めるため、VM は命令列の実行に集中できる。
|
||||||
|
|
||||||
|
## 参考スケルトン
|
||||||
|
|
||||||
|
**ランタイム**
|
||||||
|
```rust
|
||||||
|
pub struct NyashRuntime {
|
||||||
|
box_registry: BoxRegistry,
|
||||||
|
type_space: TypeSpace,
|
||||||
|
fn_space: FnSpace
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ExecutionSession {
|
||||||
|
runtime: Arc<NyashRuntime>,
|
||||||
|
root_box: SharedBox,
|
||||||
|
frames: Vec<Frame>,
|
||||||
|
env: Env
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**レジストリ**
|
||||||
|
```rust
|
||||||
|
pub struct BoxRegistry {
|
||||||
|
classes: RwLock<HashMap<String, Arc<dyn BoxClass>>>,
|
||||||
|
factories: RwLock<Vec<Arc<dyn BoxFactory>>>
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**トレイト**
|
||||||
|
```rust
|
||||||
|
pub trait NyashBox {
|
||||||
|
fn get_field(...);
|
||||||
|
fn set_field(...);
|
||||||
|
fn call_method(...);
|
||||||
|
fn as_any(&self) -> &dyn Any;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait BoxClass {
|
||||||
|
fn name(&self) -> &str;
|
||||||
|
fn instantiate(&self, args: &[SharedBox], sess: &mut ExecutionSession) -> Result<SharedBox>;
|
||||||
|
fn lookup_method(&self, name: &str) -> Option<MethodHandle>;
|
||||||
|
fn lifecycle(&self) -> Option<&dyn BoxLifecycle>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait BoxFactory {
|
||||||
|
fn can_build(&self, decl: &BoxDeclaration) -> bool;
|
||||||
|
fn build_class(&self, decl: &BoxDeclaration, rt: &NyashRuntime) -> Result<Arc<dyn BoxClass>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait BoxLifecycle {
|
||||||
|
fn on_birth(&self, ctx: &mut InstanceCtx) -> Result<()>;
|
||||||
|
fn on_fini(&self, ctx: &mut InstanceCtx);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 実装上の落とし穴と回避
|
||||||
|
|
||||||
|
- **trait object の型**: 必ず `Arc<dyn Trait>`。`Arc<Trait>` は不可。`dyn` を徹底。
|
||||||
|
- **InstanceBox の役割**: もし「ユーザー定義のレコード/オブジェクト」の具象表現なら、それ自体は `NyashBox` 実装。VM/Interpreter は InstanceBox のレイアウトを知らなくてよい(`NyashBox` 経由で操作)。
|
||||||
|
- **共有ロックの過剰化**: Runtime は基本不変。レジストリも初期化後は読み取り中心。クラス遅延構築だけ `RwLock` で十分。
|
||||||
|
- **birth/fini の二重呼び出し防止**: `instantiate`/`Drop` の責務を一本化。Session スコープまたぎの移動に注意。
|
||||||
|
|
||||||
|
## 最後に
|
||||||
|
|
||||||
|
この設計は「モデル(宣言)と実装(クラス/インスタンス)」の責務を分け、Interpreter/VM の接合点を Runtime に集約します。グローバル副作用を除去し、`Arc<dyn ...>` に統一することで、VM と Interpreter の相互依存が解消され、テスト・並行実行が自然になります。段階的移行のステップを踏めば、最小限の変更で最大の整理効果を得られます。
|
||||||
|
|
||||||
|
必要なら、上記スケルトンに合わせた最初のパッチ(`core::model::BoxDeclaration` と `NyashRuntime`/`Builder` の最小骨組み)まで作成します。
|
||||||
@ -0,0 +1,91 @@
|
|||||||
|
Nyashプログラミング言語のインタープリター・VM統合アーキテクチャ再設計について深い分析をお願いします。
|
||||||
|
|
||||||
|
【背景】
|
||||||
|
Nyashは「Everything is Box」哲学のプログラミング言語で、現在インタープリターとVM(Phase 9.78a)の統合で設計上の問題に直面しています。
|
||||||
|
|
||||||
|
【現在の問題点】
|
||||||
|
|
||||||
|
1. **依存関係の逆転**
|
||||||
|
- BoxDeclarationがinterpreter::BoxDeclarationとして定義
|
||||||
|
- VMがインタープリターに依存してしまう
|
||||||
|
- 本来はAST層に属すべきデータ構造
|
||||||
|
|
||||||
|
2. **SharedState中心の設計**
|
||||||
|
```rust
|
||||||
|
pub struct SharedState {
|
||||||
|
pub global_box: Arc<Mutex<InstanceBox>>,
|
||||||
|
pub box_declarations: Arc<RwLock<HashMap<String, BoxDeclaration>>>,
|
||||||
|
pub static_functions: Arc<RwLock<HashMap<String, HashMap<String, ASTNode>>>>,
|
||||||
|
pub static_box_definitions: Arc<RwLock<HashMap<String, StaticBoxDefinition>>>,
|
||||||
|
pub included_files: Arc<Mutex<HashSet<String>>>,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- インタープリター固有の実装詳細に依存
|
||||||
|
- VMから使いにくい構造
|
||||||
|
|
||||||
|
3. **BoxFactory設計の混乱**
|
||||||
|
- BoxFactoryがtraitとして定義されている
|
||||||
|
- UserDefinedBoxFactoryがSharedStateに依存
|
||||||
|
- VMではArc<BoxFactory>でコンパイルエラー(dynが必要)
|
||||||
|
|
||||||
|
4. **グローバル副作用**
|
||||||
|
```rust
|
||||||
|
let factory = UserDefinedBoxFactory::new(shared.clone());
|
||||||
|
register_user_defined_factory(Arc::new(factory));
|
||||||
|
```
|
||||||
|
- グローバルレジストリへの登録
|
||||||
|
- テストや並行実行で問題
|
||||||
|
|
||||||
|
5. **VM実装の困難**
|
||||||
|
- インタープリターの実装詳細に依存
|
||||||
|
- 統一的なBox管理ができない
|
||||||
|
- birth/finiライフサイクルの不統一
|
||||||
|
|
||||||
|
【要求事項】
|
||||||
|
1. インタープリターとVMで共通のBox管理メカニズム
|
||||||
|
2. 依存関係の整理(AST → Runtime → Interpreter/VM)
|
||||||
|
3. テスタブルで並行実行可能な設計
|
||||||
|
4. シンプルで美しい実装
|
||||||
|
5. Everything is Box哲学の維持
|
||||||
|
|
||||||
|
【質問】
|
||||||
|
|
||||||
|
1. **アーキテクチャ全体の再設計**
|
||||||
|
- どのような層構造が最も美しく保守しやすいか?
|
||||||
|
- 依存関係をどう整理すべきか?
|
||||||
|
|
||||||
|
2. **BoxDeclarationの適切な配置**
|
||||||
|
- AST層に移動すべきか、それとも別の共通層を作るべきか?
|
||||||
|
- 必要な情報は何か?不要な情報は何か?
|
||||||
|
|
||||||
|
3. **SharedStateの解体**
|
||||||
|
- どの部分を共通ランタイムに移すべきか?
|
||||||
|
- インタープリター固有の部分はどう分離すべきか?
|
||||||
|
|
||||||
|
4. **BoxFactory/Registryの統一設計**
|
||||||
|
- traitベースか、具体的な構造体ベースか?
|
||||||
|
- プラグインシステムとの統合方法は?
|
||||||
|
|
||||||
|
5. **具体的な実装手順**
|
||||||
|
- 最小限の変更で最大の効果を得る順序は?
|
||||||
|
- 既存コードとの互換性を保ちながら進める方法は?
|
||||||
|
|
||||||
|
【理想の設計】
|
||||||
|
```rust
|
||||||
|
// 例:こんな感じ?
|
||||||
|
pub struct NyashRuntime {
|
||||||
|
box_registry: BoxRegistry,
|
||||||
|
type_definitions: HashMap<String, TypeDefinition>,
|
||||||
|
}
|
||||||
|
|
||||||
|
// インタープリターもVMも同じランタイムを使用
|
||||||
|
impl NyashInterpreter {
|
||||||
|
pub fn new(runtime: NyashRuntime) -> Self { ... }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl VM {
|
||||||
|
pub fn new(runtime: NyashRuntime) -> Self { ... }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Nyashの「Everything is Box」哲学を活かしつつ、最もシンプルで美しく、保守しやすいアーキテクチャを提案してください。特に、天才的な洞察で問題の本質を見抜き、エレガントな解決策を示してください。
|
||||||
@ -0,0 +1,212 @@
|
|||||||
|
# Phase 9.78b: インタープリター・VM統合アーキテクチャ再設計
|
||||||
|
|
||||||
|
**作成日**: 2025-08-21
|
||||||
|
**優先度**: 最高(Phase 9.78aの前提条件)
|
||||||
|
**設計者**: Codex exec (天才的洞察)
|
||||||
|
**実装者**: Claude + User
|
||||||
|
|
||||||
|
## 🎯 目標
|
||||||
|
|
||||||
|
InterpreterとVMの「実装詳細共有」から「モデル共有・実行時共有」への転換を実現し、依存関係を整理する。
|
||||||
|
|
||||||
|
## 📊 現状の問題(Phase 9.78aで発覚)
|
||||||
|
|
||||||
|
1. **依存関係の逆転**
|
||||||
|
- `BoxDeclaration`が`interpreter::BoxDeclaration`として定義
|
||||||
|
- VMがインタープリターに依存
|
||||||
|
|
||||||
|
2. **SharedState中心の設計**
|
||||||
|
- インタープリター固有の実装詳細
|
||||||
|
- VMから使いにくい
|
||||||
|
|
||||||
|
3. **BoxFactoryのtrait問題**
|
||||||
|
- `Arc<BoxFactory>`でコンパイルエラー(`dyn`が必要)
|
||||||
|
|
||||||
|
4. **グローバル副作用**
|
||||||
|
- テスト・並行実行で問題
|
||||||
|
|
||||||
|
## 🏗️ 新アーキテクチャ設計
|
||||||
|
|
||||||
|
```
|
||||||
|
AST/Model → Runtime → Interpreter/VM
|
||||||
|
↑
|
||||||
|
Plugins
|
||||||
|
```
|
||||||
|
|
||||||
|
### 核心的変更
|
||||||
|
- **モデル層**: BoxDeclaration等の純粋データ
|
||||||
|
- **ランタイム層**: BoxClass/Factory、インスタンス管理
|
||||||
|
- **バックエンド層**: 実行戦略のみ(AST実行 or MIR実行)
|
||||||
|
|
||||||
|
## 📋 実装ステップ(8段階)
|
||||||
|
|
||||||
|
### ✅ Step 1: BoxDeclarationの移動
|
||||||
|
**期限**: 1日
|
||||||
|
**リスク**: 低
|
||||||
|
**作業内容**:
|
||||||
|
1. `src/core/model.rs`を作成
|
||||||
|
2. `BoxDeclaration`を`interpreter::BoxDeclaration`から移動
|
||||||
|
3. 一時的な別名で互換性維持
|
||||||
|
```rust
|
||||||
|
use core::model::BoxDeclaration as InterpreterBoxDecl;
|
||||||
|
```
|
||||||
|
|
||||||
|
**成功基準**:
|
||||||
|
- [ ] ビルド成功(警告OK)
|
||||||
|
- [ ] 既存テスト全パス
|
||||||
|
|
||||||
|
### ✅ Step 2: NyashRuntime骨組み作成
|
||||||
|
**期限**: 1日
|
||||||
|
**リスク**: 低
|
||||||
|
**作業内容**:
|
||||||
|
1. `src/runtime/mod.rs`作成
|
||||||
|
2. 最小限の`NyashRuntime`構造体
|
||||||
|
3. `NyashRuntimeBuilder`追加
|
||||||
|
|
||||||
|
**成功基準**:
|
||||||
|
- [ ] 新モジュールのビルド成功
|
||||||
|
- [ ] 既存コードへの影響なし
|
||||||
|
|
||||||
|
### ✅ Step 3: BoxFactoryのdyn化
|
||||||
|
**期限**: 2日
|
||||||
|
**リスク**: 中
|
||||||
|
**作業内容**:
|
||||||
|
1. すべての`Arc<BoxFactory>`を`Arc<dyn BoxFactory>`に変更
|
||||||
|
2. `BoxClass`トレイト導入
|
||||||
|
3. `BoxRegistry`実装
|
||||||
|
|
||||||
|
**成功基準**:
|
||||||
|
- [ ] trait object正しく使用
|
||||||
|
- [ ] VMでのコンパイルエラー解消
|
||||||
|
|
||||||
|
### ✅ Step 4: グローバル登録の排除
|
||||||
|
**期限**: 1日
|
||||||
|
**リスク**: 中
|
||||||
|
**作業内容**:
|
||||||
|
1. `register_user_defined_factory()`削除
|
||||||
|
2. `NyashRuntimeBuilder::with_factory()`追加
|
||||||
|
3. 既存の登録箇所を修正
|
||||||
|
|
||||||
|
**成功基準**:
|
||||||
|
- [ ] グローバル関数の完全削除
|
||||||
|
- [ ] 明示的な依存注入に移行
|
||||||
|
|
||||||
|
### ✅ Step 5: SharedState分解
|
||||||
|
**期限**: 3日
|
||||||
|
**リスク**: 高
|
||||||
|
**作業内容**:
|
||||||
|
1. `SharedStateShim`導入(互換層)
|
||||||
|
2. フィールドを段階的に移行
|
||||||
|
- `box_declarations` → `type_space`
|
||||||
|
- `global_box` → `ExecutionSession.root_box`
|
||||||
|
3. テストを随時実行
|
||||||
|
|
||||||
|
**成功基準**:
|
||||||
|
- [ ] SharedStateShim経由で動作
|
||||||
|
- [ ] 既存機能の維持
|
||||||
|
|
||||||
|
### ✅ Step 6: Interpreter/VM統一
|
||||||
|
**期限**: 2日
|
||||||
|
**リスク**: 中
|
||||||
|
**作業内容**:
|
||||||
|
1. 共通コンストラクタ実装
|
||||||
|
2. `ExecutionSession`共有
|
||||||
|
3. VM側のBox管理をRuntime経由に
|
||||||
|
|
||||||
|
**成功基準**:
|
||||||
|
- [ ] 両者が同じRuntimeを使用
|
||||||
|
- [ ] VMでのBox生成成功
|
||||||
|
|
||||||
|
### ✅ Step 7: ライフサイクル統一
|
||||||
|
**期限**: 2日
|
||||||
|
**リスク**: 中
|
||||||
|
**作業内容**:
|
||||||
|
1. birth/finiをBoxClass経由に
|
||||||
|
2. ScopeTrackerとの統合
|
||||||
|
3. 全Box型で動作確認
|
||||||
|
|
||||||
|
**成功基準**:
|
||||||
|
- [ ] birth/fini正しく呼ばれる
|
||||||
|
- [ ] メモリリークなし
|
||||||
|
|
||||||
|
### ✅ Step 8: クリーンアップ
|
||||||
|
**期限**: 1日
|
||||||
|
**リスク**: 低
|
||||||
|
**作業内容**:
|
||||||
|
1. SharedState完全削除
|
||||||
|
2. 不要な互換層削除
|
||||||
|
3. ドキュメント更新
|
||||||
|
|
||||||
|
**成功基準**:
|
||||||
|
- [ ] コードベースの簡潔性
|
||||||
|
- [ ] 全テストパス
|
||||||
|
|
||||||
|
## 🔗 関連リンク
|
||||||
|
|
||||||
|
- **設計書**: [architecture-redesign-proposal.md](../../../architecture-redesign-proposal.md)
|
||||||
|
- **VM実装状況**: [CURRENT_VM_CHANGES.md](../../../CURRENT_VM_CHANGES.md)
|
||||||
|
- **現在のタスク**: [CURRENT_TASK.md](../../../CURRENT_TASK.md)
|
||||||
|
- **Codex分析**: nyash_interpreter_refactoring_analysis.txt
|
||||||
|
|
||||||
|
## 📊 進捗トラッキング
|
||||||
|
|
||||||
|
| Step | 状態 | 開始日 | 完了日 | 担当 | 備考 |
|
||||||
|
|------|------|--------|--------|------|------|
|
||||||
|
| 1 | 未着手 | - | - | - | BoxDeclaration移動 |
|
||||||
|
| 2 | 未着手 | - | - | - | Runtime骨組み |
|
||||||
|
| 3 | 未着手 | - | - | - | dyn化 |
|
||||||
|
| 4 | 未着手 | - | - | - | グローバル排除 |
|
||||||
|
| 5 | 未着手 | - | - | - | SharedState分解 |
|
||||||
|
| 6 | 未着手 | - | - | - | 統一 |
|
||||||
|
| 7 | 未着手 | - | - | - | ライフサイクル |
|
||||||
|
| 8 | 未着手 | - | - | - | クリーンアップ |
|
||||||
|
|
||||||
|
## ⚠️ リスクと対策
|
||||||
|
|
||||||
|
### 高リスク項目
|
||||||
|
1. **SharedState分解(Step 5)**
|
||||||
|
- 対策: SharedStateShimで段階的移行
|
||||||
|
- ロールバック: git stashで保存
|
||||||
|
|
||||||
|
2. **ライフサイクル統一(Step 7)**
|
||||||
|
- 対策: 十分なテストケース作成
|
||||||
|
- ロールバック: 旧実装を一時保持
|
||||||
|
|
||||||
|
### 中リスク項目
|
||||||
|
1. **BoxFactoryのdyn化(Step 3)**
|
||||||
|
- 対策: コンパイラエラーを1つずつ解決
|
||||||
|
- ロールバック: trait定義を調整
|
||||||
|
|
||||||
|
## 🧪 テスト戦略
|
||||||
|
|
||||||
|
1. **各ステップでの確認**
|
||||||
|
- `cargo test`全パス必須
|
||||||
|
- `cargo check --lib`でビルド確認
|
||||||
|
|
||||||
|
2. **統合テスト**
|
||||||
|
- インタープリター動作確認
|
||||||
|
- VM動作確認(Step 6以降)
|
||||||
|
|
||||||
|
3. **パフォーマンステスト**
|
||||||
|
- Step 8完了後に実施
|
||||||
|
- 既存ベンチマークと比較
|
||||||
|
|
||||||
|
## 📝 作業時の注意事項
|
||||||
|
|
||||||
|
1. **trait objectは必ず`Arc<dyn Trait>`**
|
||||||
|
- ❌ `Arc<BoxFactory>`
|
||||||
|
- ✅ `Arc<dyn BoxFactory>`
|
||||||
|
|
||||||
|
2. **段階的移行の厳守**
|
||||||
|
- 各ステップでビルド成功必須
|
||||||
|
- テスト失敗したら即修正
|
||||||
|
|
||||||
|
3. **CURRENT_TASK.mdの更新**
|
||||||
|
- 作業開始時に更新
|
||||||
|
- 問題発生時に記録
|
||||||
|
- 完了時に結果記載
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**総工数見積もり**: 14日(各ステップにバッファ含む)
|
||||||
|
**推奨アプローチ**: Step 1-2を先行実施して感触を掴む
|
||||||
@ -7,8 +7,18 @@
|
|||||||
use crate::mir::{MirModule, MirFunction, MirInstruction, ConstValue, BinaryOp, CompareOp, UnaryOp, ValueId, BasicBlockId};
|
use crate::mir::{MirModule, MirFunction, MirInstruction, ConstValue, BinaryOp, CompareOp, UnaryOp, ValueId, BasicBlockId};
|
||||||
use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox};
|
use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::sync::Arc;
|
||||||
use super::vm_phi::LoopExecutor;
|
use super::vm_phi::LoopExecutor;
|
||||||
|
|
||||||
|
// Phase 9.78a: Import necessary components for unified Box handling
|
||||||
|
// TODO: Re-enable when interpreter refactoring is complete
|
||||||
|
// use crate::box_factory::UnifiedBoxRegistry;
|
||||||
|
// use crate::instance_v2::InstanceBox;
|
||||||
|
// use crate::interpreter::BoxDeclaration;
|
||||||
|
// use crate::scope_tracker::ScopeTracker;
|
||||||
|
// #[cfg(all(feature = "plugins", not(target_arch = "wasm32")))]
|
||||||
|
// use crate::runtime::plugin_loader_v2::PluginLoaderV2;
|
||||||
|
|
||||||
/// VM execution error
|
/// VM execution error
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum VMError {
|
pub enum VMError {
|
||||||
@ -44,6 +54,8 @@ pub enum VMValue {
|
|||||||
String(String),
|
String(String),
|
||||||
Future(crate::boxes::future::FutureBox),
|
Future(crate::boxes::future::FutureBox),
|
||||||
Void,
|
Void,
|
||||||
|
// Phase 9.78a: Add BoxRef for complex Box types
|
||||||
|
BoxRef(Arc<dyn NyashBox>),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manual PartialEq implementation to avoid requiring PartialEq on FutureBox
|
// Manual PartialEq implementation to avoid requiring PartialEq on FutureBox
|
||||||
@ -57,6 +69,8 @@ impl PartialEq for VMValue {
|
|||||||
(VMValue::Void, VMValue::Void) => true,
|
(VMValue::Void, VMValue::Void) => true,
|
||||||
// Future equality semantics are not defined; treat distinct futures as not equal
|
// Future equality semantics are not defined; treat distinct futures as not equal
|
||||||
(VMValue::Future(_), VMValue::Future(_)) => false,
|
(VMValue::Future(_), VMValue::Future(_)) => false,
|
||||||
|
// BoxRef equality by reference
|
||||||
|
(VMValue::BoxRef(_), VMValue::BoxRef(_)) => false,
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -72,6 +86,8 @@ impl VMValue {
|
|||||||
VMValue::String(s) => Box::new(StringBox::new(s)),
|
VMValue::String(s) => Box::new(StringBox::new(s)),
|
||||||
VMValue::Future(f) => Box::new(f.clone()),
|
VMValue::Future(f) => Box::new(f.clone()),
|
||||||
VMValue::Void => Box::new(VoidBox::new()),
|
VMValue::Void => Box::new(VoidBox::new()),
|
||||||
|
// Phase 9.78a: BoxRef returns cloned Box
|
||||||
|
VMValue::BoxRef(arc_box) => arc_box.clone_box(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,6 +100,7 @@ impl VMValue {
|
|||||||
VMValue::String(s) => s.clone(),
|
VMValue::String(s) => s.clone(),
|
||||||
VMValue::Future(f) => f.to_string_box().value,
|
VMValue::Future(f) => f.to_string_box().value,
|
||||||
VMValue::Void => "void".to_string(),
|
VMValue::Void => "void".to_string(),
|
||||||
|
VMValue::BoxRef(arc_box) => arc_box.to_string_box().value,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +123,7 @@ impl VMValue {
|
|||||||
|
|
||||||
/// Convert from NyashBox to VMValue
|
/// Convert from NyashBox to VMValue
|
||||||
pub fn from_nyash_box(nyash_box: Box<dyn crate::box_trait::NyashBox>) -> VMValue {
|
pub fn from_nyash_box(nyash_box: Box<dyn crate::box_trait::NyashBox>) -> VMValue {
|
||||||
// Try to downcast to known types
|
// Try to downcast to known types for optimization
|
||||||
if let Some(int_box) = nyash_box.as_any().downcast_ref::<IntegerBox>() {
|
if let Some(int_box) = nyash_box.as_any().downcast_ref::<IntegerBox>() {
|
||||||
VMValue::Integer(int_box.value)
|
VMValue::Integer(int_box.value)
|
||||||
} else if let Some(bool_box) = nyash_box.as_any().downcast_ref::<BoolBox>() {
|
} else if let Some(bool_box) = nyash_box.as_any().downcast_ref::<BoolBox>() {
|
||||||
@ -116,8 +133,8 @@ impl VMValue {
|
|||||||
} else if let Some(future_box) = nyash_box.as_any().downcast_ref::<crate::boxes::future::FutureBox>() {
|
} else if let Some(future_box) = nyash_box.as_any().downcast_ref::<crate::boxes::future::FutureBox>() {
|
||||||
VMValue::Future(future_box.clone())
|
VMValue::Future(future_box.clone())
|
||||||
} else {
|
} else {
|
||||||
// For any other type, convert to string representation
|
// Phase 9.78a: For all other Box types (user-defined, plugin), store as BoxRef
|
||||||
VMValue::String(nyash_box.to_string_box().value)
|
VMValue::BoxRef(Arc::from(nyash_box))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -154,6 +171,17 @@ pub struct VM {
|
|||||||
object_fields: HashMap<ValueId, HashMap<String, VMValue>>,
|
object_fields: HashMap<ValueId, HashMap<String, VMValue>>,
|
||||||
/// Loop executor for handling phi nodes and loop-specific logic
|
/// Loop executor for handling phi nodes and loop-specific logic
|
||||||
loop_executor: LoopExecutor,
|
loop_executor: LoopExecutor,
|
||||||
|
// Phase 9.78a: Add unified Box handling components
|
||||||
|
// TODO: Re-enable when interpreter refactoring is complete
|
||||||
|
// /// Box registry for creating all Box types
|
||||||
|
// box_registry: Arc<UnifiedBoxRegistry>,
|
||||||
|
// /// Plugin loader for external Box types
|
||||||
|
// #[cfg(all(feature = "plugins", not(target_arch = "wasm32")))]
|
||||||
|
// plugin_loader: Option<Arc<PluginLoaderV2>>,
|
||||||
|
// Scope tracker for lifecycle management
|
||||||
|
// scope_tracker: ScopeTracker,
|
||||||
|
// /// Box declarations from the AST
|
||||||
|
// box_declarations: Arc<RwLock<HashMap<String, BoxDeclaration>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl VM {
|
impl VM {
|
||||||
@ -168,9 +196,38 @@ impl VM {
|
|||||||
last_result: None,
|
last_result: None,
|
||||||
object_fields: HashMap::new(),
|
object_fields: HashMap::new(),
|
||||||
loop_executor: LoopExecutor::new(),
|
loop_executor: LoopExecutor::new(),
|
||||||
|
// TODO: Re-enable when interpreter refactoring is complete
|
||||||
|
// box_registry: Arc::new(UnifiedBoxRegistry::new()),
|
||||||
|
// #[cfg(all(feature = "plugins", not(target_arch = "wasm32")))]
|
||||||
|
// plugin_loader: None,
|
||||||
|
// scope_tracker: ScopeTracker::new(),
|
||||||
|
// box_declarations: Arc::new(RwLock::new(HashMap::new())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Re-enable when interpreter refactoring is complete
|
||||||
|
/*
|
||||||
|
/// Create a new VM instance with Box registry and declarations
|
||||||
|
pub fn new_with_registry(
|
||||||
|
box_registry: Arc<UnifiedBoxRegistry>,
|
||||||
|
box_declarations: Arc<RwLock<HashMap<String, BoxDeclaration>>>
|
||||||
|
) -> Self {
|
||||||
|
// Implementation pending interpreter refactoring
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Phase 9.78a: Create VM with plugin support
|
||||||
|
#[cfg(all(feature = "plugins", not(target_arch = "wasm32")))]
|
||||||
|
pub fn new_with_plugins(
|
||||||
|
box_registry: Arc<UnifiedBoxRegistry>,
|
||||||
|
plugin_loader: Arc<PluginLoaderV2>,
|
||||||
|
box_declarations: Arc<RwLock<HashMap<String, BoxDeclaration>>>,
|
||||||
|
) -> Self {
|
||||||
|
// Implementation pending interpreter refactoring
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/// Execute a MIR module
|
/// Execute a MIR module
|
||||||
pub fn execute_module(&mut self, module: &MirModule) -> Result<Box<dyn NyashBox>, VMError> {
|
pub fn execute_module(&mut self, module: &MirModule) -> Result<Box<dyn NyashBox>, VMError> {
|
||||||
// Find main function
|
// Find main function
|
||||||
@ -191,6 +248,9 @@ impl VM {
|
|||||||
// Initialize loop executor for this function
|
// Initialize loop executor for this function
|
||||||
self.loop_executor.initialize();
|
self.loop_executor.initialize();
|
||||||
|
|
||||||
|
// Phase 9.78a: Enter a new scope for this function
|
||||||
|
// self.scope_tracker.push_scope();
|
||||||
|
|
||||||
// Start at entry block
|
// Start at entry block
|
||||||
let mut current_block = function.entry_block;
|
let mut current_block = function.entry_block;
|
||||||
|
|
||||||
@ -224,6 +284,8 @@ impl VM {
|
|||||||
|
|
||||||
// Handle control flow
|
// Handle control flow
|
||||||
if let Some(return_value) = should_return {
|
if let Some(return_value) = should_return {
|
||||||
|
// Phase 9.78a: Exit scope before returning
|
||||||
|
// self.scope_tracker.pop_scope();
|
||||||
return Ok(return_value);
|
return Ok(return_value);
|
||||||
} else if let Some(target) = next_block {
|
} else if let Some(target) = next_block {
|
||||||
// Update previous block before jumping
|
// Update previous block before jumping
|
||||||
@ -234,6 +296,8 @@ impl VM {
|
|||||||
} else {
|
} else {
|
||||||
// Block ended without terminator - this shouldn't happen in well-formed MIR
|
// Block ended without terminator - this shouldn't happen in well-formed MIR
|
||||||
// but let's handle it gracefully by returning void
|
// but let's handle it gracefully by returning void
|
||||||
|
// Phase 9.78a: Exit scope before returning
|
||||||
|
// self.scope_tracker.pop_scope();
|
||||||
return Ok(VMValue::Void);
|
return Ok(VMValue::Void);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -354,9 +418,16 @@ impl VM {
|
|||||||
},
|
},
|
||||||
|
|
||||||
MirInstruction::BoxCall { dst, box_val, method, args, effects: _ } => {
|
MirInstruction::BoxCall { dst, box_val, method, args, effects: _ } => {
|
||||||
|
// Phase 9.78a: Unified method dispatch for all Box types
|
||||||
|
|
||||||
// Get the box value
|
// Get the box value
|
||||||
let box_vm_value = self.get_value(*box_val)?;
|
let box_vm_value = self.get_value(*box_val)?;
|
||||||
let box_nyash = box_vm_value.to_nyash_box();
|
|
||||||
|
// Handle BoxRef for proper method dispatch
|
||||||
|
let box_nyash = match &box_vm_value {
|
||||||
|
VMValue::BoxRef(arc_box) => arc_box.clone_box(),
|
||||||
|
_ => box_vm_value.to_nyash_box(),
|
||||||
|
};
|
||||||
|
|
||||||
// Evaluate arguments
|
// Evaluate arguments
|
||||||
let mut arg_values = Vec::new();
|
let mut arg_values = Vec::new();
|
||||||
@ -365,8 +436,8 @@ impl VM {
|
|||||||
arg_values.push(arg_vm_value.to_nyash_box());
|
arg_values.push(arg_vm_value.to_nyash_box());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the method - this mimics interpreter method dispatch
|
// Call the method - unified dispatch for all Box types
|
||||||
let result = self.call_box_method(box_nyash, method, arg_values)?;
|
let result = self.call_unified_method(box_nyash, method, arg_values)?;
|
||||||
|
|
||||||
// Store result if destination is specified
|
// Store result if destination is specified
|
||||||
if let Some(dst_id) = dst {
|
if let Some(dst_id) = dst {
|
||||||
@ -376,32 +447,54 @@ impl VM {
|
|||||||
Ok(ControlFlow::Continue)
|
Ok(ControlFlow::Continue)
|
||||||
},
|
},
|
||||||
|
|
||||||
MirInstruction::NewBox { dst, box_type, args: _ } => {
|
MirInstruction::NewBox { dst, box_type, args } => {
|
||||||
// Implement basic box creation for common types
|
// Phase 9.78a: Simplified Box creation (temporary until interpreter refactoring)
|
||||||
|
|
||||||
|
// Evaluate arguments
|
||||||
|
let mut arg_values = Vec::new();
|
||||||
|
for arg_id in args {
|
||||||
|
let arg_value = self.get_value(*arg_id)?;
|
||||||
|
arg_values.push(arg_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Basic Box creation for common types
|
||||||
let result = match box_type.as_str() {
|
let result = match box_type.as_str() {
|
||||||
"StringBox" => {
|
"StringBox" => {
|
||||||
// Create empty StringBox - in real implementation would use args
|
// Get first argument as string, or empty string
|
||||||
let string_box = Box::new(StringBox::new(""));
|
let value = if let Some(arg) = arg_values.first() {
|
||||||
VMValue::from_nyash_box(string_box)
|
arg.to_string()
|
||||||
|
} else {
|
||||||
|
String::new()
|
||||||
|
};
|
||||||
|
VMValue::String(value)
|
||||||
|
},
|
||||||
|
"IntegerBox" => {
|
||||||
|
// Get first argument as integer, or 0
|
||||||
|
let value = if let Some(arg) = arg_values.first() {
|
||||||
|
arg.as_integer().unwrap_or(0)
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
VMValue::Integer(value)
|
||||||
|
},
|
||||||
|
"BoolBox" => {
|
||||||
|
// Get first argument as bool, or false
|
||||||
|
let value = if let Some(arg) = arg_values.first() {
|
||||||
|
arg.as_bool().unwrap_or(false)
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
VMValue::Bool(value)
|
||||||
},
|
},
|
||||||
"ArrayBox" => {
|
"ArrayBox" => {
|
||||||
// Create empty ArrayBox - in real implementation would use args
|
// Create empty ArrayBox
|
||||||
let array_box = Box::new(crate::boxes::array::ArrayBox::new());
|
let array_box = Box::new(crate::boxes::array::ArrayBox::new());
|
||||||
VMValue::from_nyash_box(array_box)
|
VMValue::from_nyash_box(array_box)
|
||||||
},
|
},
|
||||||
"IntegerBox" => {
|
|
||||||
// Create IntegerBox with default value
|
|
||||||
let int_box = Box::new(IntegerBox::new(0));
|
|
||||||
VMValue::from_nyash_box(int_box)
|
|
||||||
},
|
|
||||||
"BoolBox" => {
|
|
||||||
// Create BoolBox with default value
|
|
||||||
let bool_box = Box::new(BoolBox::new(false));
|
|
||||||
VMValue::from_nyash_box(bool_box)
|
|
||||||
},
|
|
||||||
_ => {
|
_ => {
|
||||||
// For unknown types, create a placeholder string
|
// For unknown types, create a placeholder
|
||||||
VMValue::String(format!("NewBox[{}]", box_type))
|
// TODO: Implement proper user-defined Box creation after refactoring
|
||||||
|
VMValue::String(format!("{}[placeholder]", box_type))
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -722,6 +815,13 @@ impl VM {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Phase 9.78a: Unified method dispatch for all Box types
|
||||||
|
fn call_unified_method(&self, box_value: Box<dyn NyashBox>, method: &str, args: Vec<Box<dyn NyashBox>>) -> Result<Box<dyn NyashBox>, VMError> {
|
||||||
|
// For now, we use the simplified method dispatch
|
||||||
|
// In a full implementation, this would check for InstanceBox and dispatch appropriately
|
||||||
|
self.call_box_method(box_value, method, args)
|
||||||
|
}
|
||||||
|
|
||||||
/// Call a method on a Box - simplified version of interpreter method dispatch
|
/// Call a method on a Box - simplified version of interpreter method dispatch
|
||||||
fn call_box_method(&self, box_value: Box<dyn NyashBox>, method: &str, _args: Vec<Box<dyn NyashBox>>) -> Result<Box<dyn NyashBox>, VMError> {
|
fn call_box_method(&self, box_value: Box<dyn NyashBox>, method: &str, _args: Vec<Box<dyn NyashBox>>) -> Result<Box<dyn NyashBox>, VMError> {
|
||||||
// For now, implement basic methods for common box types
|
// For now, implement basic methods for common box types
|
||||||
|
|||||||
@ -11,6 +11,7 @@ use wasm_bindgen::prelude::*;
|
|||||||
pub mod box_trait;
|
pub mod box_trait;
|
||||||
pub mod boxes;
|
pub mod boxes;
|
||||||
pub mod box_factory; // 🏭 Unified Box Factory Architecture (Phase 9.78)
|
pub mod box_factory; // 🏭 Unified Box Factory Architecture (Phase 9.78)
|
||||||
|
pub mod scope_tracker; // 🎯 Phase 9.78a: Box lifecycle tracking for VM
|
||||||
pub mod stdlib;
|
pub mod stdlib;
|
||||||
pub mod environment;
|
pub mod environment;
|
||||||
pub mod tokenizer;
|
pub mod tokenizer;
|
||||||
|
|||||||
@ -670,75 +670,24 @@ impl MirBuilder {
|
|||||||
|
|
||||||
/// Build new expression: new ClassName(arguments)
|
/// Build new expression: new ClassName(arguments)
|
||||||
fn build_new_expression(&mut self, class: String, arguments: Vec<ASTNode>) -> Result<ValueId, String> {
|
fn build_new_expression(&mut self, class: String, arguments: Vec<ASTNode>) -> Result<ValueId, String> {
|
||||||
// Special handling for built-in Box types that have single literal arguments
|
// Phase 9.78a: Unified Box creation using NewBox instruction
|
||||||
match class.as_str() {
|
|
||||||
"IntegerBox" => {
|
// First, evaluate all arguments to get their ValueIds
|
||||||
if arguments.len() == 1 {
|
let mut arg_values = Vec::new();
|
||||||
if let ASTNode::Literal { value: LiteralValue::Integer(n), .. } = &arguments[0] {
|
for arg in arguments {
|
||||||
// For built-in boxes, just return the value directly
|
let arg_value = self.build_expression(arg)?;
|
||||||
// The VM/interpreter will handle boxing when needed
|
arg_values.push(arg_value);
|
||||||
let dst = self.value_gen.next();
|
|
||||||
self.emit_instruction(MirInstruction::Const {
|
|
||||||
dst,
|
|
||||||
value: ConstValue::Integer(*n),
|
|
||||||
})?;
|
|
||||||
return Ok(dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"StringBox" => {
|
|
||||||
if arguments.len() == 1 {
|
|
||||||
if let ASTNode::Literal { value: LiteralValue::String(s), .. } = &arguments[0] {
|
|
||||||
let dst = self.value_gen.next();
|
|
||||||
self.emit_instruction(MirInstruction::Const {
|
|
||||||
dst,
|
|
||||||
value: ConstValue::String(s.clone()),
|
|
||||||
})?;
|
|
||||||
return Ok(dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"FloatBox" => {
|
|
||||||
if arguments.len() == 1 {
|
|
||||||
if let ASTNode::Literal { value: LiteralValue::Float(f), .. } = &arguments[0] {
|
|
||||||
let dst = self.value_gen.next();
|
|
||||||
self.emit_instruction(MirInstruction::Const {
|
|
||||||
dst,
|
|
||||||
value: ConstValue::Float(*f),
|
|
||||||
})?;
|
|
||||||
return Ok(dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"BoolBox" => {
|
|
||||||
if arguments.len() == 1 {
|
|
||||||
if let ASTNode::Literal { value: LiteralValue::Bool(b), .. } = &arguments[0] {
|
|
||||||
let dst = self.value_gen.next();
|
|
||||||
self.emit_instruction(MirInstruction::Const {
|
|
||||||
dst,
|
|
||||||
value: ConstValue::Bool(*b),
|
|
||||||
})?;
|
|
||||||
return Ok(dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// For other classes, use the original implementation
|
// Generate the destination ValueId
|
||||||
let dst = self.value_gen.next();
|
let dst = self.value_gen.next();
|
||||||
|
|
||||||
// For now, create a "box type" value representing the class
|
// Emit NewBox instruction for all Box types
|
||||||
let type_value = self.value_gen.next();
|
// VM will handle optimization for basic types internally
|
||||||
self.emit_instruction(MirInstruction::Const {
|
self.emit_instruction(MirInstruction::NewBox {
|
||||||
dst: type_value,
|
|
||||||
value: ConstValue::String(class),
|
|
||||||
})?;
|
|
||||||
|
|
||||||
// Create the reference using RefNew
|
|
||||||
self.emit_instruction(MirInstruction::RefNew {
|
|
||||||
dst,
|
dst,
|
||||||
box_val: type_value,
|
box_type: class,
|
||||||
|
args: arg_values,
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(dst)
|
Ok(dst)
|
||||||
|
|||||||
73
src/scope_tracker.rs
Normal file
73
src/scope_tracker.rs
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*!
|
||||||
|
* ScopeTracker - Track Box instances for proper lifecycle management
|
||||||
|
*
|
||||||
|
* Phase 9.78a: Unified Box lifecycle management for VM
|
||||||
|
*/
|
||||||
|
|
||||||
|
use std::sync::Arc;
|
||||||
|
use crate::box_trait::NyashBox;
|
||||||
|
|
||||||
|
/// Tracks Box instances created in different scopes for proper fini calls
|
||||||
|
pub struct ScopeTracker {
|
||||||
|
/// Stack of scopes, each containing Boxes created in that scope
|
||||||
|
scopes: Vec<Vec<Arc<dyn NyashBox>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ScopeTracker {
|
||||||
|
/// Create a new scope tracker
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
scopes: vec![Vec::new()], // Start with one root scope
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Enter a new scope
|
||||||
|
pub fn push_scope(&mut self) {
|
||||||
|
self.scopes.push(Vec::new());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Exit current scope and call fini on all Boxes created in it
|
||||||
|
pub fn pop_scope(&mut self) {
|
||||||
|
if let Some(scope) = self.scopes.pop() {
|
||||||
|
// Call fini in reverse order of creation
|
||||||
|
for arc_box in scope.into_iter().rev() {
|
||||||
|
// For now, fini handling is simplified
|
||||||
|
// In a full implementation, we would check if the Box has a fini method
|
||||||
|
// and call it appropriately
|
||||||
|
// TODO: Implement proper fini dispatch
|
||||||
|
let _ = arc_box; // Suppress unused warning
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure we always have at least one scope
|
||||||
|
if self.scopes.is_empty() {
|
||||||
|
self.scopes.push(Vec::new());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Register a Box in the current scope
|
||||||
|
pub fn register_box(&mut self, nyash_box: Arc<dyn NyashBox>) {
|
||||||
|
if let Some(current_scope) = self.scopes.last_mut() {
|
||||||
|
current_scope.push(nyash_box);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clear all scopes (used when resetting VM state)
|
||||||
|
pub fn clear(&mut self) {
|
||||||
|
// Pop all scopes and call fini
|
||||||
|
while self.scopes.len() > 1 {
|
||||||
|
self.pop_scope();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear the root scope
|
||||||
|
if let Some(root_scope) = self.scopes.first_mut() {
|
||||||
|
root_scope.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for ScopeTracker {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user