Update dependency Jint to 4.16.1 - #36
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
renovate
Bot
force-pushed
the
renovate/jint-4.x
branch
from
July 28, 2026 17:03
6d2d9f4 to
2d18072
Compare
renovate
Bot
force-pushed
the
renovate/jint-4.x
branch
from
July 28, 2026 22:52
2d18072 to
f3c08a5
Compare
renovate
Bot
force-pushed
the
renovate/jint-4.x
branch
from
July 29, 2026 12:39
f3c08a5 to
7335356
Compare
renovate
Bot
force-pushed
the
renovate/jint-4.x
branch
2 times, most recently
from
August 13, 2026 23:37
969bdd0 to
fa47303
Compare
renovate
Bot
force-pushed
the
renovate/jint-4.x
branch
from
August 23, 2026 14:34
fa47303 to
9ecb16a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
4.14.0→4.16.1Release Notes
sebastienros/jint (Jint)
v4.16.1: 4.16.1Jint 4.16.1 is the first release from the new
4.xmaintenance branch, and it marks the point where the two lines separate:mainis now 5.0.0 development, and4.xis where the 4.16.x line continues.What that means for you. If you are on 4.16.0, this is a drop-in update — it is correctness and conformance work only, no API change and no changed default. Every public signature is the same one 4.16.0 shipped, on all five target frameworks. If you want the 4.x line, take it from
4.xand expect fixes rather than features. If you want to follow where the engine is going, watchmain— v5 brings breaking API changes, an opt-in WHATWG web API surface, Web Workers, Node compatibility and a raised .NET Framework floor, and every one of them is recorded as it lands indocs/v5-migration.md.From this release onward the 4.x public surface is snapshotted per target framework in
Jint.Tests.PublicInterface/Verify/, so "did the API move?" is a diff rather than a judgement call — on this branch a diff there is a bug, and comparing those files againstmain's is the v4→v5 delta.Highlights
Conformance, from a suite that now runs more of test262. The
staging/directory is generated and executed for the first time (#3016), which is roughly 2,800 additional cases — largely SpiderMonkey's own suite contributed upstream, covering behaviour the stable directories never reach. Much of the work below is what it found.Built-ins do what the spec says, step by step. The array built-ins perform the internal methods they name rather than equivalents (#3066);
Array.fromhonoursIsConstructorand a typed array'slengthwrite throws (#3043); an array truncation walks downwards and the generics report the writes they fail (#3072); argument validation and evaluation order are corrected in five built-ins (#3069);MapandSetget the[[SetData]]tombstone their traversals are specified over (#3073);Date.prototype.setTimestores the clipped time value (#3042); andArray.prototype.values/keys/entriesno longer gate on an array-like receiver (#3236).Iterators and control flow. A throw from the iterator step no longer closes the iterator (#3047); the
doneflag is consulted before stepping again (#3048); a rejectedreturn()propagates out of an abandonedfor awaitloop (#3113); an optional-chain short circuit is distinguished from a genuineundefined(#3040); a computed property key is evaluated even when spelled as a literal (#3039) and survives anawaitoryieldintact (#3144, #3150); and destructuring the rest of an exhausted array yields an empty array rather than 2³² elements (#3263).Numeric and string accuracy.
Math.acosh,asinh,atanh,cbrt,expm1andlog1pare ported from fdlibm for correctly-rounded results across every target framework (#3050);toFixedformats from the double's exact value and readsthisfrom[[NumberData]](#3071);String.prototypecase conversion derives from Jint's own Unicode tables rather than the host's culture data (#3068); and the regex engine is chosen per subject, withRegExp.prototype.replaceno longer rewritinglastIndex(#3070).Bounds that hold. JavaScript strings have a maximum length instead of a wrapped array rent (#3015); a JSON document too long to become a string is refused while it is being built (#3028); a frame displaced by a proper tail call keeps counting while its trampoline runs, so
MaxRecursionDepthcannot be evaded by leaving and re-entering the trampoline (#3022); and anAtomicswaiter is released when nothing can ever notify it again (#3029).Error messages no longer run user JavaScript (#3041) — rendering a message for a value with a script-supplied
toStringused to invoke it, from inside the failure path.Internationalization. The five Temporal members the proposal removed are dropped (#3014), and
u-extension options are canonicalized with every date format the spec allows (#3018).Two fixes in this release come from @svenrog — a sloppy function answering its own
arguments(#3061) and the outer link on a parkedFunction-constructor environment (#3063).What's Changed
Full Changelog: sebastienros/jint@v4.16.0...v4.16.1
v4.16.0Jint 4.16.0 is a correctness- and reliability-focused release: alongside asynchronous module loading, proper tail calls and four new iterator built-ins, a pre-tag review swept the whole engine and fixed what it found — including long-standing defects that predate this cycle. No option defaults changed. Behaviour changes to note up front:
JSON.stringifyand other machine-readable output now format invariantly under every host culture — under Swedish or Finnish locales on .NET 8+ it used to emit a Unicode minus sign no JSON parser accepts;JSON.parsenow rejects trailing commas as the grammar requires; bare identifiers at global scope resolve through the global's prototype chain per spec;IModuleLoader.Resolveis consulted once per (referrer, specifier) pair, so a loader using it as a per-import access-control checkpoint should move the check toLoadModule; and an inconsistent sort comparator now finishes with an implementation-defined order on every target framework instead of hanging (net462/netstandard) or throwing a CLR exception at script (net8+).Highlights
Proper tail calls (#2975). Strict-mode calls in tail position reuse their frame, so
"use strict"tail recursion runs in constant stack — the first ES2015 PTC implementation among the .NET engines.Asynchronous module loading (#2872).
IAsyncModuleLoaderand theAsyncModuleLoadertemplate let a host fetch module source over I/O without blocking a thread;Engine.Modules.StartImportreturns an operation a game loop drives viaProcessTasks(), andImportAsyncawaits without holding a thread. The spec's load phase now exists as written, a warm-cache async loader keeps the blockingImportfully synchronous, and the blocking drain wakes on a work-arrived signal instead of polling. A module served over a transport keeps its whole url asModule.Locationso its own relative imports resolve, a deferred namespace evaluates its module instead of exposing uninitialized bindings, and an import abandoned by a global snapshot restore reports itself faulted instead of polling forever.The process no longer dies for recoverable reasons.
Options.LimitRecursionused to kill the host process for most useful limits — the constraint fired, and the unwind itself overflowed the stack; exception filters now let it unwind ~7× deeper. The new opt-inOptions.Constraints.StackOverflowGuardconverts unbounded recursion — reachable through eighteen distinct routes,new, accessors, coercions and Proxy traps included — from a process kill into a catchableRangeError, exempting strict tail calls, which grow no stack. And a family of CLR exceptions that escapedengine.Evaluatepast every scriptcatchare now proper JavaScript errors or correct results: sorting with an inconsistent comparator, destructuring with a function-valued default (const { onChange = () => {} } = opts),toLocaleStringoutsideDateTime's range, typed-arraydefinePropertywithout a value,DataViewreads at 2³¹,String.replace$'with a lying exec, and the first instant of year 10000.New built-ins.
Iterator.prototype.join,chunks,windowsandincludes;take/dropnow throwRangeErrorfor a finite limit above 2^53−1 per the updated proposals.Intl.Locale.prototype.getCollationsreports CLDR-cited collation data thatIntl.Collatoraccepts in full, a malformedcollationoption is aRangeError, andIntl.supportedValuesOf("collation")derives from the same lists so the three can never drift.Conformance, from a review that ran what the suite does not. Two of the fixed defects had test262 coverage only under the never-generated
staging/directory, and several had none at all:parseIntstrips the sign before testing for a hex prefix, soparseInt("-0x10")is −16; a suspendedfinallyno longer swallows a pendingbreak/continue; a Proxy (or exotic host object) as the global's prototype answers bare identifiers through itsgettrap;Date.prototype.toISOStringemits the spec's six-digit expanded year and round-trips throughDate.parsein every spelling including year 0; iterator helpers close their receiver exactly once and only when the spec says so, and carry their own@@toStringTag;Map/Setsizeis the prototype accessor the spec defines rather than a phantom own property; a Proxy'sdefinePropertytrap receives the partial descriptor the caller wrote; a string's@@iteratoris read once, with the primitive as receiver;Array.prototype.joinre-asks the array when a side effect fills a hole mid-join; a direct eval reaches the enclosing function'sargumentsin both modes; andTemporal.Nowdrops the methods the proposal removed.Embedder surface.
OperationDeadlineConstraintbounds a whole multi-entry host operation;ScriptPreparationOptions.StaticAnalysistrades prepare-time analysis for per-engine materialization on shared graphs;ModuleFactory.LocationOfexposes the module-naming rule a host must match;Engine.Advanced.HostDefinedcarries per-request state on a pooled engine; the CLR exception behind an interop error is reachable throughJintException.TryGetClrExceptionwith opt-inChainClrExceptions(), and a host method's ownTargetExceptionis no longer mistaken for a receiver mismatch; and a recursion-limit failure propagates out of a module load instead of becoming a catchable rejection.Performance, gated. Against v4.15.3 on idle hardware, medians of three paired runs:
controlflow-recursive−15.6% time and −40.4% allocation (proper tail calls),bitops-3bit-bits-in-byte−8.9%,math-spectral-norm−7.3%,crypto-sha1−6.9%,3d-raytrace−5.9%,math-cordic−5.8%, with a broad −1–4% tail across the call- and string-heavy rows; no row moved outside its own measured cross-run envelope in the other direction, and allocation is flat within ±0.2% suite-wide. WarmedparseIntcall sites take the frameless fast-call lane (−13% on the parse loop), joined by theNumberpredicates,String.prototype.indexOf/startsWith/endsWith/includes/at/substr, globalisNaN/isFiniteandArray.isArray(−3% to −19%) and theMap/Setmethod family (map.gethit loop −13%); existence questions on a wrapped dictionary answer fromContainsKey, takingin−33% with −98% allocation andObject.keys−37%; resolving an inherited global no longer allocates per miss (−99.99% on the read loop) and a global created through an inherited write keeps the in-place store; JSON replacer/reviver eligibility is decided once per document, built-in callback dispatch once per loop, a call site's arguments reach an interpreted callee in registers, and function-locallet/constlive in fixed slots.Breaking changes.
Int32Extensions/Int64Extensions/DoubleExtensions— polyfill hosts that leaked into the public API — are now internal; on net462/netstandard2.0, code withusing Jint;may have bound spanParse/TryParsemembers through them.JsonParserrejects trailing commas.Number.parseInt.length/Number.parseFloat.lengthreport their spec values. Post-construction mutation of anOptionsinstance no longer reaches an already-built engine, andOptions.Configurecallbacks work again.UnwrapIfPromisereports a cancelled engine asExecutionCanceledExceptioninstead of a timeout. Time-zone matching is ASCII-case-insensitive per ECMA-402.On the engine comparison benchmarks, Jint 4.16.0 is the fastest engine outright on 5 of 12 scripts — leading
dromaeo-object-regexp-modernover native V8 by 1.25× — in a statistical tie for first oninterop-collection-traversal, the fastest managed engine on 10 of 12, the fastest interpreter on all 12, and 8.6×–11.2× ahead of ClearScript (native V8) on every interop row while allocating 3.9×–12.4× less than the nearest managed competitor.What's Changed
3655e74and make Promise.try use PromiseResolve by @lahma in #2978New Contributors
Full Changelog: sebastienros/jint@v4.15.3...v4.16.0
v4.15.3Jint 4.15.3 rounds out the 4.15 embedder line: every item here answers friction a real integration reported while adopting the host-integration surface 4.15.0 introduced. Everything is additive — no option defaults changed and no behavior changes for existing code.
Engine.Advanced.AddLazyGlobal(#2862) — install a lazy global on a live engine, so a host whose globals are computed from per-request data can defer building them until script reads the name; the same PR addsEngine.Advanced.WithRestoredGlobals(snapshot, action), thetry/finallyevery snapshot-reusing host was writing by hand.PropertyDescriptor.CreateLazy(#2865) — a public lazy property descriptor that materializes once and then rejoins the read and write inline caches, which a hand-rolledCustomJsValuedescriptor never could; it is the sanctioned way to build for any host object property whatAddLazyGlobaldoes for a global.Options.AddImmutableCrossing(params Type[])(#2863) — a host promise that instances of the declared CLR types do not change while they are exposed to the engine, in exchange for which a wrapped object memoizes its resolved reads. On the nested-document walk it was built for that measures −43% to −84% time and −99% allocation against the undeclared path, with dictionary andJsonNodesources converging to identical steady-state cost. It is a promise: a declared object mutated anyway will serve stale reads.Jint.EnableHostContractVerificationAppContext switch before the first use of any Jint type and the checks that catch a host answering one extension point in a way that contradicts another run in Release, throwing with a descriptive message. Embedders can now run their suites against the exact package they deploy instead of building a Debug Jint from source, and CI now runs this repository's own host suites that way too (#2866).Engine.Advanced.HasSharedShape(#2861) — a stable, pinnable predicate for whetherJsObject.Create,CreateFromEntriesorJsObjectShape.Instantiateactually produced a shared-layout object, which the explicitly non-contractualObjectRepresentationdiagnostic could never be.JsString.Create(string)is now public (#2860) — the counterpart ofJsNumber.Create, answering the empty string and single-character ASCII from interned instances instead of allocating.Baseholds an internal sentinel rather thanundefined, and resolver authors returning it were leaking that sentinel string into scripts; the docs and the in-repo sample now show the right idiom.What's Changed
Full Changelog: sebastienros/jint@v4.15.2...v4.15.3
v4.15.2Jint 4.15.2 is a fix release.
for await...of(#2852), anawaitsuspending a right-hand side no longer stores the suspension sentinel into the target (#2855), and suspension-node resolution unwraps correctly (#2856).instanceofwork on bound functions whose target is itself bound (#2853), and inherited accessors reached throughObjectInstance.TryGetValuereceive the original receiver (#2854).JsObject.Createvalues span is now nullable-annotated so a lazy slot's requirednullneeds no suppression (#2851).What's Changed
New Contributors
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.