Add dvm_panic macro for dumping state before panic call.
This commit is contained in:
parent
5322e441c5
commit
258fe824bd
@ -119,10 +119,11 @@ impl DvmState {
|
||||
}
|
||||
|
||||
macro_rules! dump_state {
|
||||
( $message: expr, $state: expr ) => {
|
||||
println!("----");
|
||||
println!("{}", $message);
|
||||
println!("----");
|
||||
( $state: expr ) => {
|
||||
println!("Registers: ");
|
||||
for (i, register) in $state.registers.iter().enumerate() {
|
||||
println!(" r{}: {:?}", i, register);
|
||||
}
|
||||
|
||||
println!("Call stack:");
|
||||
for call_frame in &$state.call_stack {
|
||||
@ -135,13 +136,19 @@ macro_rules! dump_state {
|
||||
}
|
||||
}
|
||||
}
|
||||
println!("Registers: ");
|
||||
for (i, register) in $state.registers.iter().enumerate() {
|
||||
println!(" r{}: {:?}", i, register);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! dvm_panic {
|
||||
( $message: expr, $state: expr ) => {{
|
||||
println!("----");
|
||||
println!("Dvm panic: {}", $message);
|
||||
println!("----");
|
||||
dump_state!($state);
|
||||
panic!();
|
||||
}};
|
||||
}
|
||||
|
||||
pub fn call_fn(
|
||||
state: &mut DvmState,
|
||||
context: &DvmContext,
|
||||
@ -250,26 +257,6 @@ macro_rules! read_string {
|
||||
}};
|
||||
}
|
||||
|
||||
macro_rules! write_string {
|
||||
( $raw_ptr: expr, $s: expr ) => {
|
||||
for (i, b) in $s.bytes().enumerate() {
|
||||
unsafe {
|
||||
$raw_ptr.add(i).write(b);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! write_bytes {
|
||||
( $ptr: expr, $offset: expr, $src: expr ) => {
|
||||
for (i, &b) in $src.iter().enumerate() {
|
||||
unsafe {
|
||||
$ptr.add($offset + i).write(b);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pub fn run_byte_code(state: &mut DvmState, context: &DvmContext, byte_code: &[u8]) {
|
||||
let mut iter = byte_code.iter().cloned();
|
||||
while let Some(op_code) = iter.next() {
|
||||
@ -339,7 +326,9 @@ pub fn run_byte_code(state: &mut DvmState, context: &DvmContext, byte_code: &[u8
|
||||
.iter()
|
||||
.find(|implementation| implementation.fqn == impl_name)
|
||||
})
|
||||
.expect(&format!("Implementation not found: {}", impl_name));
|
||||
.unwrap_or_else(|| {
|
||||
dvm_panic!(&format!("Implementation not found: {}", impl_name), state)
|
||||
});
|
||||
|
||||
let dm_alloc_object = DvmObject::new(implementation.clone());
|
||||
state.registers[target_register] = DvmValue::Object(Rc::new(dm_alloc_object));
|
||||
@ -363,7 +352,10 @@ pub fn run_byte_code(state: &mut DvmState, context: &DvmContext, byte_code: &[u8
|
||||
|
||||
// Get constant
|
||||
let Some(lib) = context.libs.iter().find(|lib| lib.name == lib_name) else {
|
||||
panic!("Could not find lib with name: {}", lib_name);
|
||||
dvm_panic!(
|
||||
&format!("Could not find lib with name: {}", lib_name),
|
||||
state
|
||||
);
|
||||
};
|
||||
let constant = lib.constants.get(const_id).unwrap();
|
||||
let DmConstant::String(s) = constant;
|
||||
@ -455,7 +447,12 @@ pub fn run_byte_code(state: &mut DvmState, context: &DvmContext, byte_code: &[u8
|
||||
let method = self_obj
|
||||
.implementation()
|
||||
.get_method(&symbol_name, &self_obj)
|
||||
.expect(&format!("Could not find method: {}", symbol_name));
|
||||
.unwrap_or_else(|| {
|
||||
dvm_panic!(
|
||||
&format!("Could not find method with name: {}", symbol_name),
|
||||
state
|
||||
);
|
||||
});
|
||||
let dm_fn = method.dm_fn();
|
||||
|
||||
let call_result = call_fn(state, context, &dm_fn, args);
|
||||
@ -468,7 +465,10 @@ pub fn run_byte_code(state: &mut DvmState, context: &DvmContext, byte_code: &[u8
|
||||
todo!()
|
||||
}
|
||||
op_code => {
|
||||
panic!("Invalid op_code: {}", op_code);
|
||||
dvm_panic!(
|
||||
&format!("Unimplemented or unknown op code: {}", op_code),
|
||||
state
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user