summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2023-12-31 19:34:40 -0800
committerJesse Morgan <jesse@jesterpm.net>2023-12-31 19:34:40 -0800
commit76420739e01cb925eca57845bb4704e97d6c816a (patch)
tree893e2d9b6ecc8809f462302f10b345076751ab78 /src
parent72c54d3d6aefa7cd24501d6e8ee60350d7c73f5a (diff)
Add InvokeGenerator impl
Diffstat (limited to 'src')
-rw-r--r--src/runtime.rs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/runtime.rs b/src/runtime.rs
index dbb6222..97de85a 100644
--- a/src/runtime.rs
+++ b/src/runtime.rs
@@ -414,7 +414,19 @@ async fn execute(frame: &mut StackFrame) -> ExecutionState {
}
},
0x06 => { // OpType::InvokeGenerator
-
+ let function_id = frame.next_varuint();
+ let function = frame.runtime.0.functions.get(&function_id)
+ .expect("Undefined function");
+ let mut args = Vec::with_capacity(function.arguments as usize);
+ for _ in 0..function.arguments {
+ args.push(frame.stack.pop_value());
+ }
+ let mut rx = frame.runtime.invoke(function_id, args);
+ let mut list = Vec::new();
+ while let Some(ret) = rx.recv().await {
+ list.push(ret);
+ }
+ frame.stack.push_value(&IonValue::from(list));
},
0x07 => { // OpType::Yield
return ExecutionState::Yield(frame.stack.pop_value());