jetcrab\bytecode\literals/
object.rs

1use crate::ast::Node;
2use crate::vm::instructions::Instruction;
3
4pub trait ObjectGenerator {
5    fn generate_object_literal(&mut self, node: &Node);
6    fn generate_property(&mut self, node: &Node);
7}
8
9pub trait ObjectCore {
10    fn instructions(&mut self) -> &mut Vec<Instruction>;
11    fn visit_node(&mut self, node: &Node);
12}
13
14impl<T> ObjectGenerator for T
15where
16    T: ObjectCore,
17{
18    fn generate_object_literal(&mut self, node: &Node) {
19        if let Node::ObjectLiteral(lit) = node {
20            self.instructions().push(Instruction::NewObject);
21            for prop in &lit.properties {
22                if let Node::Property(property) = prop {
23                    self.visit_node(&property.key);
24                    self.visit_node(&property.value);
25                    self.instructions().push(Instruction::SetProperty);
26                }
27            }
28        }
29    }
30
31    fn generate_property(&mut self, node: &Node) {
32        if let Node::Property(prop) = node {
33            self.visit_node(&prop.key);
34            self.visit_node(&prop.value);
35        }
36    }
37}