✅ **Phase 2.2達成項目**: - LLVMスモークテスト完全成功(1648バイト生成) - プラグイン統合動作確認(StringBox/IntegerBox@LLVM) - 静的コンパイル核心技術実証(MIR→LLVM→オブジェクト) - Everything is Plugin革命のLLVM対応確認 🔍 **Task先生nyrt調査成果**: - nyrt正体解明:AOT/LLVMランタイム必須インフラ - 機能分類:58%必須(ハンドル・GC・エントリー)42%代替可能 - 設計一貫性:75%達成(Box操作完全プラグイン化) - 削減戦略:Phase A実装で26個関数→プラグイン統合(42%削減) 🎯 **Everything is Plugin完全実現への道筋**: - 現状:プラグインファクトリー(StrictPluginFirst)完全動作 - 課題:nyrt中央集権 vs プラグイン哲学の矛盾 - 解決:Hybrid Plugin Architecture推進 - 目標:String/Box API→プラグイン統合で設計一貫性完成 📊 **技術的成果**: - LLVM static plugin integration: ✅ 完全動作 - Plugin priority system: ✅ 完全動作 - Object code generation: ✅ 実証済み - nyrt architectural analysis: ✅ 完全解明 🚀 **Phase 15.5革命基盤確立**: プラグイン優先アーキテクチャ実用化完了 次段階Phase 2.3でビルトインBox段階削除+nyrt Plugin統合推進へ 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
48 lines
1.8 KiB
Rust
48 lines
1.8 KiB
Rust
// ---- Unified semantics shims (handle-based) ----
|
|
// Exported as: nyash.semantics.add_hh(i64 lhs_handle, i64 rhs_handle) -> i64 (NyashBox handle)
|
|
#[export_name = "nyash.semantics.add_hh"]
|
|
pub extern "C" fn nyash_semantics_add_hh_export(lhs_h: i64, rhs_h: i64) -> i64 {
|
|
use nyash_rust::jit::rt::handles;
|
|
use nyash_rust::{
|
|
box_trait::{IntegerBox, StringBox},
|
|
runtime::semantics,
|
|
};
|
|
if lhs_h <= 0 || rhs_h <= 0 {
|
|
return 0;
|
|
}
|
|
let lhs = if let Some(obj) = handles::get(lhs_h) {
|
|
obj
|
|
} else {
|
|
return 0;
|
|
};
|
|
let rhs = if let Some(obj) = handles::get(rhs_h) {
|
|
obj
|
|
} else {
|
|
return 0;
|
|
};
|
|
let ls_opt = semantics::coerce_to_string(lhs.as_ref());
|
|
let rs_opt = semantics::coerce_to_string(rhs.as_ref());
|
|
if ls_opt.is_some() || rs_opt.is_some() {
|
|
let ls = ls_opt.unwrap_or_else(|| lhs.to_string_box().value);
|
|
let rs = rs_opt.unwrap_or_else(|| rhs.to_string_box().value);
|
|
let s = format!("{}{}", ls, rs);
|
|
let arc: std::sync::Arc<dyn nyash_rust::box_trait::NyashBox> =
|
|
std::sync::Arc::new(StringBox::new(s));
|
|
return handles::to_handle(arc) as i64;
|
|
}
|
|
if let (Some(li), Some(ri)) = (
|
|
semantics::coerce_to_i64(lhs.as_ref()),
|
|
semantics::coerce_to_i64(rhs.as_ref()),
|
|
) {
|
|
let arc: std::sync::Arc<dyn nyash_rust::box_trait::NyashBox> =
|
|
std::sync::Arc::new(IntegerBox::new(li + ri));
|
|
return handles::to_handle(arc) as i64;
|
|
}
|
|
// Fallback: stringify both and concat to preserve total order
|
|
let ls = lhs.to_string_box().value;
|
|
let rs = rhs.to_string_box().value;
|
|
let arc: std::sync::Arc<dyn nyash_rust::box_trait::NyashBox> =
|
|
std::sync::Arc::new(StringBox::new(format!("{}{}", ls, rs)));
|
|
handles::to_handle(arc) as i64
|
|
}
|