mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-25 19:21:11 +08:00
feat: 实现 console 全局对象 (log/warn/error/info/debug/trace)
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
//! Console 内置对象实现。
|
||||
//!
|
||||
//! 单例全局对象,所有方法输出到 stderr(使用 eprintln!)。
|
||||
//! trace 除消息外额外打印调用栈(std::backtrace::Backtrace)。
|
||||
|
||||
use oxide_runtime_api::{NativeResult, VmHost};
|
||||
use oxide_types::value::JsValue;
|
||||
|
||||
fn multi_string<H: VmHost>(vm: &mut H, args: &[u8]) -> String {
|
||||
let mut output = String::new();
|
||||
let mut first = true;
|
||||
for i in 1..args.len() as usize {
|
||||
if !first {
|
||||
output.push(' ');
|
||||
}
|
||||
first = false;
|
||||
let val = vm.reg(args[i]);
|
||||
let part = if val.is_string() {
|
||||
oxide_runtime_api::to_string(val)
|
||||
} else {
|
||||
let primitive =
|
||||
oxide_runtime_api::to_primitive(val, oxide_runtime_api::ToPrimitiveHint::String, vm)
|
||||
.unwrap_or_else(|_| JsValue::undefined());
|
||||
oxide_runtime_api::to_string(primitive)
|
||||
};
|
||||
output.push_str(&part);
|
||||
}
|
||||
output
|
||||
}
|
||||
|
||||
/// `console.log(...args)`:输出消息到 stderr。
|
||||
pub fn log<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let msg = multi_string(vm, args);
|
||||
eprintln!("{}", msg);
|
||||
NativeResult::Ok(JsValue::undefined())
|
||||
}
|
||||
|
||||
/// `console.warn(...args)`:输出警告到 stderr。
|
||||
pub fn warn<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let msg = multi_string(vm, args);
|
||||
eprintln!("warn: {}", msg);
|
||||
NativeResult::Ok(JsValue::undefined())
|
||||
}
|
||||
|
||||
/// `console.error(...args)`:输出错误到 stderr。
|
||||
pub fn error<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let msg = multi_string(vm, args);
|
||||
eprintln!("error: {}", msg);
|
||||
NativeResult::Ok(JsValue::undefined())
|
||||
}
|
||||
|
||||
/// `console.info(...args)`:输出信息到 stderr。
|
||||
pub fn info<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let msg = multi_string(vm, args);
|
||||
eprintln!("info: {}", msg);
|
||||
NativeResult::Ok(JsValue::undefined())
|
||||
}
|
||||
|
||||
/// `console.debug(...args)`:输出调试消息到 stderr。
|
||||
pub fn debug<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let msg = multi_string(vm, args);
|
||||
eprintln!("debug: {}", msg);
|
||||
NativeResult::Ok(JsValue::undefined())
|
||||
}
|
||||
|
||||
/// `console.trace(...args)`:输出跟踪消息及调用栈到 stderr。
|
||||
pub fn trace<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let msg = multi_string(vm, args);
|
||||
let backtrace = std::backtrace::Backtrace::capture();
|
||||
eprintln!("trace: {}\n{:?}", msg, backtrace);
|
||||
NativeResult::Ok(JsValue::undefined())
|
||||
}
|
||||
@@ -17,6 +17,8 @@ pub mod bigint;
|
||||
pub mod boolean;
|
||||
/// builtins 层日志宏(`builtins_error`/`builtins_info` 等),target 为 `oxide::builtins`。
|
||||
pub mod builtins_log;
|
||||
/// Console 全局对象实现(log/warn/error/info/debug/trace 方法)。
|
||||
pub mod console;
|
||||
/// DataView 内置对象实现(对 ArrayBuffer 的定点读写视图)。
|
||||
pub mod data_view;
|
||||
/// Date 内置对象实现(时间戳存取、get/set 系列与 to*String 系列)。
|
||||
|
||||
Reference in New Issue
Block a user