Selected changesmerged Sep 21, 2026 – Sep 27, 2026
Added edmonds_blossom_algorithm.py. For maximum matching in the graph. #12043Python · 267 + / 0 −
Introduces 9 new declarations in graphs/edmonds_blossom_algorithm.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
graphs/edmonds_blossom_algorithm.py ↗ · 3 files
@@ -0,0 +1,267 @@+from collections import deque+++class BlossomAuxData:+ """Class to hold auxiliary data during the blossom algorithm's execution."""++ def __init__(+ self,+ queue: deque,+ parent: list[int],+ base: list[int],+ in_blossom: list[bool],+ match: list[int],+ in_queue: list[bool],+ ) -> None:+ """+ Initializes the BlossomAuxData instance.++ Args:+ queue: A deque for BFS processing.+ parent: List of parent vertices in the augmenting path.+ base: List of base vertices for each vertex.+ in_blossom: Boolean list indicating if a vertex is in a blossom.+ match: List of matched vertices.+ in_queue: Boolean list indicating if a vertex is in the queue.+ """+ self.queue = queue+ self.parent = parent+ self.base = base+ self.in_blossom = in_blossom+ self.match = match+ self.in_queue = in_queue+
[Executorch] Add MLX recipePython · 46 + / 5 −
Introduces 3 new declarations in src/transformers/exporters/exporter_executorch.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
src/transformers/exporters/exporter_executorch.py ↗ · 4 files
@@ -258,9 +273,33 @@ def prepare_for_cuda(model: PreTrainedModel, sample_inputs: dict[str, Any]): return model, _make_contiguous(sample_inputs), partitioner +def prepare_for_mlx(model: PreTrainedModel, sample_inputs: dict[str, Any]):+ """Apple Silicon GPU inference via the ExecuTorch MLX backend."""+ for value in sample_inputs.values():+ caches = [value]+ if isinstance(value, EncoderDecoderCache):+ caches = [value.self_attention_cache, value.cross_attention_cache]+ if any(isinstance(cache, StaticCache) for cache in caches):+ raise ValueError(+ "StaticCache is not supported by the ExecuTorch MLX backend. "+ "Use DynamicCache or set cache_implementation='dynamic' in GenerationConfig."+ )++ from executorch.backends.mlx import MLXPartitioner++ model.requires_grad_(False)+ model = model.to(device="cpu")+ # MLX does not support grouped MoE kernels.+ if isinstance(model, PreTrainedModel) and model._can_set_experts_implementation():+ model.set_experts_implementation("batched_mm")+ partitioner = [MLXPartitioner()]+ return model, _make_contiguous(sample_inputs), partitioner++ _BACKEND_PREPARE = { "xnnpack": prepare_for_xnnpack, "cuda": prepare_for_cuda,+ "mlx": prepare_for_mlx, }
Add watch validationGo · 220 + / 2 −
Introduces 15 new declarations in staging/src/k8s.io/apiserver/pkg/storage/testing/correctness/watch.go.
Adds new systems design rather than adjusting what was there. Tests changed with it, with code of their own.
staging/src/k8s.io/apiserver/pkg/storage/testing/correctness/watch.go ↗ · 6 files
@@ -0,0 +1,203 @@+/*+Copyright The Kubernetes Authors.++Licensed under the Apache License, Version 2.0 (the "License");+you may not use this file except in compliance with the License.+You may obtain a copy of the License at++ http://www.apache.org/licenses/LICENSE-2.0++Unless required by applicable law or agreed to in writing, software+distributed under the License is distributed on an "AS IS" BASIS,+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+See the License for the specific language governing permissions and+limitations under the License.+*/++package correctness++import (+ "fmt"+ "math"+ "reflect"++ "github.com/google/go-cmp/cmp"++ "k8s.io/apimachinery/pkg/api/meta"+ "k8s.io/apimachinery/pkg/runtime"+ "k8s.io/apimachinery/pkg/watch"+ "k8s.io/apiserver/pkg/storage"+)++// WatchValidator checks watch streams against the event history the model+// derived from the recorded operations.
Don't merge distinct impl candidatesRust · 89 + / 30 −
Introduces 5 new declarations in compiler/rustc_next_trait_solver/src/solve/trait_goals.rs.
Adds new language design rather than adjusting what was there. Tests changed with it, with code of their own.
compiler/rustc_next_trait_solver/src/solve/trait_goals.rs ↗ · 10 files
@@ -1493,19 +1493,77 @@ where } } + /// Like `try_merge_candidates`, but returns `None` if there are multiple user-written+ /// impls, or a user-written impl and a builtin impl, in which case we bail with ambiguity.+ ///+ /// Candidates with equal responses can still come from conflicting impls, ex - two+ /// overlapping impls which both apply due to impossible where-clauses. We don't want+ /// to merge these. Multiple builtin impls are still merged as usual. This is not+ /// done for marker traits, as their impls are allowed to overlap.+ #[instrument(level = "trace", skip(self), ret)]+ fn try_merge_impl_candidates(+ &mut self,+ trait_def_id: I::TraitId,+ candidates: &[Candidate<I>],+ ) -> Option<CanonicalResponse<I>> {+ let is_marker = self.cx().trait_is_marker(trait_def_id);+ let all_builtin = candidates+ .iter()+ .all(|candidate| matches!(candidate.source, CandidateSource::BuiltinImpl(_)));++ if is_marker || all_builtin {+ self.try_merge_candidates(candidates).map(|(response, _)| response)+ } else if candidates.len() > 1 {+ None+ } else {+ candidates.first().map(|candidate| candidate.result)+ }+ }++ fn merge_candidates_or_bail_with_ambiguity(+ &mut self,+ candidates: &[Candidate<I>],
Add some more verification and safety rules around custom `distDir`TypeScript · 62 + / 0 −
Introduces 3 new declarations in packages/next/src/lib/dist-dir.ts.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
packages/next/src/lib/dist-dir.ts ↗ · 8 files
@@ -0,0 +1,59 @@+import * as path from 'node:path'++export class InvalidDistDirError extends Error {+ constructor(distDir: string, appDir: string, workspaceRoot: string) {+ super(+ `The configured distDir should be inside of the application directory ` ++ `or the workspace containing it, and must not contain the application ` ++ `directory itself:\n\n` ++ ` distDir: ${distDir}\n` ++ ` application: ${appDir}\n` ++ ` workspace root: ${workspaceRoot}\n\n` ++ `Read more: https://nextjs.org/docs/messages/invalid-dist-dir`+ )+ this.name = 'InvalidDistDirError'+ }+}++/** Whether `descendant` is strictly inside `ancestor`. */+// TODO: Account for symlinks when validating containment.+function isStrictlyInside(ancestor: string, descendant: string): boolean {+ const relative = path.relative(path.resolve(ancestor), descendant)+ return (+ relative !== '' &&+ relative !== '..' &&+ !relative.startsWith('..' + path.sep) &&+ !path.isAbsolute(relative)+ )+}++/**+ * Throws unless `distDir` is inside the application or workspace, without+ * containing the application itself.+ */
sqlite: add virtual table support via createModule()C++ · 826 + / 0 −
Introduces 7 new declarations in src/node_sqlite.cc.
Adds new runtime rather than adjusting what was there. Tests changed with it, with code of their own.
src/node_sqlite.cc ↗ · 5 files
@@ -1012,6 +1015,483 @@ BaseObjectPtr<DatabaseSyncLimits> DatabaseSyncLimits::Create( return MakeBaseObject<DatabaseSyncLimits>(env, obj, std::move(database)); } +// ---------------------------------------------------------------------------+// VirtualTableModule+// ---------------------------------------------------------------------------++VirtualTableModule::VirtualTableModule(Environment* env,+ BaseObjectWeakPtr<DatabaseSync> db,+ Local<Function> rows_fn,+ std::string&& schema_sql,+ int num_columns,+ std::vector<int>&& hidden_col_indices,+ bool use_bigint_args,+ bool direct_only)+ : env_(env),+ db_(std::move(db)),+ rows_fn_(env->isolate(), rows_fn),+ schema_sql_(std::move(schema_sql)),+ num_columns_(num_columns),+ hidden_col_indices_(std::move(hidden_col_indices)),+ use_bigint_args_(use_bigint_args),+ direct_only_(direct_only),+ module_def_({}) {+ // Initialize the sqlite3_module definition. Each VirtualTableModule instance+ // gets its own copy to avoid thread-safety issues with worker threads.+ module_def_.iVersion = 1;+ module_def_.xCreate = VirtualTableModule::xCreate;+ module_def_.xConnect = VirtualTableModule::xCreate;+ module_def_.xBestIndex = VirtualTableModule::xBestIndex;+ module_def_.xDisconnect = VirtualTableModule::xDisconnect;+ module_def_.xDestroy = VirtualTableModule::xDestroy;+ module_def_.xOpen = VirtualTableModule::xOpen;
Fix startTime and shutdown delivery of forwarded Turbopack trace spansRust · 154 + / 33 −
Introduces 5 new declarations in turbopack/crates/turbo-tasks/src/message_queue.rs.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
turbopack/crates/turbo-tasks/src/message_queue.rs ↗ · 5 files
@@ -59,58 +88,93 @@ impl CompilationEventQueue { history.pop_front(); } history.push_back(message_clone.clone());+ drop(history);++ if deliver {+ // Send to all active receivers of the same message type+ if let Some(mut type_subscribers) = subscribers.get_mut(&EventChannelType::Type(+ message_clone.type_name().to_owned(),+ )) {+ let mut removal_indices = Vec::new();+ for (ix, sender) in type_subscribers.iter().enumerate() {+ if sender.send(message_clone.clone()).await.is_err() {+ removal_indices.push(ix);+ }+ } - // Send to all active receivers of the same message type- if let Some(mut type_subscribers) = subscribers.get_mut(&EventChannelType::Type(- message_clone.type_name().to_owned(),- )) {- let mut removal_indices = Vec::new();- for (ix, sender) in type_subscribers.iter().enumerate() {- if sender.send(message_clone.clone()).await.is_err() {- removal_indices.push(ix);+ for ix in removal_indices.iter().rev() {+ type_subscribers.remove(*ix); } } - for ix in removal_indices.iter().rev() {- type_subscribers.remove(*ix);- }
fix: Stop shared ESM watchers when unusedPython · 165 + / 29 −
Introduces 11 new declarations in panel/io/watcher.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
panel/io/watcher.py ↗ · 3 files
@@ -0,0 +1,157 @@+"""+Shared file watching for the autoreload development loop.++Components that render from the same file, e.g. every component compiled+into a shared ESM bundle, would otherwise each start their own watcher+task. This module hands out one watcher per path and notifies all its+subscribers when the file changes.+"""+from __future__ import annotations++import asyncio+import os+import pathlib+import typing as t+import weakref++from .state import state++_watchers: dict[pathlib.Path, PathWatcher] = {}+++class PathWatcher:+ """+ Watches a single path on behalf of any number of subscribers.++ Subscribers are held weakly, so subscribing does not keep a component+ alive; each is notified by calling the method it subscribed with.+ """++ def __init__(self, path: pathlib.Path):+ self.path = path+ self._subscribers: weakref.WeakKeyDictionary[t.Any, set[str]] = weakref.WeakKeyDictionary()+ self._stop_event: asyncio.Event | None = None
Refactor PodGroupProtectionController to use namespacedKey and objectOf functionsGo · 32 + / 31 −
Introduces 4 new declarations in pkg/controller/scheduling/podgroupprotection/podgroup_protection_controller.go.
Adds new systems design rather than adjusting what was there. Tests changed with it, with code of their own.
pkg/controller/scheduling/podgroupprotection/podgroup_protection_controller.go ↗ · 2 files
@@ -316,27 +314,30 @@ func (c *Controller) enqueuePodGroupForPod(logger klog.Logger, pod *v1.Pod) { return } - pgKey := pod.Namespace + "/" + *pod.Spec.SchedulingGroup.PodGroupName+ pgKey := namespacedKey(pod.Namespace, *pod.Spec.SchedulingGroup.PodGroupName) logger.V(4).Info("Enqueuing PodGroup for pod event", "pod", klog.KObj(pod), "podGroup", pgKey) c.queue.Add(pgKey) } -func getPod(obj interface{}) *v1.Pod {+// objectOf extracts a typed object from an informer event payload or unwraps it+// from a cache.DeletedFinalStateUnknown tombstone.+func objectOf[T any](obj any) T {+ var zero T if obj == nil {- return nil+ return zero+ }+ if t, ok := obj.(T); ok {+ return t+ }+ tombstone, ok := obj.(cache.DeletedFinalStateUnknown)+ if !ok {+ utilruntime.HandleError(fmt.Errorf("expected %T or DeletedFinalStateUnknown, got %T", zero, obj))+ return zero }- pod, ok := obj.(*v1.Pod)+ t, ok := tombstone.Obj.(T) if !ok {- tombstone, ok := obj.(cache.DeletedFinalStateUnknown)- if !ok {- utilruntime.HandleError(fmt.Errorf("couldn't get object from tombstone %#v", obj))- return nil
scheduler: refine SchedulingAlgorithm surface and decouple cache vs snapshot placementGo · 338 + / 192 −
Introduces 16 new declarations in pkg/scheduler/algorithm.go.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
pkg/scheduler/algorithm.go ↗ · 9 files
@@ -447,126 +557,148 @@ func (a *SchedulingAlgorithm) assume(logger klog.Logger, schedFramework framewor // Any potential NodeAllocatableResourceClaimStatuses from a previously failed scheduling attempt is overwritten. // This field is not explicitly cleared as the Pod object is reconstructed in handleSchedulingFailure() // before re-queueing.- assumedPodInfo.Pod.Status.NodeAllocatableResourceClaimStatuses = dynamicresources.ExtractPodNodeAllocatableResourceClaimStatus(logger, state, host)+ assumedPodInfo.Pod.Status.NodeAllocatableResourceClaimStatuses =+ dynamicresources.ExtractPodNodeAllocatableResourceClaimStatus(logger, state, host) }+ return assumedPodInfo+} - if state.IsPodGroupSchedulingCycle() {- err := a.nodeInfoSnapshot.AssumePod(assumedPodInfo.PodInfo)- if err != nil {- logger.Error(err, "Scheduler snapshot AssumePod failed")- return err+// reserve runs Reserve plugins for the assumed pod and converts plugin rejections+// into a single-node FitError.+func (a *SchedulingAlgorithm) reserve(ctx context.Context, state fwk.CycleState,+ schedFramework framework.Framework, assumedPodInfo *framework.QueuedPodInfo,+ origPod *v1.Pod, host string) *fwk.Status {+ if status := schedFramework.RunReservePluginsReserve(ctx, state, assumedPodInfo.Pod, host); !status.IsSuccess() {+ if status.IsRejected() {+ fitErr := &framework.FitError{+ NumAllNodes: 1,+ Pod: origPod,+ Diagnosis: framework.Diagnosis{+ NodeToStatus: framework.NewDefaultNodeToStatus(),+ },+ }+ fitErr.Diagnosis.NodeToStatus.Set(host, status)+ fitErr.Diagnosis.AddPluginStatus(status)+ return fwk.NewStatus(status.Code()).WithError(fitErr) }
Staticlib rename internal symbols: add COFF supportRust · 183 + / 17 −
Introduces 3 new declarations in compiler/rustc_codegen_ssa/src/back/symbol_edit.rs.
Adds new language design rather than adjusting what was there. Tests changed with it, with code of their own.
compiler/rustc_codegen_ssa/src/back/symbol_edit.rs ↗ · 4 files
@@ -441,6 +476,125 @@ fn macho_rebuild_strtab( Some(result) } +// ---------------------------------------------------------------------------+// COFF: single-pass collection + apply+// ---------------------------------------------------------------------------++fn coff_collect_impl<'data, Coff: CoffHeader>(+ data: &'data [u8],+ header: &'data Coff,+ exported: &FxHashSet<String>,+ out: &mut FxHashSet<String>,+ strip_underscore: bool,+) {+ let Ok(symbols) = header.symbols(data) else { return };+ let strings = symbols.strings();++ for (_index, sym) in symbols.iter() {+ let sclass = sym.storage_class();+ if sclass != pe::IMAGE_SYM_CLASS_EXTERNAL && sclass != pe::IMAGE_SYM_CLASS_WEAK_EXTERNAL {+ continue;+ }+ if sym.section_number() <= 0 {+ continue;+ }+ let Ok(name_bytes) = sym.name(strings) else { continue };+ let Ok(mut name) = str::from_utf8(name_bytes).map(String::from) else { continue };+ if strip_underscore {+ name = name.strip_prefix('_').unwrap_or(&name).to_string();+ }+ if !exported.contains(&name) {+ out.insert(name);+ }
Use focused npm advisories and nudge only for ready upgradesTypeScript · 106 + / 350 −
Introduces 4 new declarations in packages/next/src/lib/upgrade/prepare-upgrade.ts.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
packages/next/src/lib/upgrade/prepare-upgrade.ts ↗ · 6 files
@@ -533,136 +426,55 @@ async function readNpmAdvisories(versions: string[]): Promise<Advisory[]> { throw new Error('Could not check for security updates.') } - const advisories: Advisory[] = data.next.map((finding) => {- if (!finding || typeof finding.vulnerable_versions !== 'string') {+ return data.next.map((finding) => {+ if (+ !finding ||+ typeof finding.vulnerable_versions !== 'string' ||+ !finding.vulnerable_versions.trim()+ ) { throw new Error('Could not check for security updates.') }-- return {- // npm's active advisory feed does not expose withdrawal metadata.- withdrawn_at: null,- vulnerabilities: [- {- package: { ecosystem: 'npm', name: 'next' },- vulnerable_version_range: finding.vulnerable_versions,- },- ],+ const range = finding.vulnerable_versions.replace(/,\s*/g, ' ')+ if (!semver.validRange(range)) {+ throw new Error('Could not check for security updates.') }+ return range })- return advisories-}--function advisoryVersions(value: unknown, checkedVersion: string): string[] {