feat: Phase 2.4 NyRT→NyKernel Architecture Revolution 100%完了!
ChatGPT5 Pro設計分析による42%コード削減の完全実現: - crates/nyrt → crates/nyash_kernel 完全移行 - with_legacy_vm_args系統11箇所削除(encode/birth/future/invoke系) - Plugin-First Architecture統一(VM依存根絶) - libnyash_kernel.a生成成功(0エラー・0警告) - LLVM統合更新(build_llvm.sh, ny-llvmc対応) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
153
crates/nyash_kernel/src/plugin/console.rs
Normal file
153
crates/nyash_kernel/src/plugin/console.rs
Normal file
@ -0,0 +1,153 @@
|
||||
// ---- ExternCall helpers for LLVM lowering ----
|
||||
// Exported as: nyash.console.log(i8* cstr) -> i64
|
||||
#[export_name = "nyash.console.log"]
|
||||
pub extern "C" fn nyash_console_log_export(ptr: *const i8) -> i64 {
|
||||
if ptr.is_null() {
|
||||
return 0;
|
||||
}
|
||||
unsafe {
|
||||
let c = std::ffi::CStr::from_ptr(ptr);
|
||||
if let Ok(s) = c.to_str() {
|
||||
println!("{}", s);
|
||||
}
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
// Exported as: nyash.console.log_handle(i64 handle) -> i64
|
||||
#[export_name = "nyash.console.log_handle"]
|
||||
pub extern "C" fn nyash_console_log_handle(handle: i64) -> i64 {
|
||||
use nyash_rust::jit::rt::handles;
|
||||
eprintln!("DEBUG: handle={}", handle);
|
||||
if let Some(obj) = handles::get(handle) {
|
||||
let s = obj.to_string_box().value;
|
||||
println!("{}", s);
|
||||
} else {
|
||||
eprintln!("DEBUG: handle {} not found in registry", handle);
|
||||
println!("{}", handle);
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
// Exported as: nyash.console.warn_handle(i64 handle) -> i64
|
||||
#[export_name = "nyash.console.warn_handle"]
|
||||
pub extern "C" fn nyash_console_warn_handle(handle: i64) -> i64 {
|
||||
if handle <= 0 {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if let Some(obj) = nyash_rust::jit::rt::handles::get(handle) {
|
||||
let s = obj.to_string_box().value;
|
||||
eprintln!("WARN: {}", s);
|
||||
} else {
|
||||
eprintln!("WARN: {}", handle);
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
// Exported as: nyash.console.error_handle(i64 handle) -> i64
|
||||
#[export_name = "nyash.console.error_handle"]
|
||||
pub extern "C" fn nyash_console_error_handle(handle: i64) -> i64 {
|
||||
if handle <= 0 {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if let Some(obj) = nyash_rust::jit::rt::handles::get(handle) {
|
||||
let s = obj.to_string_box().value;
|
||||
eprintln!("ERROR: {}", s);
|
||||
} else {
|
||||
eprintln!("ERROR: {}", handle);
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
// Exported as: nyash.debug.trace_handle(i64 handle) -> i64
|
||||
#[export_name = "nyash.debug.trace_handle"]
|
||||
pub extern "C" fn nyash_debug_trace_handle(handle: i64) -> i64 {
|
||||
if handle <= 0 {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if let Some(obj) = nyash_rust::jit::rt::handles::get(handle) {
|
||||
let s = obj.to_string_box().value;
|
||||
eprintln!("TRACE: {}", s);
|
||||
} else {
|
||||
eprintln!("TRACE: {}", handle);
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
// Exported as: nyash.console.warn(i8* cstr) -> i64
|
||||
#[export_name = "nyash.console.warn"]
|
||||
pub extern "C" fn nyash_console_warn_export(ptr: *const i8) -> i64 {
|
||||
if ptr.is_null() {
|
||||
return 0;
|
||||
}
|
||||
unsafe {
|
||||
let c = std::ffi::CStr::from_ptr(ptr);
|
||||
if let Ok(s) = c.to_str() {
|
||||
eprintln!("[warn] {}", s);
|
||||
}
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
// Exported as: nyash.console.error(i8* cstr) -> i64
|
||||
#[export_name = "nyash.console.error"]
|
||||
pub extern "C" fn nyash_console_error_export(ptr: *const i8) -> i64 {
|
||||
if ptr.is_null() {
|
||||
return 0;
|
||||
}
|
||||
unsafe {
|
||||
let c = std::ffi::CStr::from_ptr(ptr);
|
||||
if let Ok(s) = c.to_str() {
|
||||
eprintln!("[error] {}", s);
|
||||
}
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
// Exported as: nyash.debug.trace(i8* cstr) -> i64
|
||||
#[export_name = "nyash.debug.trace"]
|
||||
pub extern "C" fn nyash_debug_trace_export(ptr: *const i8) -> i64 {
|
||||
if ptr.is_null() {
|
||||
return 0;
|
||||
}
|
||||
unsafe {
|
||||
let c = std::ffi::CStr::from_ptr(ptr);
|
||||
if let Ok(s) = c.to_str() {
|
||||
eprintln!("[trace] {}", s);
|
||||
}
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
// Exported as: nyash.console.readline() -> i8*
|
||||
#[export_name = "nyash.console.readline"]
|
||||
pub extern "C" fn nyash_console_readline_export() -> *mut i8 {
|
||||
use std::io;
|
||||
// Read a line from stdin; normalize to UTF-8 and strip trailing CR/LF
|
||||
let mut input = String::new();
|
||||
// Use read_to_end if stdin is not a TTY? Simpler: read_line through BufRead
|
||||
// For simplicity, read from stdin into buffer until newline or EOF
|
||||
let mut buf = String::new();
|
||||
// Note: use std::io::stdin() directly without an unused handle binding
|
||||
// On failure or EOF, return empty string
|
||||
match io::stdin().read_line(&mut buf) {
|
||||
Ok(_n) => {
|
||||
input = buf;
|
||||
}
|
||||
Err(_) => {
|
||||
input.clear();
|
||||
}
|
||||
}
|
||||
while input.ends_with('\n') || input.ends_with('\r') {
|
||||
input.pop();
|
||||
}
|
||||
// Allocate C string (null-terminated)
|
||||
let mut bytes = input.into_bytes();
|
||||
bytes.push(0);
|
||||
let boxed = bytes.into_boxed_slice();
|
||||
let raw = Box::into_raw(boxed) as *mut u8;
|
||||
raw as *mut i8
|
||||
}
|
||||
Reference in New Issue
Block a user