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}