diff options
author | Jesse Morgan <jesse@jesterpm.net> | 2023-12-31 19:34:40 -0800 |
---|---|---|
committer | Jesse Morgan <jesse@jesterpm.net> | 2023-12-31 19:34:40 -0800 |
commit | 76420739e01cb925eca57845bb4704e97d6c816a (patch) | |
tree | 893e2d9b6ecc8809f462302f10b345076751ab78 /src | |
parent | 72c54d3d6aefa7cd24501d6e8ee60350d7c73f5a (diff) |
Add InvokeGenerator impl
Diffstat (limited to 'src')
-rw-r--r-- | src/runtime.rs | 14 |
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()); |