moduforge_rules_expression/vm/
vm.rs

1//! 虚拟机核心实现
2//!
3//! 实现基于栈的虚拟机,用于执行编译器生成的操作码。
4//! 支持变量操作、函数调用、控制流、算术运算等完整的表达式执行功能。
5
6use crate::compiler::{Compare, FetchFastTarget, Jump, Opcode};
7use crate::functions::arguments::Arguments;
8use crate::functions::registry::FunctionRegistry;
9use crate::functions::{internal, MethodRegistry};
10use crate::variable::Variable;
11use crate::variable::Variable::*;
12use crate::vm::error::VMError::*;
13use crate::vm::error::VMResult;
14use crate::vm::interval::{VmInterval, VmIntervalData};
15use ahash::{HashMap, HashMapExt};
16use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
17use rust_decimal::{Decimal, MathematicalOps};
18use std::rc::Rc;
19use std::string::String as StdString;
20
21/// 作用域结构
22///
23/// 用于闭包函数执行时的作用域管理,保存数组迭代状态
24#[derive(Debug)]
25pub struct Scope {
26    /// 当前迭代的数组
27    array: Variable,
28    /// 数组长度
29    len: usize,
30    /// 当前迭代位置
31    iter: usize,
32    /// 满足条件的元素计数
33    count: usize,
34}
35
36/// 虚拟机主结构
37///
38/// 基于栈的虚拟机实现,负责执行操作码序列
39#[derive(Debug)]
40pub struct VM {
41    /// 作用域栈:用于嵌套作用域管理
42    scopes: Vec<Scope>,
43    /// 操作数栈:存储运算过程中的中间值
44    stack: Vec<Variable>,
45}
46
47impl VM {
48    /// 创建新的虚拟机实例
49    ///
50    /// 初始化空的作用域栈和操作数栈
51    pub fn new() -> Self {
52        Self { scopes: Default::default(), stack: Default::default() }
53    }
54
55    /// 运行字节码
56    ///
57    /// 清空栈状态并执行给定的操作码序列
58    ///
59    /// # 参数
60    /// * `bytecode` - 要执行的操作码数组
61    /// * `env` - 执行环境变量
62    ///
63    /// # 返回值
64    /// * `VMResult<Variable>` - 执行结果或错误
65    pub fn run(
66        &mut self,
67        bytecode: &[Opcode],
68        env: Variable,
69    ) -> VMResult<Variable> {
70        self.stack.clear();
71        self.scopes.clear();
72
73        let s =
74            VMInner::new(bytecode, &mut self.stack, &mut self.scopes).run(env);
75        Ok(s?)
76    }
77}
78
79/// 虚拟机内部执行器
80///
81/// 实际的字节码执行逻辑,管理程序计数器和栈操作
82struct VMInner<'parent_ref, 'bytecode_ref> {
83    /// 作用域栈引用
84    scopes: &'parent_ref mut Vec<Scope>,
85    /// 操作数栈引用
86    stack: &'parent_ref mut Vec<Variable>,
87    /// 字节码数组引用
88    bytecode: &'bytecode_ref [Opcode],
89    /// 程序计数器:指向当前执行的操作码位置
90    ip: u32,
91}
92
93impl<'arena, 'parent_ref, 'bytecode_ref> VMInner<'parent_ref, 'bytecode_ref> {
94    /// 创建新的虚拟机内部执行器
95    ///
96    /// # 参数
97    /// * `bytecode` - 字节码数组
98    /// * `stack` - 操作数栈
99    /// * `scopes` - 作用域栈
100    pub fn new(
101        bytecode: &'bytecode_ref [Opcode],
102        stack: &'parent_ref mut Vec<Variable>,
103        scopes: &'parent_ref mut Vec<Scope>,
104    ) -> Self {
105        Self { ip: 0, scopes, stack, bytecode }
106    }
107
108    /// 向栈中压入值
109    ///
110    /// # 参数
111    /// * `var` - 要压入的变量
112    fn push(
113        &mut self,
114        var: Variable,
115    ) {
116        self.stack.push(var);
117    }
118
119    /// 从栈中弹出值
120    ///
121    /// # 返回值
122    /// * `VMResult<Variable>` - 弹出的变量或栈为空的错误
123    fn pop(&mut self) -> VMResult<Variable> {
124        self.stack.pop().ok_or_else(|| StackOutOfBounds {
125            stack: format!("{:?}", self.stack),
126        })
127    }
128
129    /// 执行字节码
130    ///
131    /// 主执行循环,逐个处理操作码直到程序结束
132    ///
133    /// # 参数
134    /// * `env` - 执行环境变量
135    ///
136    /// # 返回值
137    /// * `VMResult<Variable>` - 执行结果或错误
138    pub fn run(
139        &mut self,
140        env: Variable,
141    ) -> VMResult<Variable> {
142        if self.ip != 0 {
143            self.ip = 0;
144        }
145
146        while self.ip < self.bytecode.len() as u32 {
147            let op = self.bytecode.get(self.ip as usize).ok_or_else(|| {
148                OpcodeOutOfBounds {
149                    bytecode: format!("{:?}", self.bytecode),
150                    index: self.ip as usize,
151                }
152            })?;
153
154            self.ip += 1;
155
156            match op {
157                // 基本值压栈操作
158                // 压入空值
159                Opcode::PushNull => self.push(Null),
160                // 压入布尔值
161                Opcode::PushBool(b) => self.push(Bool(*b)),
162                // 压入数字
163                Opcode::PushNumber(n) => self.push(Number(*n)),
164                // 压入字符串
165                Opcode::PushString(s) => {
166                    self.push(String(Rc::from(s.as_ref())))
167                },
168                // 弹出栈顶值(丢弃)
169                Opcode::Pop => {
170                    self.pop()?;
171                },
172
173                // 变量访问操作
174                // 通用属性访问:object[key] 或 array[index]
175                Opcode::Fetch => {
176                    let b = self.pop()?; // 索引或键
177                    let a = self.pop()?; // 对象或数组
178
179                    match (a, b) {
180                        // 对象属性访问
181                        (Object(o), String(s)) => {
182                            let obj = o.borrow();
183                            self.push(
184                                obj.get(s.as_ref()).cloned().unwrap_or(Null),
185                            );
186                        },
187                        // 数组索引访问
188                        (Array(a), Number(n)) => {
189                            let arr = a.borrow();
190                            self.push(
191                                arr.get(n.to_usize().ok_or_else(|| {
192                                    OpcodeErr {
193                                        opcode: "Fetch".into(),
194                                        message: "转换为 usize 失败".into(),
195                                    }
196                                })?)
197                                .cloned()
198                                .unwrap_or(Null),
199                            )
200                        },
201                        // 字符串字符访问
202                        (String(str), Number(n)) => {
203                            let index =
204                                n.to_usize().ok_or_else(|| OpcodeErr {
205                                    opcode: "Fetch".into(),
206                                    message: "转换为 usize 失败".into(),
207                                })?;
208
209                            if let Some(slice) = str.get(index..index + 1) {
210                                self.push(String(Rc::from(slice)));
211                            } else {
212                                self.push(Null)
213                            };
214                        },
215                        _ => self.push(Null),
216                    }
217                },
218
219                // 快速路径访问:优化的属性访问
220                Opcode::FetchFast(path) => {
221                    let variable = path.iter().fold(Null, |v, p| match p {
222                        FetchFastTarget::Root => env.clone(),
223                        FetchFastTarget::String(key) => match v {
224                            Object(obj) => {
225                                let obj_ref = obj.borrow();
226                                obj_ref
227                                    .get(key.as_ref())
228                                    .cloned()
229                                    .unwrap_or(Null)
230                            },
231                            _ => Null,
232                        },
233                        FetchFastTarget::Number(num) => match v {
234                            Array(arr) => {
235                                let arr_ref = arr.borrow();
236                                arr_ref
237                                    .get(*num as usize)
238                                    .cloned()
239                                    .unwrap_or(Null)
240                            },
241                            _ => Null,
242                        },
243                    });
244
245                    self.push(variable);
246                },
247
248                // 获取环境变量
249                Opcode::FetchEnv(f) => match &env {
250                    Object(o) => {
251                        let obj = o.borrow();
252                        match obj.get(f.as_ref()) {
253                            None => self.push(Null),
254                            Some(v) => self.push(v.clone()),
255                        }
256                    },
257                    Null => self.push(Null),
258                    _ => {
259                        return Err(OpcodeErr {
260                            opcode: "FetchEnv".into(),
261                            message: "不支持的类型".into(),
262                        });
263                    },
264                },
265
266                // 获取根环境
267                Opcode::FetchRootEnv => {
268                    self.push(env.clone());
269                },
270
271                // 一元运算操作
272                // 数字取负
273                Opcode::Negate => {
274                    let a = self.pop()?;
275                    match a {
276                        Number(n) => {
277                            self.push(Number(-n));
278                        },
279                        _ => {
280                            return Err(OpcodeErr {
281                                opcode: "Negate".into(),
282                                message: "不支持的类型".into(),
283                            });
284                        },
285                    }
286                },
287
288                // 逻辑非
289                Opcode::Not => {
290                    let a = self.pop()?;
291                    match a {
292                        Bool(b) => self.push(Bool(!b)),
293                        _ => {
294                            return Err(OpcodeErr {
295                                opcode: "Not".into(),
296                                message: "不支持的类型".into(),
297                            });
298                        },
299                    }
300                },
301
302                // 比较运算操作
303                // 相等比较
304                Opcode::Equal => {
305                    let b = self.pop()?;
306                    let a = self.pop()?;
307                    match (a, b) {
308                        // 数字相等比较
309                        (Number(a), Number(b)) => {
310                            self.push(Bool(a == b));
311                        },
312                        // 布尔值相等比较
313                        (Bool(a), Bool(b)) => {
314                            self.push(Bool(a == b));
315                        },
316                        // 字符串相等比较
317                        (String(a), String(b)) => {
318                            self.push(Bool(a == b));
319                        },
320                        // 空值相等比较
321                        (Null, Null) => {
322                            self.push(Bool(true));
323                        },
324                        // 动态类型(日期)相等比较
325                        (Dynamic(a), Dynamic(b)) => {
326                            let a = a.as_date();
327                            let b = b.as_date();
328
329                            self.push(Bool(
330                                a.is_some() && b.is_some() && a == b,
331                            ));
332                        },
333                        // 不同类型不相等
334                        _ => {
335                            self.push(Bool(false));
336                        },
337                    }
338                },
339
340                // 控制流操作
341                // 跳转指令:根据不同条件执行跳转
342                Opcode::Jump(kind, j) => match kind {
343                    // 无条件向前跳转
344                    Jump::Forward => self.ip += j,
345                    // 无条件向后跳转
346                    Jump::Backward => self.ip -= j,
347                    // 条件跳转:栈顶值为true时跳转
348                    Jump::IfTrue => {
349                        let a = self.stack.last().ok_or_else(|| OpcodeErr {
350                            opcode: "JumpIfTrue".into(),
351                            message: "未定义的对象键".into(),
352                        })?;
353                        match a {
354                            Bool(a) => {
355                                if *a {
356                                    self.ip += j;
357                                }
358                            },
359                            _ => {
360                                return Err(OpcodeErr {
361                                    opcode: "JumpIfTrue".into(),
362                                    message: "Unsupported type".into(),
363                                });
364                            },
365                        }
366                    },
367                    // 条件跳转:栈顶值为false时跳转
368                    Jump::IfFalse => {
369                        let a = self.stack.last().ok_or_else(|| OpcodeErr {
370                            opcode: "JumpIfFalse".into(),
371                            message: "空数组".into(),
372                        })?;
373
374                        match a {
375                            Bool(a) => {
376                                if !*a {
377                                    self.ip += j;
378                                }
379                            },
380                            _ => {
381                                return Err(OpcodeErr {
382                                    opcode: "JumpIfFalse".into(),
383                                    message: "不支持的类型".into(),
384                                });
385                            },
386                        }
387                    },
388                    // 条件跳转:栈顶值不为null时跳转
389                    Jump::IfNotNull => {
390                        let a = self.stack.last().ok_or_else(|| OpcodeErr {
391                            opcode: "JumpIfNull".into(),
392                            message: "空数组".into(),
393                        })?;
394
395                        match a {
396                            Null => {},
397                            _ => {
398                                self.ip += j;
399                            },
400                        }
401                    },
402                    // 条件跳转:迭代结束时跳转
403                    Jump::IfEnd => {
404                        let scope =
405                            self.scopes.last().ok_or_else(|| OpcodeErr {
406                                opcode: "JumpIfEnd".into(),
407                                message: "空栈".into(),
408                            })?;
409
410                        if scope.iter >= scope.len {
411                            self.ip += j;
412                        }
413                    },
414                },
415
416                // 成员关系操作
417                // 包含检查:检查元素是否在集合或区间中
418                Opcode::In => {
419                    let b = self.pop()?; // 容器(数组或区间)
420                    let a = self.pop()?; // 要检查的元素
421
422                    match (a, &b) {
423                        // 检查数字是否在数组中
424                        (Number(a), Array(b)) => {
425                            let arr = b.borrow();
426                            let is_in = arr.iter().any(|b| match b {
427                                Number(b) => a == *b,
428                                _ => false,
429                            });
430
431                            self.push(Bool(is_in));
432                        },
433                        // 检查数字是否在区间中
434                        (Number(v), Dynamic(d)) => {
435                            let Some(i) =
436                                d.as_any().downcast_ref::<VmInterval>()
437                            else {
438                                return Err(OpcodeErr {
439                                    opcode: "In".into(),
440                                    message: "不支持的类型".into(),
441                                });
442                            };
443
444                            self.push(Bool(
445                                i.includes(VmIntervalData::Number(v)).map_err(
446                                    |err| OpcodeErr {
447                                        opcode: "In".into(),
448                                        message: err.to_string(),
449                                    },
450                                )?,
451                            ));
452                        },
453                        (Dynamic(d), Dynamic(i)) => {
454                            let Some(d) = d.as_date() else {
455                                return Err(OpcodeErr {
456                                    opcode: "In".into(),
457                                    message: "不支持的类型".into(),
458                                });
459                            };
460
461                            let Some(i) =
462                                i.as_any().downcast_ref::<VmInterval>()
463                            else {
464                                return Err(OpcodeErr {
465                                    opcode: "In".into(),
466                                    message: "不支持的类型".into(),
467                                });
468                            };
469
470                            self.push(Bool(
471                                i.includes(VmIntervalData::Date(d.clone()))
472                                    .map_err(|err| OpcodeErr {
473                                        opcode: "In".into(),
474                                        message: err.to_string(),
475                                    })?,
476                            ));
477                        },
478                        (Dynamic(a), Array(arr)) => {
479                            let Some(a) = a.as_date() else {
480                                return Err(OpcodeErr {
481                                    opcode: "In".into(),
482                                    message: "不支持的类型".into(),
483                                });
484                            };
485
486                            let arr = arr.borrow();
487                            let is_in = arr.iter().any(|b| match b {
488                                Dynamic(b) => Some(a) == b.as_date(),
489                                _ => false,
490                            });
491
492                            self.push(Bool(is_in));
493                        },
494                        (String(a), Array(b)) => {
495                            let arr = b.borrow();
496                            let is_in = arr.iter().any(|b| match b {
497                                String(b) => &a == b,
498                                _ => false,
499                            });
500
501                            self.push(Bool(is_in));
502                        },
503                        (String(a), Object(b)) => {
504                            let obj = b.borrow();
505                            self.push(Bool(obj.contains_key(a.as_ref())));
506                        },
507                        (Bool(a), Array(b)) => {
508                            let arr = b.borrow();
509                            let is_in = arr.iter().any(|b| match b {
510                                Bool(b) => a == *b,
511                                _ => false,
512                            });
513
514                            self.push(Bool(is_in));
515                        },
516                        (Null, Array(b)) => {
517                            let arr = b.borrow();
518                            let is_in = arr.iter().any(|b| match b {
519                                Null => true,
520                                _ => false,
521                            });
522
523                            self.push(Bool(is_in));
524                        },
525                        _ => {
526                            return Err(OpcodeErr {
527                                opcode: "In".into(),
528                                message: "不支持的类型".into(),
529                            });
530                        },
531                    }
532                },
533                Opcode::Compare(comparison) => {
534                    let b = self.pop()?;
535                    let a = self.pop()?;
536
537                    fn compare<T: Ord>(
538                        a: &T,
539                        b: &T,
540                        comparison: &Compare,
541                    ) -> bool {
542                        match comparison {
543                            Compare::More => a > b,
544                            Compare::MoreOrEqual => a >= b,
545                            Compare::Less => a < b,
546                            Compare::LessOrEqual => a <= b,
547                        }
548                    }
549
550                    match (a, b) {
551                        (Number(a), Number(b)) => {
552                            self.push(Bool(compare(&a, &b, comparison)))
553                        },
554                        (Dynamic(a), Dynamic(b)) => {
555                            let (a, b) = match (a.as_date(), b.as_date()) {
556                                (Some(a), Some(b)) => (a, b),
557                                _ => {
558                                    return Err(OpcodeErr {
559                                        opcode: "Compare".into(),
560                                        message: "不支持的类型".into(),
561                                    });
562                                },
563                            };
564
565                            self.push(Bool(compare(a, b, comparison)));
566                        },
567                        _ => {
568                            return Err(OpcodeErr {
569                                opcode: "Compare".into(),
570                                message: "不支持的类型".into(),
571                            });
572                        },
573                    }
574                },
575                Opcode::Add => {
576                    let b = self.pop()?;
577                    let a = self.pop()?;
578
579                    match (a, b) {
580                        (Number(a), Number(b)) => self.push(Number(a + b)),
581                        (String(a), String(b)) => {
582                            let mut c =
583                                StdString::with_capacity(a.len() + b.len());
584
585                            c.push_str(a.as_ref());
586                            c.push_str(b.as_ref());
587
588                            self.push(String(Rc::from(c.as_str())));
589                        },
590                        _ => {
591                            return Err(OpcodeErr {
592                                opcode: "Add".into(),
593                                message: "不支持的类型".into(),
594                            });
595                        },
596                    }
597                },
598                Opcode::Subtract => {
599                    let b = self.pop()?;
600                    let a = self.pop()?;
601
602                    match (a, b) {
603                        (Number(a), Number(b)) => self.push(Number(a - b)),
604                        _ => {
605                            return Err(OpcodeErr {
606                                opcode: "Subtract".into(),
607                                message: "不支持的类型".into(),
608                            });
609                        },
610                    }
611                },
612                Opcode::Multiply => {
613                    let b = self.pop()?;
614                    let a = self.pop()?;
615
616                    match (a, b) {
617                        (Number(a), Number(b)) => self.push(Number(a * b)),
618                        _ => {
619                            return Err(OpcodeErr {
620                                opcode: "Multiply".into(),
621                                message: "不支持的类型".into(),
622                            });
623                        },
624                    }
625                },
626                Opcode::Divide => {
627                    let b = self.pop()?;
628                    let a = self.pop()?;
629
630                    match (a, b) {
631                        (Number(a), Number(b)) => self.push(Number(a / b)),
632                        _ => {
633                            return Err(OpcodeErr {
634                                opcode: "Divide".into(),
635                                message: "不支持的类型".into(),
636                            });
637                        },
638                    }
639                },
640                Opcode::Modulo => {
641                    let b = self.pop()?;
642                    let a = self.pop()?;
643
644                    match (a, b) {
645                        (Number(a), Number(b)) => self.push(Number(a % b)),
646                        _ => {
647                            return Err(OpcodeErr {
648                                opcode: "Modulo".into(),
649                                message: "不支持的类型".into(),
650                            });
651                        },
652                    }
653                },
654                Opcode::Exponent => {
655                    let b = self.pop()?;
656                    let a = self.pop()?;
657
658                    match (a, b) {
659                        (Number(a), Number(b)) => {
660                            let result = a
661                                .checked_powd(b)
662                                .or_else(|| {
663                                    Decimal::from_f64(
664                                        a.to_f64()?.powf(b.to_f64()?),
665                                    )
666                                })
667                                .ok_or_else(|| OpcodeErr {
668                                    opcode: "Exponent".into(),
669                                    message: "计算指数失败".into(),
670                                })?;
671
672                            self.push(Number(result));
673                        },
674                        _ => {
675                            return Err(OpcodeErr {
676                                opcode: "Exponent".into(),
677                                message: "不支持的类型".into(),
678                            });
679                        },
680                    }
681                },
682                Opcode::Interval { left_bracket, right_bracket } => {
683                    let b = self.pop()?;
684                    let a = self.pop()?;
685
686                    match (&a, &b) {
687                        (Number(a), Number(b)) => {
688                            let interval = VmInterval {
689                                left_bracket: *left_bracket,
690                                right_bracket: *right_bracket,
691                                left: VmIntervalData::Number(*a),
692                                right: VmIntervalData::Number(*b),
693                            };
694
695                            self.push(Dynamic(Rc::new(interval)));
696                        },
697                        (Dynamic(a), Dynamic(b)) => {
698                            let (a, b) = match (a.as_date(), b.as_date()) {
699                                (Some(a), Some(b)) => (a, b),
700                                _ => {
701                                    return Err(OpcodeErr {
702                                        opcode: "Interval".into(),
703                                        message: "不支持的类型".into(),
704                                    });
705                                },
706                            };
707
708                            let interval = VmInterval {
709                                left_bracket: *left_bracket,
710                                right_bracket: *right_bracket,
711                                left: VmIntervalData::Date(a.clone()),
712                                right: VmIntervalData::Date(b.clone()),
713                            };
714
715                            self.push(Dynamic(Rc::new(interval)));
716                        },
717                        _ => {
718                            return Err(OpcodeErr {
719                                opcode: "Interval".into(),
720                                message: "不支持的类型".into(),
721                            });
722                        },
723                    }
724                },
725                Opcode::Join => {
726                    let b = self.pop()?;
727                    let a = self.pop()?;
728
729                    let (Array(a), String(separator)) = (a, &b) else {
730                        return Err(OpcodeErr {
731                            opcode: "Join".into(),
732                            message: "不支持的类型".into(),
733                        });
734                    };
735
736                    let arr = a.borrow();
737                    let parts = arr
738                        .iter()
739                        .enumerate()
740                        .map(|(i, var)| match var {
741                            String(str) => Ok(str.clone()),
742                            _ => Err(OpcodeErr {
743                                opcode: "Join".into(),
744                                message: format!("数组中索引 {i} 的类型不支持"),
745                            }),
746                        })
747                        .collect::<Result<Vec<_>, _>>()?;
748
749                    let str_capacity = parts
750                        .iter()
751                        .fold(separator.len() * (parts.len() - 1), |acc, s| {
752                            acc + s.len()
753                        });
754
755                    let mut s = StdString::with_capacity(str_capacity);
756                    let mut it = parts.into_iter().peekable();
757                    while let Some(part) = it.next() {
758                        s.push_str(part.as_ref());
759                        if it.peek().is_some() {
760                            s.push_str(separator);
761                        }
762                    }
763
764                    self.push(String(Rc::from(s)));
765                },
766                Opcode::Slice => {
767                    let from_var = self.pop()?;
768                    let to_var = self.pop()?;
769                    let current = self.pop()?;
770
771                    match (from_var, to_var) {
772                        (Number(f), Number(t)) => {
773                            let from =
774                                f.to_usize().ok_or_else(|| OpcodeErr {
775                                    opcode: "Slice".into(),
776                                    message: "获取范围失败".into(),
777                                })?;
778                            let to = t.to_usize().ok_or_else(|| OpcodeErr {
779                                opcode: "Slice".into(),
780                                message: "获取范围失败".into(),
781                            })?;
782
783                            match current {
784                                Array(a) => {
785                                    let arr = a.borrow();
786                                    let slice = arr.get(from..=to).ok_or_else(
787                                        || OpcodeErr {
788                                            opcode: "Slice".into(),
789                                            message: "索引超出范围".into(),
790                                        },
791                                    )?;
792
793                                    self.push(Variable::from_array(
794                                        slice.to_vec(),
795                                    ));
796                                },
797                                String(s) => {
798                                    let slice =
799                                        s.get(from..=to).ok_or_else(|| {
800                                            OpcodeErr {
801                                                opcode: "Slice".into(),
802                                                message: "索引超出范围".into(),
803                                            }
804                                        })?;
805
806                                    self.push(String(Rc::from(slice)));
807                                },
808                                _ => {
809                                    return Err(OpcodeErr {
810                                        opcode: "Slice".into(),
811                                        message: "不支持的类型".into(),
812                                    });
813                                },
814                            }
815                        },
816                        _ => {
817                            return Err(OpcodeErr {
818                                opcode: "Slice".into(),
819                                message: "不支持的类型".into(),
820                            });
821                        },
822                    }
823                },
824                Opcode::Array => {
825                    let size = self.pop()?;
826                    let Number(s) = size else {
827                        return Err(OpcodeErr {
828                            opcode: "Array".into(),
829                            message: "不支持的类型".into(),
830                        });
831                    };
832
833                    let to = s.round().to_usize().ok_or_else(|| OpcodeErr {
834                        opcode: "Array".into(),
835                        message: "提取参数失败".into(),
836                    })?;
837
838                    let mut arr = Vec::with_capacity(to);
839                    for _ in 0..to {
840                        arr.push(self.pop()?);
841                    }
842                    arr.reverse();
843
844                    self.push(Variable::from_array(arr));
845                },
846                Opcode::Object => {
847                    let size = self.pop()?;
848                    let Number(s) = size else {
849                        return Err(OpcodeErr {
850                            opcode: "Array".into(),
851                            message: "不支持的类型".into(),
852                        });
853                    };
854
855                    let to = s.round().to_usize().ok_or_else(|| OpcodeErr {
856                        opcode: "Array".into(),
857                        message: "提取参数失败".into(),
858                    })?;
859
860                    let mut map = HashMap::with_capacity(to);
861                    for _ in 0..to {
862                        let value = self.pop()?;
863                        let String(key) = self.pop()? else {
864                            return Err(OpcodeErr {
865                                opcode: "Object".into(),
866                                message: "意外的键值".to_string(),
867                            });
868                        };
869
870                        map.insert(key.clone(), value);
871                    }
872
873                    self.push(Variable::from_object(map));
874                },
875                Opcode::Len => {
876                    let current =
877                        self.stack.last().ok_or_else(|| OpcodeErr {
878                            opcode: "Len".into(),
879                            message: "空栈".into(),
880                        })?;
881
882                    let len_var =
883                        internal::imp::len(Arguments(&[current.clone()]))
884                            .map_err(|err| OpcodeErr {
885                                opcode: "Len".into(),
886                                message: err.to_string(),
887                            })?;
888
889                    self.push(len_var);
890                },
891                Opcode::Flatten => {
892                    let current = self.pop()?;
893                    let Array(a) = current else {
894                        return Err(OpcodeErr {
895                            opcode: "Flatten".into(),
896                            message: "不支持的类型".into(),
897                        });
898                    };
899
900                    let arr = a.borrow();
901
902                    let mut flat_arr = Vec::with_capacity(arr.len());
903                    arr.iter().for_each(|v| match v {
904                        Array(b) => {
905                            let arr = b.borrow();
906                            arr.iter().for_each(|v| flat_arr.push(v.clone()))
907                        },
908                        _ => flat_arr.push(v.clone()),
909                    });
910
911                    self.push(Variable::from_array(flat_arr));
912                },
913                Opcode::IncrementIt => {
914                    let scope =
915                        self.scopes.last_mut().ok_or_else(|| OpcodeErr {
916                            opcode: "IncrementIt".into(),
917                            message: "空作用域".into(),
918                        })?;
919
920                    scope.iter += 1;
921                },
922                Opcode::IncrementCount => {
923                    let scope =
924                        self.scopes.last_mut().ok_or_else(|| OpcodeErr {
925                            opcode: "IncrementCount".into(),
926                            message: "空作用域".into(),
927                        })?;
928
929                    scope.count += 1;
930                },
931                Opcode::GetCount => {
932                    let scope =
933                        self.scopes.last().ok_or_else(|| OpcodeErr {
934                            opcode: "GetCount".into(),
935                            message: "空作用域".into(),
936                        })?;
937
938                    self.push(Number(scope.count.into()));
939                },
940                Opcode::GetLen => {
941                    let scope =
942                        self.scopes.last().ok_or_else(|| OpcodeErr {
943                            opcode: "GetLen".into(),
944                            message: "空作用域".into(),
945                        })?;
946
947                    self.push(Number(scope.len.into()));
948                },
949                Opcode::Pointer => {
950                    let scope =
951                        self.scopes.last().ok_or_else(|| OpcodeErr {
952                            opcode: "Pointer".into(),
953                            message: "空作用域".into(),
954                        })?;
955
956                    match &scope.array {
957                        Array(a) => {
958                            let a_cloned = a.clone();
959                            let arr = a_cloned.borrow();
960                            let variable = arr
961                                .get(scope.iter)
962                                .cloned()
963                                .ok_or_else(|| OpcodeErr {
964                                    opcode: "Pointer".into(),
965                                    message: "作用域数组超出范围".into(),
966                                })?;
967
968                            self.push(variable);
969                        },
970                        _ => {
971                            return Err(OpcodeErr {
972                                opcode: "Pointer".into(),
973                                message: "不支持的作用域类型".into(),
974                            });
975                        },
976                    }
977                },
978                Opcode::Begin => {
979                    let var = self.pop()?;
980                    let maybe_scope = match &var {
981                        Array(a) => {
982                            let arr = a.borrow();
983                            Some(Scope {
984                                len: arr.len(),
985                                array: var.clone(),
986                                count: 0,
987                                iter: 0,
988                            })
989                        },
990                        _ => match var
991                            .dynamic::<VmInterval>()
992                            .map(|s| s.to_array())
993                            .flatten()
994                        {
995                            None => None,
996                            Some(arr) => Some(Scope {
997                                len: arr.len(),
998                                array: Variable::from_array(arr),
999                                count: 0,
1000                                iter: 0,
1001                            }),
1002                        },
1003                    };
1004
1005                    let Some(scope) = maybe_scope else {
1006                        return Err(OpcodeErr {
1007                            opcode: "Begin".into(),
1008                            message: "不支持的类型".into(),
1009                        });
1010                    };
1011
1012                    self.scopes.push(scope);
1013                },
1014                Opcode::End => {
1015                    self.scopes.pop();
1016                },
1017                Opcode::CallFunction { kind, arg_count } => {
1018                    let function = FunctionRegistry::get_definition(kind)
1019                        .ok_or_else(|| OpcodeErr {
1020                            opcode: "CallFunction".into(),
1021                            message: format!("函数 `{kind}` 未找到"),
1022                        })?;
1023
1024                    let params_start =
1025                        self.stack.len().saturating_sub(*arg_count as usize);
1026                    let result = function
1027                        .call(Arguments(&self.stack[params_start..]))
1028                        .map_err(|err| OpcodeErr {
1029                            opcode: "CallFunction".into(),
1030                            message: format!("函数 `{kind}` 调用失败: {err}"),
1031                        })?;
1032
1033                    self.stack.drain(params_start..);
1034                    self.push(result);
1035                },
1036                Opcode::CallMethod { kind, arg_count } => {
1037                    let method = MethodRegistry::get_definition(kind)
1038                        .ok_or_else(|| OpcodeErr {
1039                            opcode: "CallMethod".into(),
1040                            message: format!("方法 `{kind}` 未找到"),
1041                        })?;
1042
1043                    let params_start =
1044                        self.stack.len().saturating_sub(*arg_count as usize)
1045                            - 1;
1046                    let result = method
1047                        .call(Arguments(&self.stack[params_start..]))
1048                        .map_err(|err| OpcodeErr {
1049                            opcode: "CallMethod".into(),
1050                            message: format!("方法 `{kind}` 调用失败: {err}"),
1051                        })?;
1052
1053                    self.stack.drain(params_start..);
1054                    self.push(result);
1055                },
1056            }
1057        }
1058
1059        self.pop()
1060    }
1061}