diff options
author | Jesse Morgan <jesse@jesterpm.net> | 2023-12-31 15:15:03 -0800 |
---|---|---|
committer | Jesse Morgan <jesse@jesterpm.net> | 2023-12-31 15:15:03 -0800 |
commit | aceb44fa5153a33eb8013be41f1c455ca424f92d (patch) | |
tree | 05f581bd267a551f2a648dd3444fa1fe136af931 /src/js.rs | |
parent | 8251c51e80e59d78d86be504535a3faf3149434a (diff) |
Implement Invoke, Yield, and Return ops
Javascript functions can now return values.
Diffstat (limited to 'src/js.rs')
-rw-r--r-- | src/js.rs | 16 |
1 files changed, 15 insertions, 1 deletions
@@ -108,6 +108,14 @@ impl JsCompiler { self.bytecode.push(OpCode::SwapPop.into()); } + fn push_yield(&mut self) { + self.bytecode.push(OpCode::Yield.into()); + } + + fn push_return(&mut self) { + self.bytecode.push(OpCode::Return.into()); + } + fn push_push(&mut self, value: &IonValue) { self.bytecode.push(OpCode::TypePush.into()); self.bytecode.extend(value.bytes()); @@ -595,7 +603,13 @@ impl JsCompiler { boa_ast::Statement::Switch(_) => todo!(), boa_ast::Statement::Continue(_) => todo!(), boa_ast::Statement::Break(_) => todo!(), - boa_ast::Statement::Return(_) => todo!(), + boa_ast::Statement::Return(ret) => { + if let Some(expr) = ret.target() { + self.compile_expression(expr); + self.push_yield(); + } + self.push_return(); + }, boa_ast::Statement::Labelled(_) => todo!(), boa_ast::Statement::Throw(_) => todo!(), boa_ast::Statement::Try(_) => todo!(), |