🚨 fix: フィールド差し替え時の危険な自動fini呼び出しを発見

現在の問題:
- me.field = newValue で古いfieldのfiniが自動で呼ばれる
- 共有参照を破壊する可能性(複数から参照されている場合)
- GC的な「おせっかい」でNyashの明示的哲学に反する

次の修正予定:
- フィールド差し替え:fini呼ばない(プログラマー責任)
- スコープ離脱時:fini呼ぶ(自然なリソース管理)
- Everything is Explicit の哲学を貫く

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm
2025-08-20 05:57:18 +09:00
parent bab57e7c07
commit 83d3914e46
17 changed files with 17082 additions and 50 deletions

View File

@ -305,12 +305,16 @@ impl NyashInterpreter {
}
}
// 既存のフィールド値があればfini()を呼ぶ
// 既存のフィールド値があれば fini() を呼ぶ
if let Some(old_field_value) = instance.get_field(field) {
if let Some(old_instance) = (*old_field_value).as_any().downcast_ref::<InstanceBox>() {
let _ = old_instance.fini();
finalization::mark_as_finalized(old_instance.box_id());
}
#[cfg(all(feature = "plugins", not(target_arch = "wasm32")))]
if let Some(old_plugin) = (*old_field_value).as_any().downcast_ref::<crate::runtime::plugin_loader_v2::PluginBoxV2>() {
old_plugin.call_fini();
}
}
instance.set_field(field, Arc::from(val.clone_box()))
@ -338,12 +342,16 @@ impl NyashInterpreter {
});
}
// 既存のthis.field値があればfini()を呼ぶ
// 既存のthis.field値があれば fini() を呼ぶ
if let Some(old_field_value) = instance.get_field(field) {
if let Some(old_instance) = (*old_field_value).as_any().downcast_ref::<InstanceBox>() {
let _ = old_instance.fini();
finalization::mark_as_finalized(old_instance.box_id());
}
#[cfg(all(feature = "plugins", not(target_arch = "wasm32")))]
if let Some(old_plugin) = (*old_field_value).as_any().downcast_ref::<crate::runtime::plugin_loader_v2::PluginBoxV2>() {
old_plugin.call_fini();
}
}
instance.set_field(field, Arc::from(val.clone_box()))
@ -371,12 +379,16 @@ impl NyashInterpreter {
});
}
// 既存のme.field値があればfini()を呼ぶ
// 既存のme.field値があれば fini() を呼ぶ
if let Some(old_field_value) = instance.get_field(field) {
if let Some(old_instance) = (*old_field_value).as_any().downcast_ref::<InstanceBox>() {
let _ = old_instance.fini();
finalization::mark_as_finalized(old_instance.box_id());
}
#[cfg(all(feature = "plugins", not(target_arch = "wasm32")))]
if let Some(old_plugin) = (*old_field_value).as_any().downcast_ref::<crate::runtime::plugin_loader_v2::PluginBoxV2>() {
old_plugin.call_fini();
}
}
instance.set_field(field, Arc::from(val.clone_box()))
@ -524,4 +536,4 @@ impl NyashInterpreter {
}
Ok(())
}
}
}