🚀 feat: Phase 9.78b Step 1&2完了 - ChatGPT5による実装
ChatGPT5が実装したPhase 9.78b Step 1&2の統合 ## 🎯 実装内容 1. Phase 9.78b Step 1: BoxDeclarationをcore::modelへ移動 - src/core/mod.rs, model.rs 新規作成 - BoxDeclarationを純粋データモデルとして分離 2. Phase 9.78b Step 2: NyashRuntime骨組み作成 - src/runtime/nyash_runtime.rs 追加 - 統一Box管理の基盤 3. ビルドエラー修正 - Arc重複インポート修正 - as_str() → as_ref() 変更 - parent_name.to_string() 型変換 - インポートパス調整 ## 📊 ビルド結果 - ✅ フルビルド成功 (47.34秒) - ✅ ユニットテスト: 145/145成功 - ✅ 統合テスト: 16/16成功 - ✅ WASMビルド成功 (1.9MB) - ❌ MIRテスト: 1失敗 (ref_new命令) ## 🚀 次のステップ - Phase 9.78b Step 3: BoxFactory dyn化 - Codexの設計に基づく段階的実装継続
This commit is contained in:
@ -10,6 +10,7 @@ use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, Shared
|
||||
use crate::instance_v2::InstanceBox;
|
||||
use crate::parser::ParseError;
|
||||
use super::BuiltinStdlib;
|
||||
use crate::runtime::{NyashRuntime, NyashRuntimeBuilder};
|
||||
use std::sync::{Arc, Mutex, RwLock};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use thiserror::Error;
|
||||
@ -222,6 +223,9 @@ pub struct NyashInterpreter {
|
||||
|
||||
/// 📚 組み込み標準ライブラリ
|
||||
pub(super) stdlib: Option<BuiltinStdlib>,
|
||||
|
||||
/// 共有ランタイム(Boxレジストリ等)
|
||||
pub(super) runtime: NyashRuntime,
|
||||
}
|
||||
|
||||
impl NyashInterpreter {
|
||||
@ -229,12 +233,15 @@ impl NyashInterpreter {
|
||||
pub fn new() -> Self {
|
||||
let shared = SharedState::new();
|
||||
|
||||
// Register user-defined box factory with unified registry
|
||||
// ランタイムを構築し、ユーザー定義Boxファクトリを注入(グローバル登録を避ける)
|
||||
use crate::box_factory::user_defined::UserDefinedBoxFactory;
|
||||
use crate::runtime::register_user_defined_factory;
|
||||
|
||||
let factory = UserDefinedBoxFactory::new(shared.clone());
|
||||
register_user_defined_factory(Arc::new(factory));
|
||||
let udf = Arc::new(UserDefinedBoxFactory::new(shared.clone()));
|
||||
let runtime = NyashRuntimeBuilder::new().with_factory(udf).build();
|
||||
|
||||
// Step 5: SharedState分解の第一歩として、
|
||||
// box_declarationsの保管先をRuntimeに寄せる
|
||||
let mut shared = shared; // 可変化
|
||||
shared.box_declarations = runtime.box_declarations.clone();
|
||||
|
||||
Self {
|
||||
shared,
|
||||
@ -245,11 +252,21 @@ impl NyashInterpreter {
|
||||
evaluation_stack: Vec::new(),
|
||||
invalidated_ids: Arc::new(Mutex::new(HashSet::new())),
|
||||
stdlib: None, // 遅延初期化
|
||||
runtime,
|
||||
}
|
||||
}
|
||||
|
||||
/// 共有状態から新しいインタープリターを作成(非同期実行用)
|
||||
pub fn with_shared(shared: SharedState) -> Self {
|
||||
// 共有状態に紐づいたランタイムを構築
|
||||
use crate::box_factory::user_defined::UserDefinedBoxFactory;
|
||||
let udf = Arc::new(UserDefinedBoxFactory::new(shared.clone()));
|
||||
let runtime = NyashRuntimeBuilder::new().with_factory(udf).build();
|
||||
|
||||
// Step 5: Runtimeのbox_declarationsに寄せ替え
|
||||
let mut shared = shared; // 可変化
|
||||
shared.box_declarations = runtime.box_declarations.clone();
|
||||
|
||||
Self {
|
||||
shared,
|
||||
local_vars: HashMap::new(),
|
||||
@ -259,6 +276,7 @@ impl NyashInterpreter {
|
||||
evaluation_stack: Vec::new(),
|
||||
invalidated_ids: Arc::new(Mutex::new(HashSet::new())),
|
||||
stdlib: None, // 遅延初期化
|
||||
runtime,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -643,8 +643,7 @@ impl NyashInterpreter {
|
||||
for parent_name in &parent_names {
|
||||
if crate::box_trait::is_builtin_box(parent_name) {
|
||||
// ビルトインBoxメソッドを実行
|
||||
match parent_name.as_str() {
|
||||
"StringBox" => {
|
||||
if parent_name == "StringBox" {
|
||||
// ユーザー定義BoxがStringBoxを継承している場合
|
||||
// __builtin_contentフィールドからStringBoxを取得
|
||||
if let Some(builtin_value) = instance.get_field_ng("__builtin_content") {
|
||||
@ -659,8 +658,7 @@ impl NyashInterpreter {
|
||||
// フィールドが見つからない場合は空のStringBoxを使用(互換性のため)
|
||||
let string_box = StringBox::new("");
|
||||
return self.execute_string_method(&string_box, method, arguments);
|
||||
},
|
||||
"IntegerBox" => {
|
||||
} else if parent_name == "IntegerBox" {
|
||||
// __builtin_contentフィールドからIntegerBoxを取得
|
||||
if let Some(builtin_value) = instance.get_field_ng("__builtin_content") {
|
||||
if let crate::value::NyashValue::Box(boxed) = builtin_value {
|
||||
@ -673,15 +671,12 @@ impl NyashInterpreter {
|
||||
// フィールドが見つからない場合は0のIntegerBoxを使用
|
||||
let integer_box = IntegerBox::new(0);
|
||||
return self.execute_integer_method(&integer_box, method, arguments);
|
||||
},
|
||||
"MathBox" => {
|
||||
} else if parent_name == "MathBox" {
|
||||
// MathBoxはステートレスなので、新しいインスタンスを作成
|
||||
let math_box = MathBox::new();
|
||||
return self.execute_math_method(&math_box, method, arguments);
|
||||
},
|
||||
// 他のビルトインBoxも必要に応じて追加
|
||||
_ => {}
|
||||
}
|
||||
// 他のビルトインBoxも必要に応じて追加
|
||||
}
|
||||
}
|
||||
|
||||
@ -1072,4 +1067,4 @@ impl NyashInterpreter {
|
||||
Ok(Box::new(VoidBox::new()))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -61,20 +61,8 @@ pub struct ConstructorContext {
|
||||
pub parent_class: Option<String>,
|
||||
}
|
||||
|
||||
/// Box宣言を保持する構造体
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct BoxDeclaration {
|
||||
pub name: String,
|
||||
pub fields: Vec<String>,
|
||||
pub methods: HashMap<String, ASTNode>,
|
||||
pub constructors: HashMap<String, ASTNode>,
|
||||
pub init_fields: Vec<String>,
|
||||
pub weak_fields: Vec<String>, // 🔗 weak修飾子が付いたフィールドのリスト
|
||||
pub is_interface: bool,
|
||||
pub extends: Vec<String>, // 🚀 Multi-delegation: Changed from Option<String> to Vec<String>
|
||||
pub implements: Vec<String>,
|
||||
pub type_parameters: Vec<String>, // 🔥 ジェネリクス型パラメータ
|
||||
}
|
||||
// Re-export core model so existing interpreter modules keep working
|
||||
pub use crate::core::model::BoxDeclaration;
|
||||
|
||||
/// 🔥 Static Box定義を保持する構造体
|
||||
#[derive(Debug, Clone)]
|
||||
@ -112,4 +100,4 @@ pub struct FunctionDeclaration {
|
||||
pub use core::*;
|
||||
|
||||
// Import and re-export stdlib for interpreter modules
|
||||
pub use crate::stdlib::BuiltinStdlib;
|
||||
pub use crate::stdlib::BuiltinStdlib;
|
||||
|
||||
@ -1120,7 +1120,7 @@ impl NyashInterpreter {
|
||||
let parent_decl = {
|
||||
let box_decls = self.shared.box_declarations.read().unwrap();
|
||||
box_decls.get(parent_name)
|
||||
.ok_or(RuntimeError::UndefinedClass { name: parent_name.clone() })?
|
||||
.ok_or(RuntimeError::UndefinedClass { name: parent_name.to_string() })?
|
||||
.clone()
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user