refactor: 大規模ファイル分割とプラグインリファクタリング
## 🎯 プラグイン整理 - ✅ **nyash-json-plugin**: プロバイダー抽象化、NodeRep統一 - ✅ **nyash-string-plugin**: TLVヘルパー整理 - ✅ **nyash-net-plugin**: HTTPヘルパー分離、ソケット管理改善 - ✅ **nyash-counter-plugin/fixture-plugin**: 基本構造整理 ## 📂 mir_interpreter分割 - ✅ **mir_interpreter.rs → mir_interpreter/ディレクトリ** - mod.rs: メイン構造体定義 - execution.rs: 実行エンジン - memory.rs: メモリ管理 - instructions/: 命令別実装 ## 🔧 その他の改善 - テストファイル群の最適化 - LLVMコンパイラのメイン関数整理 - 不要なインポート削除 1000行超のファイルを適切なモジュール構造に分割完了! 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -2,7 +2,10 @@
|
||||
|
||||
use once_cell::sync::Lazy;
|
||||
use std::collections::HashMap;
|
||||
use std::sync::{atomic::{AtomicU32, Ordering}, Mutex};
|
||||
use std::sync::{
|
||||
atomic::{AtomicU32, Ordering},
|
||||
Mutex,
|
||||
};
|
||||
|
||||
// ===== Error Codes (BID-1 alignment) =====
|
||||
const NYB_SUCCESS: i32 = 0;
|
||||
@ -42,7 +45,9 @@ pub extern "C" fn nyash_plugin_invoke(
|
||||
result: *mut u8,
|
||||
result_len: *mut usize,
|
||||
) -> i32 {
|
||||
if type_id != TYPE_ID_FIXTURE { return NYB_E_INVALID_TYPE; }
|
||||
if type_id != TYPE_ID_FIXTURE {
|
||||
return NYB_E_INVALID_TYPE;
|
||||
}
|
||||
unsafe { dispatch(method_id, instance_id, args, args_len, result, result_len) }
|
||||
}
|
||||
|
||||
@ -72,7 +77,9 @@ unsafe impl Sync for NyashTypeBoxFfi {}
|
||||
|
||||
extern "C" fn fixture_resolve(name: *const std::os::raw::c_char) -> u32 {
|
||||
unsafe {
|
||||
if name.is_null() { return 0; }
|
||||
if name.is_null() {
|
||||
return 0;
|
||||
}
|
||||
let s = std::ffi::CStr::from_ptr(name).to_string_lossy();
|
||||
match s.as_ref() {
|
||||
"birth" => METHOD_BIRTH,
|
||||
@ -125,12 +132,18 @@ unsafe fn dispatch(
|
||||
}
|
||||
|
||||
unsafe fn birth(result: *mut u8, result_len: *mut usize) -> i32 {
|
||||
if result_len.is_null() { return NYB_E_INVALID_ARGS; }
|
||||
if preflight(result, result_len, 4) { return NYB_E_SHORT_BUFFER; }
|
||||
if result_len.is_null() {
|
||||
return NYB_E_INVALID_ARGS;
|
||||
}
|
||||
if preflight(result, result_len, 4) {
|
||||
return NYB_E_SHORT_BUFFER;
|
||||
}
|
||||
let id = INSTANCE_COUNTER.fetch_add(1, Ordering::Relaxed);
|
||||
if let Ok(mut map) = INSTANCES.lock() {
|
||||
map.insert(id, FixtureInstance { alive: true });
|
||||
} else { return NYB_E_PLUGIN_ERROR; }
|
||||
} else {
|
||||
return NYB_E_PLUGIN_ERROR;
|
||||
}
|
||||
let bytes = id.to_le_bytes();
|
||||
std::ptr::copy_nonoverlapping(bytes.as_ptr(), result, 4);
|
||||
*result_len = 4;
|
||||
@ -141,33 +154,43 @@ unsafe fn fini(instance_id: u32) -> i32 {
|
||||
if let Ok(mut map) = INSTANCES.lock() {
|
||||
map.remove(&instance_id);
|
||||
NYB_SUCCESS
|
||||
} else { NYB_E_PLUGIN_ERROR }
|
||||
} else {
|
||||
NYB_E_PLUGIN_ERROR
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn echo(
|
||||
args: *const u8,
|
||||
args_len: usize,
|
||||
result: *mut u8,
|
||||
result_len: *mut usize,
|
||||
) -> i32 {
|
||||
unsafe fn echo(args: *const u8, args_len: usize, result: *mut u8, result_len: *mut usize) -> i32 {
|
||||
// Expect TLV with 1 argument: tag=6 (String)
|
||||
if args.is_null() || args_len < 4 { return NYB_E_INVALID_ARGS; }
|
||||
if args.is_null() || args_len < 4 {
|
||||
return NYB_E_INVALID_ARGS;
|
||||
}
|
||||
let slice = std::slice::from_raw_parts(args, args_len);
|
||||
// Minimal TLV parse: skip header (ver/argc) and verify first entry is String
|
||||
if slice.len() < 8 { return NYB_E_INVALID_ARGS; }
|
||||
if slice.len() < 8 {
|
||||
return NYB_E_INVALID_ARGS;
|
||||
}
|
||||
if slice[0] != 1 || slice[1] != 0 { /* ver=1 little endian */ }
|
||||
// position 4.. is first entry; [tag, rsv, sz_lo, sz_hi, payload...]
|
||||
let tag = slice[4];
|
||||
if tag != 6 { return NYB_E_INVALID_ARGS; }
|
||||
if tag != 6 {
|
||||
return NYB_E_INVALID_ARGS;
|
||||
}
|
||||
let sz = u16::from_le_bytes([slice[6], slice[7]]) as usize;
|
||||
if 8 + sz > slice.len() { return NYB_E_INVALID_ARGS; }
|
||||
if 8 + sz > slice.len() {
|
||||
return NYB_E_INVALID_ARGS;
|
||||
}
|
||||
let payload = &slice[8..8 + sz];
|
||||
let s = match std::str::from_utf8(payload) { Ok(t) => t, Err(_) => return NYB_E_INVALID_ARGS };
|
||||
let s = match std::str::from_utf8(payload) {
|
||||
Ok(t) => t,
|
||||
Err(_) => return NYB_E_INVALID_ARGS,
|
||||
};
|
||||
write_tlv_str(s, result, result_len)
|
||||
}
|
||||
|
||||
fn write_tlv_result(payloads: &[(u8, &[u8])], result: *mut u8, result_len: *mut usize) -> i32 {
|
||||
if result_len.is_null() { return NYB_E_INVALID_ARGS; }
|
||||
if result_len.is_null() {
|
||||
return NYB_E_INVALID_ARGS;
|
||||
}
|
||||
let needed = 4 + payloads.iter().map(|(_, p)| 4 + p.len()).sum::<usize>();
|
||||
let mut buf: Vec<u8> = Vec::with_capacity(needed);
|
||||
buf.extend_from_slice(&1u16.to_le_bytes()); // ver
|
||||
@ -195,7 +218,9 @@ fn write_tlv_str(s: &str, result: *mut u8, result_len: *mut usize) -> i32 {
|
||||
|
||||
fn preflight(result: *mut u8, result_len: *mut usize, needed: usize) -> bool {
|
||||
unsafe {
|
||||
if result_len.is_null() { return false; }
|
||||
if result_len.is_null() {
|
||||
return false;
|
||||
}
|
||||
if result.is_null() || *result_len < needed {
|
||||
*result_len = needed;
|
||||
return true;
|
||||
@ -203,4 +228,3 @@ fn preflight(result: *mut u8, result_len: *mut usize, needed: usize) -> bool {
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user