mf_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}