pyrograph 0.1.0

GPU-accelerated taint analysis for supply chain malware detection
Documentation
use super::*;

impl JsParser {
    pub(super) fn eval_assignment_expr(&mut self, assign: &AssignExpr) -> NodeId {
        let rhs = self.eval_expr(&assign.right);
        match &assign.left {
            AssignTarget::Simple(SimpleAssignTarget::Ident(i)) => {
                let lhs_name = i.id.sym.to_string();
                let lhs = self.var(&lhs_name);
                self.flow(rhs, lhs);
                if let Some(alias) = self.node_binding_alias(rhs) {
                    if let Some(node) = self.graph.node_mut(lhs) {
                        node.alias = Some(alias);
                    }
                }
                self.materialize_composite_bindings(&lhs_name, rhs);
                if let Some(ref params) = self.fn_expr_params_at_depth_0.take() {
                    self.function_params.insert(lhs_name.clone(), params.clone());
                }
                if let Some(s) = self.try_infer_string_literal(&assign.right) {
                    self.known_strings.insert(lhs_name.clone(), s);
                }
                if let Some(arr) = self.try_infer_array_literal(&assign.right) {
                    self.known_arrays.insert(lhs_name, arr);
                }
                lhs
            }
            AssignTarget::Simple(SimpleAssignTarget::Member(m)) => {
                let lhs = self.eval_member_expr(m);
                self.flow(rhs, lhs);
                let lhs_name = self.binding_name(lhs);
                self.assigned_members.insert(lhs_name.clone());
                self.materialize_composite_bindings(&lhs_name, rhs);
                lhs
            }
            AssignTarget::Pat(p) => {
                match p {
                    AssignTargetPat::Array(a) => {
                        self.bind_pat_with_source(&Pat::Array(a.clone()), Some(rhs));
                    }
                    AssignTargetPat::Object(o) => {
                        self.bind_pat_with_source(&Pat::Object(o.clone()), Some(rhs));
                    }
                    AssignTargetPat::Invalid(_) => {}
                }
                rhs
            }
            _ => rhs,
        }
    }
}