summaryrefslogtreecommitdiffstats
path: root/third_party/rust/jsparagus-emitter/src/function_declaration_emitter.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/rust/jsparagus-emitter/src/function_declaration_emitter.rs
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/jsparagus-emitter/src/function_declaration_emitter.rs')
-rw-r--r--third_party/rust/jsparagus-emitter/src/function_declaration_emitter.rs77
1 files changed, 77 insertions, 0 deletions
diff --git a/third_party/rust/jsparagus-emitter/src/function_declaration_emitter.rs b/third_party/rust/jsparagus-emitter/src/function_declaration_emitter.rs
new file mode 100644
index 0000000000..5eefd5b215
--- /dev/null
+++ b/third_party/rust/jsparagus-emitter/src/function_declaration_emitter.rs
@@ -0,0 +1,77 @@
+use crate::ast_emitter::AstEmitter;
+use crate::emitter::EmitError;
+use crate::reference_op_emitter::{
+ AssignmentEmitter, DeclarationEmitter, GetNameEmitter, NameReferenceEmitter,
+};
+use ast::source_atom_set::SourceAtomSetIndex;
+use stencil::gcthings::GCThingIndex;
+use stencil::script::ScriptStencilIndex;
+
+pub struct LazyFunctionEmitter {
+ pub stencil_index: ScriptStencilIndex,
+}
+
+impl LazyFunctionEmitter {
+ pub fn emit(self, emitter: &mut AstEmitter) -> GCThingIndex {
+ emitter
+ .compilation_info
+ .scripts
+ .get_mut(self.stencil_index)
+ .set_function_emitted();
+ emitter.emit.get_function_gcthing_index(self.stencil_index)
+ }
+}
+
+pub struct LexicalFunctionDeclarationEmitter {
+ pub name: SourceAtomSetIndex,
+ pub fun_index: GCThingIndex,
+}
+
+impl LexicalFunctionDeclarationEmitter {
+ pub fn emit(self, emitter: &mut AstEmitter) -> Result<(), EmitError> {
+ DeclarationEmitter {
+ lhs: |emitter| {
+ Ok(NameReferenceEmitter { name: self.name }.emit_for_declaration(emitter))
+ },
+ rhs: |emitter| {
+ emitter.emit.lambda(self.fun_index);
+ Ok(())
+ },
+ }
+ .emit(emitter)?;
+
+ emitter.emit.pop();
+
+ Ok(())
+ }
+}
+
+pub struct AnnexBFunctionDeclarationEmitter {
+ pub name: SourceAtomSetIndex,
+ pub fun_index: GCThingIndex,
+}
+
+impl AnnexBFunctionDeclarationEmitter {
+ pub fn emit(self, emitter: &mut AstEmitter) -> Result<(), EmitError> {
+ LexicalFunctionDeclarationEmitter {
+ name: self.name,
+ fun_index: self.fun_index,
+ }
+ .emit(emitter)?;
+
+ AssignmentEmitter {
+ lhs: |emitter| {
+ Ok(NameReferenceEmitter { name: self.name }.emit_for_var_assignment(emitter))
+ },
+ rhs: |emitter| {
+ GetNameEmitter { name: self.name }.emit(emitter);
+ Ok(())
+ },
+ }
+ .emit(emitter)?;
+
+ emitter.emit.pop();
+
+ Ok(())
+ }
+}