Selected changesmerged Aug 26, 2026 – Sep 1, 2026
fix(ext/node): allow repeated child process signalsTypeScript · 68 + / 27 −
Introduces 3 new declarations in ext/node/polyfills/internal/child_process.ts.
Adds new language design rather than adjusting what was there. Tests changed with it, with code of their own.
ext/node/polyfills/internal/child_process.ts ↗ · 2 files
@@ -873,20 +890,19 @@ class ChildProcess extends EventEmitter { } } - /* Cancel any pending IPC I/O */- if (this[kCanDisconnect]) {- this.disconnect?.();+ if (isWindows) {+ // See the `#windowsSignalFallback` use in the status handler above.+ this.#windowsSignalFallback = signalName;+ }+ if (signalName === "SIGKILL") {+ this[kSigkillIssued] = true; }- this.killed = true;- this.signalCode = signalName; return true; } [SymbolDispose]() {- if (!this.killed) {- this.kill();- }+ this.kill(); } ref() {
[Fix] Sparse TikToken tokenizers silently failPython · 113 + / 70 −
Introduces 4 new declarations in src/transformers/tokenization_utils_tokenizers.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
src/transformers/tokenization_utils_tokenizers.py ↗ · 3 files
@@ -325,6 +269,102 @@ def _iter_special_tokens(values: Iterable[Any]) -> list[str]: local_kwargs["merges"] = merges return local_kwargs + @classmethod+ def _convert_from_tiktoken(cls, vocab_file: str, local_kwargs: dict[str, Any]) -> dict[str, Any]:+ """Path to a vocab file and a list of extra special tokens."""+ from .convert_slow_tokenizer import TikTokenConverter++ # `added_tokens_decoder` is a (token_id -> token) dict of tokens that may not be contiguous+ added_tokens_decoder: dict[int, str] = {+ int(token_id): token["content"] if isinstance(token, dict) else str(token)+ for token_id, token in (local_kwargs.get("added_tokens_decoder") or {}).items()+ }+ # `extra_special_tokens` is a list of tokens to append to the base vocabulary+ extra_special_tokens: list[str] = local_kwargs.get("extra_special_tokens") or []+ if isinstance(extra_special_tokens, dict):+ extra_special_tokens = list(extra_special_tokens.keys())++ # Retrieve the vocab size from the vocab file+ base_vocab_size = len(TikTokenConverter.load_tiktoken_bpe(vocab_file))++ # If any of the tokens in `added_tokens_decoder` are not in the base vocabulary, they need to be added. To do so+ # we bake them in the `extra_special_tokens` list, with placeholder if `added_tokens_decoder` is not contiguous+ max_added_token_id = max(added_tokens_decoder.keys()) if added_tokens_decoder else 0+ if max_added_token_id >= base_vocab_size:+ new_extras = [+ added_tokens_decoder.get(index, f"<|reserved_token_{index}|>")+ for index in range(base_vocab_size, max_added_token_id + 1)+ ]+ set_new_extras = set(new_extras)+ for special_token in extra_special_tokens:+ if special_token not in set_new_extras:+ new_extras.append(special_token)
turbo-tasks-malloc: report memory from mimallocRust · 313 + / 117 −
Introduces 13 new declarations in turbopack/crates/turbo-tasks-malloc/src/counter.rs.
Adds new framework internals rather than adjusting what was there. Read the linked PR for the surrounding test context.
turbopack/crates/turbo-tasks-malloc/src/counter.rs ↗ · 4 files
@@ -166,42 +212,115 @@ mod tests { use super::*; #[test]- fn counting() {- let mut expected = get();- add(100);- // Initial change should fill up the buffer- expected += TARGET_BUFFER + 100;- assert_eq!(get(), expected);+ fn counts_allocations_and_deallocations() {+ let start = allocation_counters();+ add(100);- // Further changes should use the buffer- assert_eq!(get(), expected);- add(MAX_BUFFER);- // Large changes should require more buffer space- expected += 100 + MAX_BUFFER;- assert_eq!(get(), expected);+ add(250); remove(100);- // Small changes should use the buffer- // buffer size is now TARGET_BUFFER + 100- assert_eq!(get(), expected);- remove(MAX_BUFFER);- // The buffer should not grow over MAX_BUFFER- // buffer size would be TARGET_BUFFER + 100 + MAX_BUFFER- // but it will be reduce to TARGET_BUFFER- // this means the global counter should reduce by 100 + MAX_BUFFER- expected -= MAX_BUFFER + 100;- assert_eq!(get(), expected);-- update(100, 200);
fix(cli): don't duplicate passthrough args for deno deploy/sandboxRust · 79 + / 5 −
Introduces 4 new declarations in libs/cli_parser/src/tests_full.rs.
Adds new language design rather than adjusting what was there. Read the linked PR for the surrounding test context.
libs/cli_parser/src/tests_full.rs ↗ · 2 files
@@ -9767,6 +9767,79 @@ fn use_env_proxy_flags() { assert!(r.is_err()); } +#[test]+fn deploy_subcommand() {+ let r = flags_from_vec(svec!["deno", "deploy"]);+ assert_eq!(+ r.unwrap(),+ Flags {+ subcommand: DenoSubcommand::Deploy(DeployFlags { sandbox: false }),+ ..Flags::default()+ }+ );++ // `deploy` is a passthrough subcommand: every arg after it is forwarded+ // verbatim, exactly once. Regression test for a duplication bug where the+ // args were written to `argv` both by `deploy_parse` and by the generic+ // trailing-arg handling, turning `--prod` into `--prod --prod`.+ let r = flags_from_vec(svec!["deno", "deploy", "--prod"]);+ assert_eq!(+ r.unwrap(),+ Flags {+ subcommand: DenoSubcommand::Deploy(DeployFlags { sandbox: false }),+ argv: svec!["--prod"],+ ..Flags::default()+ }+ );++ let r =+ flags_from_vec(svec!["deno", "deploy", "--project=myapp", "--prod", "-y"]);+ assert_eq!(+ r.unwrap(),+ Flags {
Update Fig spec for Azure Developer CLI (azd)TypeScript · 507 + / 218 −
Reworks 725 lines of existing logic in extensions/terminal-suggest/src/completions/azd.ts.
Changes how existing core implementation behaves. Read the linked PR for the surrounding test context.
extensions/terminal-suggest/src/completions/azd.ts ↗ · 1 files
@@ -1477,13 +1453,116 @@ const completionSpec: Fig.Spec = { }, ], },+ {+ name: ['pack'],+ description: 'Build a ready-to-sideload Teams app package for an activity agent.',+ options: [+ {+ name: ['--app-version'],+ description: 'Version stamped into the Teams app manifest',+ args: [+ {+ name: 'app-version',+ },+ ],+ },+ {+ name: ['--display-name'],+ description: 'Display name for the Teams app (defaults to the agent name)',+ args: [+ {+ name: 'display-name',+ },+ ],+ },+ {+ name: ['--output-dir'],+ description: 'Directory to write appPackage.zip to (defaults to the agent source directory)',+ args: [+ {+ name: 'output-dir',+ },+ ],
sessions: Disable unavailable session type pickerTypeScript · 14 + / 11 −
Reworks 18 lines of existing logic in src/vs/sessions/contrib/chat/browser/sessionTypePicker.ts.
Changes how existing language design behaves. Tests changed with it, with code of their own.
src/vs/sessions/contrib/chat/browser/sessionTypePicker.ts ↗ · 4 files
@@ -637,18 +635,19 @@ export class SessionTypePicker extends Disposable { dom.clearNode(this._triggerElement); - // In web (vscode.dev/agents) the host filter already scopes the- // workbench to a single agent host, so when that host advertises only- // one harness there is nothing to pick — hide the trigger entirely.- const hideForSingleHarness = isWeb && this._folderSessionTypes.length <= 1 && this._pickServedByFolder(this._picked);- if (this._folderSessionTypes.length === 0 || hideForSingleHarness) {+ if (this._folderSessionTypes.length === 0) { this._triggerElement.classList.add('hidden');+ this._triggerElement.parentElement?.classList.remove('disabled'); this._visibleKey.set(false); return; } + const disabled = this._folderSessionTypes.length === 1 && this._pickServedByFolder(this._picked); this._triggerElement.classList.remove('hidden');- this._visibleKey.set(true);+ this._triggerElement.parentElement?.classList.toggle('disabled', disabled);+ this._triggerElement.tabIndex = disabled ? -1 : 0;+ this._triggerElement.setAttribute('aria-disabled', String(disabled));+ this._visibleKey.set(!disabled); const currentType = this._folderSessionTypes.find(t => t.providerId === this._picked?.providerId && t.sessionType.id === this._picked?.sessionTypeId)?.sessionType ?? this._folderSessionTypes.find(t => t.sessionType.id === this._picked?.sessionTypeId)?.sessionType;
Use `drop_guard` in some places in {core,alloc,std}Rust · 313 + / 506 −
Introduces 1 new declaration in library/alloc/src/collections/vec_deque/drain.rs.
Adds new language design rather than adjusting what was there. Read the linked PR for the surrounding test context.
library/alloc/src/collections/vec_deque/drain.rs ↗ · 19 files
@@ -94,144 +94,137 @@ unsafe impl<T: Send, A: Allocator + Send> Send for Drain<'_, T, A> {} #[stable(feature = "drain", since = "1.6.0")] impl<T, A: Allocator> Drop for Drain<'_, T, A> { fn drop(&mut self) {- struct DropGuard<'r, 'a, T, A: Allocator>(&'r mut Drain<'a, T, A>);-- let guard = DropGuard(self);-- if mem::needs_drop::<T>() && guard.0.remaining != 0 {- // SAFETY: We just checked that `self.remaining != 0`.- let (front, back) = unsafe { guard.0.as_slices() };- // since idx is a logical index, we don't need to worry about wrapping.- guard.0.idx += front.len();- guard.0.remaining -= front.len();- // SAFETY: This can't have been dropped before since- // `idx` & `remaining` track what's been dropped.- unsafe { ptr::drop_in_place(front) };- guard.0.remaining = 0;- // SAFETY: Ditto.- unsafe { ptr::drop_in_place(back) };- }- // Dropping `guard` handles moving the remaining elements into place.- impl<'r, 'a, T, A: Allocator> Drop for DropGuard<'r, 'a, T, A> {- #[inline]- fn drop(&mut self) {- if mem::needs_drop::<T>() && self.0.remaining != 0 {- // SAFETY: We just checked that `self.remaining != 0`.- unsafe {- let (front, back) = self.0.as_slices();- ptr::drop_in_place(front);- ptr::drop_in_place(back);- }+ let mut guard = DropGuard::new(self, |drain| {
turbo-tasks-malloc: address review feedback on #97761Rust · 15 + / 25 −
Reworks 14 lines of existing logic in turbopack/crates/turbo-tasks-malloc/src/lib.rs.
Changes how existing framework internals behaves. Read the linked PR for the surrounding test context.
turbopack/crates/turbo-tasks-malloc/src/lib.rs ↗ · 1 files
@@ -111,14 +105,14 @@ impl TurboMalloc { // Safety: every out-param is either null or a valid `usize` we own. unsafe { libmimalloc_sys::mi_process_info(- std::ptr::null_mut(),- std::ptr::null_mut(),- std::ptr::null_mut(),- std::ptr::null_mut(),- std::ptr::null_mut(),+ /* elapsed_msecs */ std::ptr::null_mut(),+ /* user_msecs */ std::ptr::null_mut(),+ /* system_msecs */ std::ptr::null_mut(),+ /* current_rss */ std::ptr::null_mut(),+ /* peak_rss */ std::ptr::null_mut(), &mut current_commit,- std::ptr::null_mut(),- std::ptr::null_mut(),+ /* peak_commit */ std::ptr::null_mut(),+ /* page_faults */ std::ptr::null_mut(), ); } current_commit