lib_ruby_parser/
max_numparam_stack.rs

1use std::cell::RefCell;
2use std::rc::Rc;
3
4#[derive(Debug, Clone, Default)]
5pub(crate) struct StackItem {
6    pub(crate) value: i32,
7    pub(crate) is_static: bool,
8}
9
10#[derive(Debug, Clone, Default)]
11pub(crate) struct MaxNumparamStack {
12    stack: Rc<RefCell<Vec<StackItem>>>,
13}
14
15impl MaxNumparamStack {
16    const ORDINARY_PARAMS: i32 = -1;
17
18    pub(crate) fn new() -> Self {
19        Self {
20            stack: Rc::new(RefCell::new(vec![])),
21        }
22    }
23
24    pub(crate) fn is_empty(&self) -> bool {
25        self.stack.borrow().is_empty()
26    }
27
28    pub(crate) fn set_has_ordinary_params(&self) {
29        self.set(Self::ORDINARY_PARAMS)
30    }
31
32    pub(crate) fn has_ordinary_params(&self) -> bool {
33        self.top() == Self::ORDINARY_PARAMS
34    }
35
36    pub(crate) fn has_numparams(&self) -> bool {
37        self.top() > 0
38    }
39
40    pub(crate) fn register(&self, numparam: i32) {
41        self.set(std::cmp::max(self.top(), numparam))
42    }
43
44    pub(crate) fn top(&self) -> i32 {
45        if let Some(stack_item) = self.stack.borrow().last() {
46            stack_item.value
47        } else {
48            i32::MIN
49        }
50    }
51
52    pub(crate) fn push(&self, is_static: bool) {
53        self.stack.borrow_mut().push(StackItem {
54            value: 0,
55            is_static,
56        })
57    }
58
59    pub(crate) fn pop(&self) {
60        self.stack.borrow_mut().pop();
61    }
62
63    fn set(&self, value: i32) {
64        let mut stack = self.stack.borrow_mut();
65        let len = stack.len();
66        stack[len - 1].value = value;
67    }
68
69    pub(crate) fn inner_clone(&self) -> Vec<StackItem> {
70        self.stack.borrow().clone()
71    }
72}