|
4 | 4 | use crate::rvm::instructions::{ComprehensionBeginParams, ComprehensionMode}; |
5 | 5 | use crate::value::Object; |
6 | 6 | use crate::value::Value; |
7 | | -use crate::Rc; |
8 | 7 | use alloc::format; |
9 | 8 | use alloc::sync::Arc; |
10 | 9 | use alloc::vec::Vec; |
@@ -34,7 +33,7 @@ impl RegoVM { |
34 | 33 | let initial_result = match params.mode { |
35 | 34 | ComprehensionMode::Set => Value::new_set(), |
36 | 35 | ComprehensionMode::Array => Value::new_array(), |
37 | | - ComprehensionMode::Object => Value::Object(Rc::new(Object::new())), |
| 36 | + ComprehensionMode::Object => Object::new().into_value(), |
38 | 37 | }; |
39 | 38 | self.set_register(params.result_reg, initial_result.clone())?; |
40 | 39 |
|
@@ -121,7 +120,7 @@ impl RegoVM { |
121 | 120 | let initial_result = match params.mode { |
122 | 121 | ComprehensionMode::Set => Value::new_set(), |
123 | 122 | ComprehensionMode::Array => Value::new_array(), |
124 | | - ComprehensionMode::Object => Value::Object(Rc::new(Object::new())), |
| 123 | + ComprehensionMode::Object => Object::new().into_value(), |
125 | 124 | }; |
126 | 125 | self.set_register(params.result_reg, initial_result.clone())?; |
127 | 126 |
|
@@ -589,15 +588,17 @@ impl RegoVM { |
589 | 588 | // `ComprehensionEnd` is reached from a loaded program; an empty stack |
590 | 589 | // here means malformed user-supplied bytecode, which must still surface |
591 | 590 | // as a typed error rather than a panic — including in debug builds. |
592 | | - self.comprehension_stack.pop().map_or_else( |
593 | | - || { |
594 | | - Err(VmError::InvalidIteration { |
595 | | - value: Value::String(Arc::from("No active comprehension context")), |
596 | | - pc: self.pc, |
597 | | - }) |
598 | | - }, |
599 | | - |_context| Ok(()), |
600 | | - ) |
| 591 | + let context = self |
| 592 | + .comprehension_stack |
| 593 | + .pop() |
| 594 | + .ok_or_else(|| VmError::InvalidIteration { |
| 595 | + value: Value::String(Arc::from("No active comprehension context")), |
| 596 | + pc: self.pc, |
| 597 | + })?; |
| 598 | + let mut value = self.take_register(context.result_reg)?; |
| 599 | + value.freeze_recursive(); |
| 600 | + self.set_register(context.result_reg, value)?; |
| 601 | + Ok(()) |
601 | 602 | } |
602 | 603 |
|
603 | 604 | fn execute_comprehension_end_suspendable(&mut self) -> Result<()> { |
@@ -628,6 +629,9 @@ impl RegoVM { |
628 | 629 | return_pc: _, |
629 | 630 | context, |
630 | 631 | } => { |
| 632 | + let mut value = self.take_register(context.result_reg)?; |
| 633 | + value.freeze_recursive(); |
| 634 | + self.set_register(context.result_reg, value)?; |
631 | 635 | let raw_target = context.resume_pc; |
632 | 636 | let resume_pc = if raw_target <= self.pc { |
633 | 637 | self.pc.saturating_add(1) |
|
0 commit comments