mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
feat: 为 VM 添加结构化日志
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
use crate::vm::Vm;
|
||||
use crate::{vm_error, vm_trace};
|
||||
use oxide_bytecode::opcode;
|
||||
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
|
||||
use oxide_types::object::JsObject;
|
||||
@@ -8,17 +9,20 @@ impl Vm {
|
||||
#[inline(always)]
|
||||
pub(crate) fn dispatch_load_const(&mut self, rd: usize, instr: u32) -> Result<(), String> {
|
||||
let idx = (instr >> 16) as usize;
|
||||
vm_trace!("LOAD_CONST rd={} idx={}", rd, idx);
|
||||
let imm = self.immutables();
|
||||
if idx < imm.len() {
|
||||
self.regs[rd] = imm[idx];
|
||||
Ok(())
|
||||
} else {
|
||||
vm_error!("LOAD_CONST index {} out of bounds (len={})", idx, imm.len());
|
||||
Err(format!("constant index {idx} out of bounds"))
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn dispatch_typeof(&mut self, rd: usize, a: usize) {
|
||||
vm_trace!("TYPEOF rd={} r{}={:?}", rd, a, self.regs[a]);
|
||||
let val = self.regs[a];
|
||||
let result = if val.is_undefined() {
|
||||
"undefined"
|
||||
@@ -46,6 +50,7 @@ impl Vm {
|
||||
}
|
||||
|
||||
pub(crate) fn dispatch_load_var(&mut self, rd: usize, a: usize) -> Result<bool, String> {
|
||||
vm_trace!("LOAD_VAR rd={} r{}={:?}", rd, a, self.regs[a]);
|
||||
if a == 254
|
||||
&& self.frames.last().map(|frame| frame.is_derived_constructor).unwrap_or(false)
|
||||
&& self.regs[a].is_undefined()
|
||||
@@ -58,6 +63,7 @@ impl Vm {
|
||||
}
|
||||
|
||||
pub(crate) fn dispatch_store_var(&mut self, rd: usize, a: usize, b: usize) -> Result<bool, String> {
|
||||
vm_trace!("STORE_VAR r{}={:?} const={}", rd, self.regs[a], b);
|
||||
if b != 0 {
|
||||
// const guard: check if already initialized
|
||||
if !self.regs[rd].is_undefined() {
|
||||
@@ -71,6 +77,7 @@ impl Vm {
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn dispatch_new_object(&mut self, rd: usize) {
|
||||
vm_trace!("NEW_OBJECT rd={}", rd);
|
||||
let proto_ptr = &*self.object_prototype as *const JsObject as *mut JsObject;
|
||||
let obj = self
|
||||
.epoch
|
||||
@@ -80,8 +87,9 @@ impl Vm {
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn dispatch_new_array(&mut self, rd: usize, instr: u32) {
|
||||
let proto_ptr = self.session.builtin_world().array_proto.as_ptr() as *mut JsObject;
|
||||
let n = opcode::imm16(instr) as usize;
|
||||
vm_trace!("NEW_ARRAY rd={} n={}", rd, n);
|
||||
let proto_ptr = self.session.builtin_world().array_proto.as_ptr() as *mut JsObject;
|
||||
let bump = self.epoch.bump();
|
||||
let obj = self.alloc_object(JsObject::new_array(EMPTY_SHAPE_ID, JsValue::from_js_object(proto_ptr), n, bump));
|
||||
self.regs[rd] = JsValue::object(obj as *mut u8);
|
||||
@@ -89,6 +97,7 @@ impl Vm {
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn dispatch_void(&mut self, rd: usize) {
|
||||
vm_trace!("VOID rd={}", rd);
|
||||
self.regs[rd] = JsValue::undefined();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user