nu_protocol/engine/
error_handler.rs1use crate::RegId;
2
3#[derive(Debug, Clone, Copy)]
5pub struct ErrorHandler {
6 pub handler_index: usize,
8 pub error_register: Option<RegId>,
10}
11
12#[derive(Debug, Clone, Default)]
14pub struct ErrorHandlerStack {
15 handlers: Vec<ErrorHandler>,
16}
17
18impl ErrorHandlerStack {
19 pub const fn new() -> ErrorHandlerStack {
20 ErrorHandlerStack { handlers: vec![] }
21 }
22
23 pub fn get_base(&self) -> usize {
25 self.handlers.len()
26 }
27
28 pub fn push(&mut self, handler: ErrorHandler) {
30 self.handlers.push(handler);
31 }
32
33 pub fn pop(&mut self, base: usize) -> Option<ErrorHandler> {
36 if self.handlers.len() > base {
37 self.handlers.pop()
38 } else {
39 None
40 }
41 }
42
43 pub fn leave_frame(&mut self, base: usize) {
46 if self.handlers.len() >= base {
47 self.handlers.truncate(base);
48 } else {
49 panic!(
50 "ErrorHandlerStack bug: tried to leave frame at {base}, but current base is {}",
51 self.get_base()
52 )
53 }
54 }
55}