Skip to content

v3.0.0

Compare
Choose a tag to compare
@lahma lahma released this 19 Jan 18:15
· 46 commits to main since this release
6cfde52

So v3 is finally here after some seven years of sweat and tears. A big thank you to everyone who helped by contributing new features, fixed and reported problems (you can see the huge list of contributors and their valuable work at the bottom of these release notes).

Jint is now arguably the most feature complete and standards compliant JavaScript engine running purely on top of .NET runtime. All the features listed as supported pass the ECMAScript standard suite for the feature flags. That's almost 60 000 passing tests on top of Jint's own test cases.

πŸ’‘ If you are benefiting from Jint or otherwise would like to show your gratitude, don't forget to sponsor the project, even a one-time donation makes a difference.

We hope you'll like the new release πŸš€

Features

ECMAScript

During v3 development a a huge set of both modern ECMAScript syntax and library features were completed, to name a few:

  • arrow functions
  • let and const support
  • class support
  • rest, spread and destructuring
  • template strings
  • modules
  • async/await
  • nullish coalescing and optional chaining (a ?? b and a?.b?.c)
  • library features like ArrayBuffer, BigInt, DataView, Map, Promise, Proxy, Reflect, Set

Unfortunately generator support and some corner cases for async/await support which will require some internal engine logic refactoring didn't make the cut and will be part of some later release.

You can always refer to the main README to see the state of supported features.

Interop

A lot of interop scenarios were improved and for example extensions methods can now accessed via JavaScript code. Plenty of bugs were fixed and interop performance was improved.

Performance

Performance was a big concern when re-writing the Jint internals. Jint is being heavily used in databases like RavenDB and EventStore where execution performance is crucial. We lowered memory traffic considerably and optimized the runtime in many ways. Generally one can say that Jint v3 is at least twice as fast if not multiple times faster than previous v2 on different workloads. There's also benchmark results comparing Jint to other alternatives available.

Here's results from two well-known test suites comparing v2 and v3.

BenchmarkDotNet v0.13.12, Windows 11 (10.0.23615.1000)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK 8.0.100
  [Host]     : .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX2
  DefaultJob : .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX2

Dromaeo

Engine FileName Mean Error Allocated
v2 dromaeo-3d-cube 65.91 ms 0.455 ms 129.78 MB
v3 22.514 ms (-66%) 0.1484 ms 6284.46 KB (-95%)
v2 dromaeo-core-eval 14.11 ms 0.228 ms 49.55 MB
v3 4.186 ms (-70%) 0.0160 ms 311.57 KB (-99%)
v2 dromaeo-object-array 684.73 ms 1.320 ms 1698.01 MB
v3 44.332 ms (-94%) 0.2200 ms 100363.04 KB (-94%)
v2 droma(...)egexp [21] 1,593.67 ms 18.104 ms 1825.65 MB
v3 154.681 ms (-90%) 1.3777 ms 163817.22 KB (-91%)
v2 droma(...)tring [21] 1,427.76 ms 15.110 ms 17368.44 MB
v3 415.977 ms (-71%) 19.4907 ms 1321449.47 KB (-93%)
v2 droma(...)ase64 [21] 201.81 ms 1.183 ms 988.21 MB
v3 49.754 ms (-75%) 0.2706 ms 6045.42 KB (-99%)

SunSpider

Engine FileName Mean Error Allocated
v2 3d-cube 450.6 ms 1.97 ms 792.97 MB
v3 172.67 ms (-62%) 0.600 ms 45144.06 KB (-94%)
v2 3d-morph 492.0 ms 5.71 ms 678.52 MB
v3 150.45 ms (-69%) 0.424 ms 46255.62 KB (-93%)
v2 3d-raytrace 419.9 ms 2.95 ms 713.45 MB
v3 149.09 ms (-64%) 0.368 ms 86384.38 KB (-88%)
v2 access-binary-trees 168.1 ms 0.86 ms 310.48 MB
v3 80.74 ms (-52%) 0.074 ms 62246.13 KB (-80%)
v2 access-fannkuch 1,466.3 ms 12.18 ms 2981.09 MB
v3 373.35 ms (-75%) 0.494 ms 97.83 KB (-100%)
v2 access-nbody 380.5 ms 1.08 ms 595.76 MB
v3 167.46 ms (-56%) 0.466 ms 53285.7 KB (-91%)
v2 access-nsieve 537.9 ms 10.60 ms 995.61 MB
v3 134.59 ms (-75%) 0.171 ms 17140.71 KB (-98%)
v2 bitop(...)-byte [24] 288.3 ms 1.63 ms 523.8 MB
v3 134.42 ms (-53%) 0.511 ms 61947.89 KB (-88%)
v2 bitops-bits-in-byte 446.3 ms 3.46 ms 780.24 MB
v3 207.84 ms (-53%) 0.719 ms 40543.92 KB (-95%)
v2 bitops-bitwise-and 282.8 ms 2.62 ms 347.92 MB
v3 105.52 ms (-63%) 1.131 ms 55938.53 KB (-84%)
v2 bitops-nsieve-bits 594.0 ms 8.18 ms 1004.71 MB
v3 193.02 ms (-68%) 1.755 ms 53915 KB (-95%)
v2 contr(...)rsive [21] 233.6 ms 1.50 ms 526.25 MB
v3 98.93 ms (-58%) 0.613 ms 92772.26 KB (-83%)
v2 crypto-aes 455.7 ms 6.86 ms 968.64 MB
v3 121.08 ms (-73%) 1.201 ms 10756.26 KB (-99%)
v2 crypto-md5 236.3 ms 0.94 ms 427.65 MB
v3 95.99 ms (-59%) 0.531 ms 82152.38 KB (-81%)
v2 crypto-sha1 234.2 ms 0.84 ms 436.18 MB
v3 92.25 ms (-61%) 0.892 ms 68857.23 KB (-85%)
v2 date-format-tofte 300.9 ms 3.97 ms 560.51 MB
v3 95.31 ms (-68%) 1.891 ms 50129.5 KB (-91%)
v2 date-format-xparb 209.1 ms 0.77 ms 176.21 MB
v3 54.85 ms (-74%) 0.163 ms 26391.45 KB (-85%)
v2 math-cordic 652.8 ms 10.72 ms 1129.32 MB
v3 308.55 ms (-53%) 0.822 ms 86856.08 KB (-92%)
v2 math-partial-sums 208.6 ms 1.53 ms 247.64 MB
v3 103.45 ms (-50%) 0.154 ms 49364.48 KB (-81%)
v2 math-spectral-norm 288.0 ms 2.25 ms 501.69 MB
v3 115.15 ms (-60%) 0.205 ms 56614.34 KB (-89%)
v2 regexp-dna 103.3 ms 1.58 ms 20.14 MB
v3 117.40 ms (+14%) 0.548 ms 17610.08 KB (-15%)
v2 string-base64 278.1 ms 3.48 ms 1332.74 MB
v3 74.22 ms (-73%) 0.105 ms 8672.83 KB (-99%)
v2 string-fasta 387.8 ms 2.55 ms 755.15 MB
v3 159.71 ms (-59%) 0.459 ms 104781.26 KB (-86%)
v2 string-tagcloud 366.7 ms 25.90 ms 1035.44 MB
v3 70.38 ms (-81%) 0.245 ms 41768.32 KB (-96%)
v2 string-unpack-code 138.2 ms 1.67 ms 242.91 MB
v3 71.54 ms (-48%) 0.291 ms 73552.28 KB (-70%)
v2 strin(...)input [21] 1,113.3 ms 17.34 ms 6419.52 MB
v3 59.09 ms (-95%) 0.129 ms 20684.41 KB (-100%)

What's Changed

The full pull request list for v3.

  • Better error from scripts. by @ayende in #408
  • Allow host to handle unknown references by @ayende in #410
  • Implement TypeReference.HasInstance by @tylerjwatson in #422
  • Fix build on clean environment by @dkornaus in #425
  • Targeting netstandard 2.0 also by @sebastienros in #427
  • Fix class name typo by @jokin in #428
  • Fixing Date.getHours by @sebastienros in #432
  • Supporting big hex literal by @sebastienros in #435
  • padStart and padEnd #429 by @WestDiscGolf in #434
  • Convert Jint.Benchmark to use BenchmarkDotNet by @lahma in #445
  • Message may not be a string by @yinyue200 in #444
  • Missing support for String.prototype.startsWith by @WestDiscGolf in #441
  • Adding Symbol object by @sebastienros in #446
  • add more benchmarks by @lahma in #447
  • Cache common int to string conversions by @lahma in #449
  • Use struct for DiyFp by @lahma in #450
  • Optimize EvaluateMemberExpression when targeting static member by @lahma in #453
  • Cache common JsValue allocations by @lahma in #456
  • Make ObjectInstance MruPropertyCache2 dictionary lazy by @lahma in #454
  • Reduce memory allocations by @lahma in #452
  • Optimize array access and add ability to hint array size by @lahma in #455
  • Reduce string operations memory allocations by @lahma in #457
  • Optimize DeclarativeEnvironmentRecord by @lahma in #458
  • Fix issues with parsing knockout-3.4.0.js and lodash.min.js by @lahma in #460
  • Introduce IPropertyDescriptor and specialized descriptors by @lahma in #461
  • Fix string.split and array.join performance by @lahma in #462
  • Introduce JsString, JsBoolean etc and support efficient string concatenation by @lahma in #463
  • Upgrade Esprima and BenchmarkDotNet by @lahma in #468
  • Fixing DatePrototype.MakeDay by @victor-sushko in #467
  • Can return correct error message without a referenced name by @yinyue200 in #466
  • Should allow invoke a function value with a null argument by @yinyue200 in #465
  • #451 string comparison related performance improvements by @lahma in #470
  • Release new beta by @sebastienros in #471
  • #451 remove tail recursion and faster environment records by @lahma in #475
  • fix cached data structures to be thread-local by @lahma in #476
  • Revert back to MruPropertyCache2 with _set field by @lahma in #478
  • Merge dev to rel/3.0-beta by @sebastienros in #477
  • Introduce object pooling by @lahma in #479
  • #451 prefer for over foreach when iterating Lists by @lahma in #483
  • fixed bug #436 by @pranayrauthu in #484
  • JsString multiple concatination fails by @pitMobile in #486
  • Release new beta by @sebastienros in #493
  • #451 optimize evaluation performance by @lahma in #494
  • Optimize PropertyDescriptor with flags by @lahma in #495
  • Added Enumerator for Array Instance by @pranayrauthu in #485
  • Math specification conformance by @sebastienros in #433
  • Reduce virtual calls and optimize JsValue equality checks by @lahma in #497
  • fix for issue #351 by @pranayrauthu in #499
  • Allow creating an array instance based on existing PropertyDescriptor array/dictionary by @maximburyak in #498
  • Tweak hot paths by @lahma in #464
  • #451 optimize array handling by @lahma in #501
  • Make execution context struct and other performance tweaks by @lahma in #502
  • #451 don't allocate date formats each time dates are being parsed by @lahma in #512
  • #451 faster code paths for JsString.Create by @lahma in #511
  • #473. Fixed NRE on comparison CLR and JS objects. by @RusKnyaz in #474
  • add memory usage limit option to Engine in #482
  • #451 cache literals by @lahma in #513
  • Use .NET Core 2.1 when running tests and clean up by @lahma in #516
  • Harmonize exception throwing by @lahma in #515
  • Optimize declarative environment record handling for functions by @lahma in #517
  • Optimize DeclarativeEnvironmentRecord by @lahma in #518
  • Optimize interop by @lahma in #519
  • Optimize object expressions and type conversions by @lahma in #521
  • Releasing new beta by @sebastienros in #524
  • Add Official ECMAScript Conformance Test Suite by @lahma in #525
  • Split EcmaTest by chapters to allow parallel execution by @lahma in #529
  • Use invariant culture in date format tests by @lahma in #532
  • Add some missing new Math methods in ECMAScript 6 by @lahma in #539
  • ES6 Map, Set and initial Iterators by @lahma in #541
  • net45 support. by @viceice in #530
  • .NET 4.5 support and more ES6 features by @sebastienros in #543
  • Add SourceLink support by @lahma in #545
  • Fixing TimeWithinDay for negative values by @sebastienros in #549
  • Upgrade Esprima and other libs, and include iterator test by @lahma in #550
  • Highlighting that Person.Name is changed from JS by @jfoshee in #551
  • StringDictionarySlim instead of Dictionary/StructDictionary by @lahma in #554
  • ES6 array functions by @lahma in #555
  • ES6 string functions by @lahma in #560
  • New release by @sebastienros in #561
  • New interpreter engine by @lahma in #559
  • Variable statement optimization by @lahma in #562
  • Revert too eager script expression based caching by @lahma in #565
  • Improve for loops, improve reported reference errors by @lahma in #566
  • Spread, rest and default by @lahma in #563
  • ES6 Math functions by @lahma in #569
  • Fix regression in StrictlyEqual by @lahma in #573
  • ES6 Template Strings by @lahma in #570
  • More intelligent method resolution by @lahma in #576
  • ES6 Number APIs by @lahma in #574
  • ES6 destructuring by @lahma in #578
  • Fixing BignumDtoa usage of DtoaBuilder.Length by @sebastienros in #580
  • Enable array-like behavior from ICollection/arrays by @lahma in #579
  • Fixes empty error message when trying to call an object like a function by @lahma in #581
  • Fixes delegates created from expressions. by @kevinarthurackerman in #585
  • Added engine parameter to IObjectConverter.TryConvert for context by @mattbrailsford in #331
  • System.NullReferenceException caused by RegExp.prototype.toString() fixed by @steffen-liersch in #593
  • Latest Esprima beta changes by @sam-lord in #595
  • Implemented IXunitSerializable by @sebastienros in #604
  • Better enum support, ObjectWrapper dependencies replaced by IObjectWrapper, SetWrapObjectHandler by @steffen-liersch in #603
  • added full support for interop with methods that have default values by @boennhoff in #597
  • Implement arrow functions by @sam-lord in #601
  • make Random() thread safety by @sxul in #596
  • Add CLR write allowed option to engine by @Arshia001 in #575
  • ES6 Object Literals by @lahma in #605
  • Don't allow changes to shared Undefined property descriptor by @lahma in #606
  • Upgrade Esprima to 1.0.0-beta-1186 by @lahma in #610
  • New release by @sebastienros in #611
  • Add 'load(...)' for REPL by @atifaziz in #613
  • Fix for NullReferenceException reported in #619 by @alexmg in #620
  • fixes #615 improve engine creation performance by @lahma in #625
  • Timeout for regex. by @SebastianStehle in #621
  • Regex can get into infinite loop by @lahma in #626
  • Fix insufficient Date constructor argument validation by @lahma in #627
  • Improve JintUpdateExpression error handling by @lahma in #628
  • Catch block doesn't catch error thrown by JSON.parse by @lahma in #629
  • Fixes #537 interop with ConcatenatedString can throw exception by @lahma in #630
  • Number.toPrecision throws between 26 & 100 by @lahma in #631
  • Fixed: Calling Array.prototype.toString() with anything other than a … by @miroslav22 in #641
  • Fixed RegExp.toString() throws a NullReferenceException if not called… by @miroslav22 in #640
  • PropertyInfoDescriptor exception handling added; ExceptionHelper.ThrowMeaningfulException introduced by @steffen-liersch in #612
  • Use Key to refer to properties and cache hash code by @lahma in #634
  • DatePrototype to(x)String methods called with NaN value throw excepti… by @miroslav22 in #639
  • [WIP] Added support for anonymous objects. by @MeikelLP in #637
  • allow overriding default clr type converter by @viceice in #654
  • Fix array indexing with empty string by @lahma in #660
  • Update SourceLink.GitHub in Directory.Build.props by @stevehalliwell in #646
  • Updated esprima-dotnet reference by @ahmetkakici in #664
  • Don't use Esprima's AST to cache call expression data by @lahma in #668
  • Switch to Visual Studio 2019 and .NET Core 3 test runner by @lahma in #669
  • Fix StringDictionarySlim enumeration after first item delete by @lahma in #677
  • Separate InternalTypes to allow integer operation optimizations by @lahma in #672
  • Share common base class for exceptions by @lahma in #679
  • Reflect and Proxy APIs by @lahma in #681
  • Fix broken link in README by @dimaaan in #685
  • Improve date handling and enable 262 tests by @lahma in #690
  • Ensure string immutability on assignment by @lahma in #694
  • Removing some optimizations to prepare for refactoring by @sebastienros in #680
  • Fix string indexing detecting string starting with $ as NaN and thus 0 by @lahma in #699
  • Enable Symbol and RegExp tests and fix issues by @lahma in #693
  • Function call performance improvements by @lahma in #703
  • Use JsValue for property access by @lahma in #701
  • Add current memory usage to debug information by @ceifa in #705
  • Fix possible NRE in CallStackElement construction by @lahma in #708
  • Fix array indexing with hex literal by @lahma in #711
  • Upgrade to Esprima 1.0.1270 by @lahma in #712
  • Implement some missing Object functionality by @lahma in #713
  • Fix assigning to Nullable Enum by @KurtGokhan in #715
  • Assignment fixes and more tests by @lahma in #716
  • Execution constraints by @SebastianStehle in #709
  • Don't throw when CLR indexer not found by @sebastienros in #718
  • ES6 for-of by @lahma in #577
  • Ability to set Array.prototype as prototype for array-like object wrappers by @lahma in #721
  • Fix infinite recursion possibility in call stack string building by @lahma in #723
  • Only mark array-like if Count or Length present by @lahma in #726
  • Support let and const by @lahma in #722
  • Propagate interop exceptions from IndexDescriptor by @lahma in #728
  • Tick let/const in readme by @lahma in #737
  • Support passing a dictionary inside an object by @cschwarz in #740
  • Optimize global identifier access a bit and reduce allocations by @lahma in #741
  • EnsureCapacity can throw if called against sparse mode array by @lahma in #746
  • Enable function tests by @lahma in #736
  • Support object wrapper iterator by @lahma in #749
  • Harmonize property iteration for ObjectWrapper by @lahma in #750
  • Create DefaultReferenceResolver by @lahma in #752
  • Provide engine instance when customizing options by @lahma in #751
  • Provide a way to override interop members by @sebastienros in #758
  • Add protected function instance constructor by @viceice in #759
  • Check if length has been initialized in ArrayInstance.GetLength by @lahma in #761
  • Fix Date's NaN JSON.stringify by @lahma in #764
  • Don't use BlockStatement to model function body by @lahma in #771
  • Follow the BoundNames spec in BlockDeclarationInstantiation by @lahma in #774
  • Enable skipped let/const tests by @lahma in #775
  • Adding constructor with existing options by @sebastienros in #762
  • Use a more specific exception in the CancellationConstraint class by @Taritsyn in #769
  • Prefer indexing and custom properties over indexer property by @lahma in #773
  • Publish symbol package by @lahma in #786
  • Fix indexer value conversion by @lahma in #792
  • Improve error handling for JToken property access by @lahma in #796
  • Change invalid ICallable to throw TypeError instead of ArgumentException by @lahma in #794
  • Fix indexing JArray / faster IList indexing by @lahma in #798
  • Publish symbols on rel/3.0-beta by @lahma in #800
  • Optimize interop, use NET5 to run tests by @lahma in #803
  • Debugger improvements #2 by @Jither in #810
  • Support extension methods by @lahma in #812
  • Implementing stable sort by @sebastienros in #809
  • Generate file version, remove Common.props by @lahma in #813
  • Prioritize Non-Generic methods by @windischb in #815
  • Support nullish coalescing by @lahma in #817
  • Fix JSON serialization logic to adhere to latest specification by @lahma in #820
  • Stack traces for JS exceptions by @lahma in #821
  • Allow calling Proxy revoke method without this context by @KurtGokhan in #822
  • Class support by @lahma in #816
  • Fix JSON parser line number initialization by @lahma in #827
  • Upgrade Esprima to 2.0.0-beta-1338 by @lahma in #830
  • Fix unescape at end of string by @lahma in #831
  • Update README.md by @lahma in #833
  • Gracefully handle recursive engine invocations by @lahma in #837
  • Implement Array.prototype.flat and Array.prototype.flatMap by @lahma in #834
  • Basic support for DynamicObject by @lahma in #842
  • Fix IIFE stack trace by @lahma in #841
  • Improve enum overload matching and interop by @lahma in #843
  • Fix flatMap mapper function handling by @lahma in #844
  • Should not wrap Type instances as TypeReference by default by @lahma in #845
  • Allow delegates to return values from .NET by @derekdiamond in #854
  • Tests of CallStack unwinding after caught exception (and quick patch) by @Jither in #853
  • Debugger improvements 3 by @Jither in #852
  • Allow access to declared Members on DynamicObject by @windischb in #858
  • Support ExpandoObject in EnumerateOwnPropertyKeys by @lahma in #862
  • Don't override existing prototype functions with extension methods by @lahma in #861
  • Fix exception propagation from .NET constructors by @lahma in #860
  • Fix block-scoped function registrations by @lahma in #859
  • Fix detecting extension method when there are none by @KurtGokhan in #866
  • Override Protoype Functions by @windischb in #872
  • Support converting js function into any delegate. by @Dogwei in #864
  • Fix missing NewTarget handling for basic types by @lahma in #875
  • Implement Equals and GetHashCode for ObjectWrapper by @lahma in #880
  • Fix Invoke logic and object coercion by @lahma in #883
  • Fix instanceof logic to comply with specification by @lahma in #884
  • Don't match explicit indexer properties when finding accessor by @lahma in #886
  • Run engine tests by @sebastienros in #892
  • Fix Map and Set call validation by @lahma in #895
  • Implement Operator Overloading by @KurtGokhan in #893
  • Promise lets go again by @twop in #889
  • Improve generic extension methods and Linq interop by @KurtGokhan in #896
  • Add support for Optional Chaining by @lahma in #881
  • Allow tabs in property names when parsing JSON by @lahma in #898
  • Introduce Engine.Evaluate by @lahma in #899
  • Support optional catch binding by @lahma in #900
  • Remove LexicalEnvironment by @lahma in #901
  • Fix ToInt32 conversion by @jfd16 in #902
  • Implement Error stack property by @KurtGokhan in #904
  • Parse scripts only once while testing by @lahma in #910
  • Implement WeakMap and WeakSet by @jfd16 in #912
  • Fix Promise.all behavior under interop by @lahma in #911
  • Refactor internals to support realm concept by @lahma in #907
  • Update ArrayBuffer, DataView and TypedArray related tests by @lahma in #926
  • Fix Array.from, entries, spread and other iterator related methods by @KurtGokhan in #927
  • Add iterator prototype tests by @lahma in #928
  • Add ArrayBuffer and DataView by @lahma in #930
  • Typed arrays by @lahma in #925
  • Enable more tests by @lahma in #932
  • Do not throw error immediately when receiving null Regex from Esprima by @KurtGokhan in #931
  • Harmonize iterator prototype intrinsics to follow spec by @lahma in #933
  • Check cyclic references when evaluating ToObject by @lahma in #936
  • Allow overloading assignment operators by @KurtGokhan in #944
  • Fix double evaluation when Operator Overloading is enabled by @n1xx1 in #945
  • Introduce TypeResolver with member filter and name comparer by @lahma in #951
  • Support ES2021 Logical Assignment by @lahma in #953
  • Fix eval and function constructor failing for object literals with proto prop by @KurtGokhan in #948
  • Ensure consuming works from C# language version 8 by @lahma in #954
  • Refactor options and add MaxArraySize constraint by @lahma in #923
  • Fix extension and class methods being enumerated by @KurtGokhan in #959
  • Implement Object.hasOwn by @KurtGokhan in #960
  • Ensure to use same JintFunctionDefinition instance when possible by @lahma in #964
  • Capture original exception stacktrace in ThrowMeaningfulException by @caseyzhang123 in #965
  • Fix iteration in interop by @lahma in #967
  • Add typed array helpers for IsArray and AsArray by @lahma in #971
  • Allow controlling exposed names for interop members by @lahma in #974
  • Fix handling of member expression as object property key by @lahma in #975
  • Configurable value coercion under interop by @lahma in #973
  • Update generator and module/export/import related tests by @lahma in #978
  • Always set ObjectInstance prototype by default by @lahma in #982
  • Introduce EvaluationContext for statement and expression evaluation by @lahma in #979
  • Implement relative indexing proposal [at() method] by @KurtGokhan in #985
  • Reset constraints between Engine.Invoke calls by @lahma in #986
  • Fix double evaluation of typeof operator by @KurtGokhan in #987
  • Check ExceptionHandler if type conversion fails by @lahma in #988
  • Implement Error cause and other Error specs by @KurtGokhan in #992
  • Prevent GetType and System.Reflection namespace under interop by default by @lahma in #994
  • Fix ExpandoObject serialization by @sebastienros in #996
  • Remove IIterator interface by @lahma in #1000
  • Generic string-keyed dictionary indexing under interop by @lahma in #1002
  • Fix JSON.stringify for Lists by @lahma in #1006
  • Upgrade infrastructure to .NET 6 by @lahma in #1007
  • Improve stringify for JObject by @lahma in #1009
  • Add IConvertible handling for DateTime and empty/dbnull by @lahma in #1010
  • Improve operator overloading logic by @lahma in #1011
  • Upgrade Esprima to version 2.0.4 by @lahma in #1015
  • Fix NullReferenceException in RegExp.prototype.source by @lahma in #1022
  • Let exceptions bubble from ReflectionAccessor by @lahma in #1023
  • Anonymous lambda should have empty function name by @lahma in #1024
  • Run SunSpiderTests("controlflow-recursive.js") only in release mode by @lahma in #1025
  • Array.sort should obey execution constraints by @lahma in #1026
  • ES2020 BigInt by @lahma in #1027
  • Module loading support by @pluethi1 in #990
  • added int vs float diff for function overloads by @CreepGin in #1036
  • Fix JSON-serialization issues (function-valued properties) by @resnickj in #1037
  • Fix some unicode tests by @sebastienros in #1033
  • Fix JsonParser error behavior by @resnickj in #1038
  • Fix issues uncovered by latest test262 suite by @lahma in #1040
  • Fix script-level strict mode handling by @lahma in #1043
  • Bound function should not inherit from FunctionInstance by @lahma in #1044
  • Fix issues related to JSON, Math, RegExp and Proxy by @lahma in #1045
  • Allowing to use nullable propagation on callables again. Fixed #1041 by @ayende in #1042
  • Add Engine.Construct method by @lahma in #1047
  • Allow JS class to extend CLR type by @lahma in #1049
  • Update ECMAScript feature status, include ES2021 by @lahma in #1052
  • Fix more issues related to built-in objects by @lahma in #1053
  • Fix issues when running on ARM architecture by @lahma in #1061
  • Various Interop fixes by @KurtGokhan in #1063
  • Implement array find from last by @lahma in #1070
  • Fix some error related issues by @lahma in #1071
  • Fix iterator prototype and Reflect/Proxy issues by @lahma in #1072
  • Fix BigInt loose equality by @lahma in #1073
  • Improve function interop by @KurtGokhan in #1074
  • Date.parse should default to local time by @shlomo-ildar in #1083
  • Fix integer addition/subtraction overflow by @conicgames in #1091
  • Fix reference checks after delete by @lahma in #1095
  • Support ECMAScript modules (export/import statements, modules definition) by @christianrondeau in #1054
  • Explicit/implicit cast operator search should check parameter type by @lahma in #1098
  • Always allow operator overloaded conversion by @lahma in #1099
  • Allow JavaScriptException to be subclassed in #1093
  • Fix class declaration hoisting and typeof double-evaluation by @lahma in #1104
  • Add .editorconfig by @lahma in #1105
  • Module support fixes and improvements by @christianrondeau in #1102
  • Add support for generic methods under interop in #1103
  • Generic Methods: better generic method support. in #1106
  • Debugger improvements 4b by @Jither in #1113
  • Use Test262Harness to run tests by @lahma in #1039
  • Delete Jint.Tests.Ecma by @lahma in #1116
  • Delete obsolete Jint.Tests.Test262 files by @lahma in #1117
  • Change Jint.Tests.CommonScripts run with NUnit by @lahma in #1118
  • Date related fixes and improvements by @lahma in #1107
  • Add default iterator prototype for IteratorInstance by @lahma in #1126
  • Improve dictionary based CLR interop by @lahma in #1127
  • Allow adding symbol properties to CLR objects by @lahma in #1131
  • Update build.yml by @lahma in #1132
  • Support custom CLR object creator for ObjectInstance.ToObject by @lahma in #1140
  • Improve method scoring logic between double and float by @lahma in #1143
  • Fix array performance regression by @lahma in #1148
  • Hide Call method from public API by @lahma in #1062
  • Make Engine implement IDisposable by @lahma in #1153
  • Update README.md by @lahma in #1149
  • Update test262 to latest and fix issues by @lahma in #1151
  • Implement String.prototype.replaceAll by @lahma in #1155
  • Add ScriptOrModule to FunctionInstance by @lahma in #1156
  • Add prism test with c# by @sebastienros in #1157
  • Fix JSON indentation by @resnickj in #1158
  • Fix JsonParser not able to parse "\u0000" by @Genteure in #1160
  • Make JsonParser escape character parsing more strict by @Genteure in #1161
  • Fix TimeoutInterval crashing ImportModule by @christianrondeau in #1165
  • Fix inheriting from TypeReference backed interop type by @lahma in #1168
  • Improve class constructor error reporting by @lahma in #1169
  • Bring function construction closer to the spec by @lahma in #1170
  • Remove unnecessary ObjectClass types by @lahma in #1172
  • Add import.meta support by @lahma in #1173
  • Implement ShadowRealm by @lahma in #1174
  • Implement AggregateError by @lahma in #1175
  • Fix GetOwnPropertyKeys canonical array index handling by @lahma in #1184
  • Keep C# stack trace in exceptions thrown in JS, provide JS stack in inner exception instead by @christianrondeau in #1171
  • Update Test262Harness and other test project dependencies by @lahma in #1185
  • Fix smallest index handling against collection under interop by @lahma in #1190
  • Added the ability to catch the CLR exception from an overridden arithmetic operator. by @AndrewLityagin in #1191
  • Upgrade Esprima to 3.0.0-beta-2 by @lahma in #1195
  • Generate test262 test cases on build if missing by @lahma in #1200
  • Implement defineGetter and defineSetter by @lahma in #1203
  • Update demo video link by @victorhnogueira in #1204
  • Decode import URI before using it as a file name by @fluffware in #1206
  • Improve null handling in generic parameter resolution logic by @lahma in #1209
  • Fix missing evaluation context in constructor by @KurtGokhan in #1212
  • Fix interop stack trace unwind (#1202) by @resnickj in #1213
  • Fix params array type handling under interop by @lahma in #1216
  • Exclude Error constructor from stack trace by @resnickj in #1217
  • Implement well-formed-json-stringify by @lahma in #1220
  • Create sample how to JSON.stringify CLR types by @lahma in #1226
  • Maintain ObjectWrapper identity by @lahma in #1227
  • Improve parseInt logic by @lahma in #1229
  • Enable implicit usings by @lahma in #1230
  • Add intermediary prototype for TypeReference by @lahma in #1231
  • Fix optional member call by @lahma in #1233
  • Direct C# interop replacing default serializing in JsonSerializer by @ajdust in #1232
  • Upgrade to Esprima 3.0.0-beta-3 by @lahma in #1235
  • Enable nullable reference types by default by @lahma in #1237
  • Implement WeakRef by @lahma in #1242
  • Fix call stack pop to account for stack being reset by @lahma in #1243
  • Rethrow CLR function exceptions as JS errors by @christianrondeau in #1246
  • Removed ProxyInstance ToString override so calls the property 'toString' by @omegatmm in #1250
  • Upgrade to Esprima 3.0.0-beta-4 by @lahma in #1251
  • Upgrade to Esprima 3.0.0-beta-5 by @lahma in #1260
  • Fix Regex Iterator by @vicr123 in #1264
  • Reduce stack frame size during Call and Construct by @lahma in #1267
  • Upgrade to Esprima 3.0.0-beta-6 by @lahma in #1268
  • Improve recursion performance v1 by @lahma in #1269
  • Slim down Completion and ExpressionResult struct sizes by @lahma in #1270
  • Improve error location reporting by @lahma in #1273
  • Fix array method scoring under interop by @lahma in #1274
  • Include inherited static members in interop member search by @lahma in #1275
  • More tweaks to reduce call stack size by @lahma in #1277
  • Upgrade benchmark project and add YantraJS by @lahma in #1276
  • Improve global object setup and access performance by @lahma in #1280
  • Optimize new Date() by @lahma in #1281
  • Reduce memory allocations in function calls by @lahma in #1282
  • Restructure benchmarks by @lahma in #1283
  • Fix array performance regression by @lahma in #1284
  • Call Dispose on enumerator (#1285) by @jm-merle in #1286
  • Make BindFunctionInstance public by @paynesworld in #1288
  • Upgrade to Esprima 3.0.0-beta-7 by @lahma in #1289
  • Open some API and create public API tests for compatibility by @lahma in #1290
  • Move data from Completion and ExpressionResult to context by @lahma in #1291
  • Remove ExpressionResult by @lahma in #1292
  • Reduce Engine references in expressions by @lahma in #1293
  • Restore public access to JavaScriptException ctor by @Genteure in #1295
  • Update benchmark results by @lahma in #1294
  • Add ability to prepare and reuse module code by @libaowei in #1300
  • Add SkipLocalsInit attribute by @lahma in #1303
  • Upgrade to latest test262 suite and fix issues by @lahma in #1304
  • Implement Array.group and Array.groupToMap by @lahma in #1306
  • Enable some tests that work now correctly, minor fixes by @lahma in #1307
  • Implement RegExp named capture groups by @lahma in #1309
  • Implement RegExp match indices by @lahma in #1310
  • Implement Promise.any by @KurtGokhan in #1312
  • Reduce memory allocations in array handling by @lahma in #1314
  • Update benchmark results by @lahma in #1315
  • Implement Promise.allSettled by @KurtGokhan in #1316
  • Upgrade to Esprima 3.0.0-beta-9 by @lahma in #1317
  • Fix some Object static methods returning wrong value by @KurtGokhan in #1318
  • Fix toPrimitive evaluating multiple times during "in" expression by @KurtGokhan in #1319
  • Fix error stack handling when last syntax node is not present by @lahma in #1322
  • Implement async/await by @lahma in #1323
  • Fix TaggedTemplate issues by @lahma in #1324
  • Fix array issues by @lahma in #1325
  • Make object wrapper cache hold ObjectInstance type by @libaowei in #1326
  • Implement FinalizationRegistry by @lahma in #1328
  • Cache wrapped object returned by WrapObjectHandler by @Genteure in #1327
  • Fix some prototype chain issues uncovered by compat-table by @lahma in #1334
  • Fix ToPropertyDescriptor Proxy issues by @lahma in #1335
  • Fix default date constructor to clip decimal part by @lahma in #1340
  • Allow deleting dictionary entries via interop by @lahma in #1341
  • Add decimal support under type conversion by @lahma in #1342
  • Fix some class handling issues by @lahma in #1346
  • Fix some array issues uncovered by compat-table tests by @lahma in #1347
  • Fix ArrayPatternProtocol indexing for function parameters by @lahma in #1348
  • Fix some remaining function parameter destructuring issues by @lahma in #1349
  • PublicInterface test for CancellationConstraint.Reset by @EnCey in #1350
  • Add easier APIs for interop usage by @lahma in #1351
  • Improve array interop API by @lahma in #1352
  • Fix some proxy issues by @lahma in #1353
  • Unify and cleanup API by @lahma in #1355
  • Optimize plain object access by @lahma in #1356
  • Allow configuring TypeReference target instance creator by @lahma in #1357
  • Small performance optimization to string handling by @lahma in #1358
  • Fix nested object member destructuring by @lahma in #1359
  • Fix JsArray(PropertyDescriptor[]) to initialize prototype by @lahma in #1360
  • Add ArrayInstance underlying array conversion when needed by @lahma in #1361
  • Cleanup and expose shadow realm API by @lahma in #1362
  • Optimize iterators a bit by @lahma in #1363
  • Update to latest test262 suite and implement Symbols as WeakMap keys by @lahma in #1365
  • Implement change Array by copy by @lahma in #1366
  • Fix some switch/case logic issues by @lahma in #1367
  • Fix some problems revealed by test262 suite by @lahma in #1371
  • Add Loaded event to DefaultModuleLoader by @Jither in #1373
  • Module-related debugger improvements by @Jither in #1374
  • Add support for constructors with default parameters by @cschwarz in #1383
  • Debugger API improvements by @Jither in #1382
  • Improve property selection for setting value under interop by @lahma in #1389
  • Update GitHub Actions checkout to v3 by @lahma in #1390
  • Fix switch's case block lexical scope handling by @lahma in #1392
  • Improve parseFloat performance and number range by @lahma in #1396
  • Fix nullable annotation of Engine.Invoke arguments by @mus65 in #1403
  • Improved support for defining custom JsString deriving type by @lahma in #1404
  • Upgrade to Esprima 3.0.0-beta-10 by @lahma in #1405
  • Ensure support for custom null and undefined by @lahma in #1407
  • Clear interop identity tracking ConditionalWeakTable in Engine.Dispose by @lahma in #1408
  • Fix string indexOf for empty string by @lahma in #1414
  • Support configuring whether dynamic (eval) JavaScript code is allowed by @lahma in #1416
  • Fix ArrayInstance.GetOwnProperties with typed dense array by @lahma in #1420
  • Improve and cleanup iterators a bit by @lahma in #1422
  • Fix template literal object to string handling by @lahma in #1423
  • Change JsDate.ToString to follow Date prototype logic by @lahma in #1425
  • Improve date parsing by utilizing MimeKit logic by @lahma in #1434
  • Change TypeResolver cache to be bound to engine instance by @lahma in #1436
  • Return storage of last syntax node to engine instance by @lahma in #1437
  • Add support for checking constraints from engine by @lahma in #1438
  • Use explicit project parameter in dotnet pack by @lahma in #1439
  • Add public type Constructor by @lahma in #1440
  • Don't require Realm in Constructor public constructor by @lahma in #1441
  • Ensure DateTime.MinValue can be passed via interop by @lahma in #1442
  • Fixes to Array.from behavior against primitive type by @lahma in #1449
  • Fix await propagation against primitive value by @lahma in #1450
  • Support template literals as keys by @lahma in #1452
  • Fix RegExp.prototype.source double-escape by @lahma in #1455
  • Disallow unsafe floating point conversion caching by @lahma in #1456
  • Engine.SetValue accepts a nullable object. by @czema in #1458
  • Improve DefaultTypeConverter by @lahma in #1461
  • Upgrade to Esprima 3.0.0-rc-01 by @lahma in #1464
  • Fix race condition in sharing of function state by @lahma in #1465
  • Disable object identity tracking by default under interop by @lahma in #1466
  • Handle Symbol.toPrimitive and valueOf calls better under interop by @lahma in #1470
  • Fix ambiguous JsValueExtensions.Call overload by @lahma in #1474
  • Improve date handling and time zone support by @lahma in #1446
  • Support configuring kind of JsDate produced DateTime by @lahma in #1481
  • Create ITimeSystem abstraction for date parsing/time zone logic by @lahma in #1488
  • Add some API documentation and note about thread-safety by @lahma in #1489
  • Fix Engine.SetValue(string, string) to check for null value by @lahma in #1490
  • Remove floating point precision loss checks under interop by @lahma in #1491
  • Create base constructs for Intl support by @lahma in #1492
  • Remove implicit using for System.Linq by @lahma in #1493
  • Upgrade packages to latest versions by @lahma in #1494
  • JSON.parse optimizations, refactoring, DoS-attack prevention by @tomatosalat0 in #1485
  • Use latest test262 suite and fix/implement accordingly by @lahma in #1497
  • Add Options extension method for DisableStringCompilation by @lahma in #1498
  • Introduce Advanced API and ProcessTasks by @lahma in #1499
  • Don't call CatchClrExceptions for JavaScriptExceptions by @lahma in #1502
  • Add issue templates by @lahma in #1503
  • Remove some tests from exclude and fix accordingly by @lahma in #1504
  • Optimize TypeConverter.ToNumber by using Try overloads by @lahma in #1505
  • JSON serialization refactoring and optimization by @tomatosalat0 in #1506
  • Add basic JSON parsing/serialization benchmark by @lahma in #1510
  • Add macOS runner for PR checks by @lahma in #1261
  • Support inheritance chain of CLR objects with instanceof operator by @mainlyer in #1511
  • Optimize JSON serialization by @lahma in #1512
  • Update engine comparison benchmark results by @lahma in #1513
  • Add net60 target by @lahma in #1515
  • Support optional constructor parameters under interop by @mainlyer in #1517
  • Support CLR object inheritance chain with prototypes by @mainlyer in #1518
  • Support params arrays in delegate invocation by @mainlyer in #1520
  • Throw real JavascriptException location on Module by @huanent in #1522
  • JSON serialization performance improvement by @tomatosalat0 in #1527
  • Fix overloaded constructor selection under interop by @lahma in #1543
  • ES2022 Class fields and static blocks by @lahma in #1546
  • Set AllowReturnOutsideFunction to true for PrepareScript by @lahma in #1550
  • Enable top-level await tests and fix issues by @lahma in #1552
  • Mark "export * as ns from" as supported by @lahma in #1553
  • Update README.md to reflect ES2023 by @lahma in #1554
  • Update README.md by @lahma in #1556
  • Adjust Engine.SetValue(string, string?) to accept null value. by @czema in #1559
  • Fix conditional compilation checks to account for NET 6.0 by @lahma in #1563
  • Store identifier in local by @TechPizzaDev in #1565
  • Fix constructor argument matching under interop by @lahma in #1568
  • Avoiding Mono's ParameterInfo[].AsSpan() bug by @CreepGin in #1571
  • Experimental Stackguard by @Xicy in #1566
  • Readme Module section update by @Zmarfan in #1587
  • Update test262 test suite and fix issues by @lahma in #1589
  • Rename ArrayBufferInstance to JsArrayBuffer and make it public by @lahma in #1591
  • Rename TypedArrayInstance to JsTypedArray by @lahma in #1592
  • Rename DataViewInstance to JsDataView by @lahma in #1593
  • Make ArgumentsInstance internal by @lahma in #1594
  • Rename RegExpInstance to JsRegExp by @lahma in #1595
  • Upgrade to Esprima 3.0.0-rc-03 by @lahma in #1596
  • Rename thisObj to thisObject and args as arguments in parameter names by @lahma in #1597
  • Rename WeakSetInstance to JsWeakSet by @lahma in #1598
  • Rename WeakMapInstance to JsWeakMap by @lahma in #1599
  • Rename SetInstance to JsSet by @lahma in #1600
  • Rename MapInstance to JsMap by @lahma in #1601
  • Rename WeakRefInstance to JsWeakRef by @lahma in #1602
  • Rename ProxyInstance to JsProxy by @lahma in #1604
  • Rename PromiseInstance to JsPromise by @lahma in #1605
  • Implement workarounds for regex parsing known issues by @adams85 in #1603
  • Added readonly modifier to fields that aren't being changed by @Lehonti in #1610
  • Support explicit interface and hidden member of super class by @viruscamp in #1613
  • Fix capturing group numbering bug and a few more regex-related issues by @adams85 in #1614
  • More improvements for CLR Interop by @viruscamp in #1616
  • Optimize engine construction by @lahma in #1621
  • Improve array access performance by @lahma in #1625
  • Update benchmark results and packages by @lahma in #1622
  • Interface type wrapper can call object methods. by @viruscamp in #1629
  • Upgrade to Esprima 3.0.0 by @lahma in #1630
  • Upgrade to Esprima 3.0.1 by @lahma in #1635
  • fix interface methods by @hyzx86 in #1638
  • Fixed rest/spread bug with empty object by @CreepGin in #1642
  • Experimental - Task to Promise conversion by @Xicy in #1567
  • Proxy on clr by @viruscamp in #1645
  • Added support to convert JsTypedArray when converting objects. by @graphnode in #1646
  • Optimize URI decode and encode by @lahma in #1647
  • PropertyDescriptor improvements by @viruscamp in #1648
  • #1573 - added convenience API by @gentledepp in #1574
  • Implement Promise.withResolvers and update test suite by @lahma in #1650
  • Add fast path without try-catch for CLR function call by @lahma in #1651
  • Remove exposed CLR type equality requirement from ObjectWrapper.Equals by @lahma in #1652
  • Include interface's extended interfaces in interop property search by @lahma in #1654
  • Allow registering symbols to TypeReference by @lahma in #1655
  • Add better debugger view support via debugger attributes by @lahma in #1656
  • Keep track of MethodInfoFunctionInstance's target object by @lahma in #1658
  • Track TypeReference registrations and use as prototype by @lahma in #1661
  • Account for possible integer indexers when searching for IndexerAccessor by @lahma in #1662
  • Create a sample for System.Text.Json interop by @lahma in #1663
  • Convert to Central Package Management by @lahma in #1664
  • Fix parsing of empty date string by @lahma in #1666
  • Update System.Text.Json sample to handle writes by @lahma in #1668
  • Support prioritizing indexers by @lahma in #1669
  • Upgrade NuGet packages by @lahma in #1670
  • Cache more script-global information when preparing AST by @lahma in #1671
  • Upgrade to Esprima 3.0.2 by @lahma in #1672
  • Update benchmark results by @lahma in #1673
  • JsProxy should return proxied target's ToObject via ToObject by @lahma in #1675
  • Improve ParseArrayIndex when property is length by @lahma in #1676
  • Move expression initialize to expression implementation by @lahma in #1677
  • Support caching of string instances in script preparation by @lahma in #1678
  • Optimize Array.pop by @lahma in #1680
  • Enable code analysis with latest-Recommended by @lahma in #1681
  • Enable Meziantou.Analyzer by @lahma in #1682
  • Limit PrepareScript string caching to length 10 or less by @lahma in #1683
  • Code changes to keep NET 8 analyzers happy by @lahma in #1685
  • Refine interop member search with readable/writable requirement by @lahma in #1687
  • Add README.md to NuGet package by @lahma in #1688
  • Package XML documentation by @lahma in #1689
  • Fix test script resolution to work with NET 8 artifacts output by @lahma in #1690
  • Add NET 8 support by @lahma in #1686
  • Use arguments in Number.toLocaleString by @LuisMerinoP in #1619
  • Update benchmark results for NET 8 by @lahma in #1691
  • Update test suite and implement Set.union by @lahma in #1692
  • Upgrade to NUnit 4 by @lahma in #1694
  • Return old recursion limit capabilities by @lahma in #1695
  • Optimize String.fromCodePoint by @lahma in #1696
  • Replace StringBuilderPool with ValueStringBuilder by @lahma in #1697
  • Further optimize Dtoa and string building by @lahma in #1698
  • Ensure proper ValueStringBuilder dispose when needed by @lahma in #1699
  • Add GetUtcNow to ITimeSystem by @ejsmith in #1701
  • Groundwork for generators by @lahma in #1705
  • Upgrade Esprima to version 3.0.3 by @lahma in #1706
  • Implement resizable ArrayBuffer by @lahma in #1707
  • Adding cultural check to the "ToUpperCase" string prototype. by @LuisMerinoP in #1693
  • Implement SharedArrayBuffer by @lahma in #1708
  • Implement ArrayBuffer.transfer by @lahma in #1709
  • Implement import attributes by @lahma in #1710
  • Implement JSON modules by @lahma in #1711
  • Add Engine.Advanced.StackTrace to get current stack trace string by @lahma in #1712
  • Make JsValue implement IConvertible by @lahma in #1713
  • Unify recursion constraints between invoke and call by @lahma in #1714
  • Debug StepInto stops at beginning of arrow function by @tomatosalat0 in #1715
  • Remove Record suffix from types by @lahma in #1716
  • Move CreateDeclarativeEnvironment and FindConstraint to Engine.Advanced by @lahma in #1717
  • Remove some Instance suffixes by @lahma in #1718
  • Hide, rename and move some methods by @lahma in #1719
  • Cleanup ObjectInstance public API by @lahma in #1720
  • Rename FunctionInstance to Function by @lahma in #1721
  • Remove Engine.Realm, expose Engine.Intrinsics and Engine.Global directly by @lahma in #1722
  • Hide GlobalObject public methods by @lahma in #1723
  • Remove some unnecessary JsString allocations by @lahma in #1728
  • Add custom strategy for array read access by @lahma in #1729
  • Add fast case for single statement in a block by @lahma in #1730
  • Refactoring for custom module loader support by @tomatosalat0 in #1731
  • Make JsArguments public by @lahma in #1734
  • Internalize Environment services and use Key as name by @lahma in #1735
  • Use FNV hash for Key by @lahma in #1736
  • Replace some string usage with Key when suitable by @lahma in #1737
  • Restructure and internalize by @lahma in #1738
  • Engine execute module resolving by @tomatosalat0 in #1740
  • Implement Set Methods for JavaScript by @lahma in #1741
  • Fix generic method return type handling under interop by @lahma in #1743
  • Add ValueTask and ValueTask to Promise conversion by @wazzamatazz in #1744
  • Move Js* types to be directly under Jint.Native namespace by @lahma in #1745
  • The getDate() method returns 0 for December 31st before 1970. by @PavelPisotskiy in #1746
  • Updates for v3 RTM by @lahma in #1739

New Contributors

Full Changelog: 2.11.10...v3.0.0