java-topology/defects/dart/patch/dart-0003-ssa-builder-named-param-where-2.md

1.6 KiB
Raw Blame History

UNDF: UNDF-2026-000000375

dart-0003: SSA builder namedParameters.contains() in argument ordering — O(N²)

Severity

MEDIUM

Location

pkg/compiler/lib/src/ssa/builder.dart Line 5007 (argument ordering logic in call-site code generation)

Description

During call-site code generation the SSA builder sorts named arguments into parameter-position order. It filters the target function's declared named parameters using:

target.namedParameters
    .where((p) => parameterStructure.namedParameters.contains(p.name))

parameterStructure.namedParameters is List<String>. The .where() predicate is called once per item in target.namedParameters, and each predicate call does a full O(N) linear scan of the List<String>. Total cost: O(N²).

Defective Code

// pkg/compiler/lib/src/ssa/builder.dart:50005011
List<ir.VariableDeclaration> namedParameters =
    target.namedParameters
        // Filter elided parameters.
        .where((p) => parameterStructure.namedParameters.contains(p.name))  // O(N) per call
        .toList()
      ..sort(namedOrdering);

Fix

// FIXED
final Set<String> liveNames =
    parameterStructure.namedParameters.toSet();          // O(N) once
List<ir.VariableDeclaration> namedParameters =
    target.namedParameters
        .where((p) => liveNames.contains(p.name))        // O(1) per call
        .toList()
      ..sort(namedOrdering);

Complexity

Before After
Per call site O(N²) O(N)
  • dart-0001: same root cause in element_map.dart
  • dart-0002: same pattern at builder.dart:2156