|Written in||C, C++, Rust|
|Platform||IA-32, x86-64, ARM, MIPS, SPARC|
|Version||Release date||Corresponding ECMAScript version||Browser version||Added functionality|
|Old version, no longer maintained: 1.0||March 1996||Netscape Navigator 2.0|
|Old version, no longer maintained: 1.1||August 1996||Netscape Navigator 3.0|
|Old version, no longer maintained: 1.2||June 1997||Netscape Navigator 4.0 - 4.05|
|Old version, no longer maintained: 1.3||October 1998||ECMA-262 1st + 2nd edition||Netscape Navigator 4.06-4.7x|
|Old version, no longer maintained: 1.4||Netscape Server|
|Old version, no longer maintained: 1.5||November 2000||ECMA-262 3rd edition||Netscape Navigator 6, Firefox 1.0|
|Old version, no longer maintained: 1.6||November 2005||Firefox 1.5||additional array methods, array and string generics, E4X|
|Old version, no longer maintained: 1.7||October 2006||Firefox 2.0||iterators and generators, let statement, array comprehensions, destructuring assignment|
|Old version, no longer maintained: 1.8||June 2008||Firefox 3.0||generator expressions, expression closures|
|Old version, no longer maintained: 1.8.5||March 2011||ECMA-262 5th edition||Firefox 4.0||JSON support|
|Old version, no longer maintained: 1.8.8||January 2012||Firefox 10.0|
|Old version, no longer maintained: 17||November 2012||Firefox 17.0|
|Old version, no longer maintained: 24||September 2013||Firefox 24.0|
|Old version, no longer maintained: 31||July 2014||Firefox 31.0|
|Old version, no longer maintained: 38||May 2015||Firefox 38.0|
|Old version, no longer maintained: 45||March 2016||Firefox 45.0|
|Old version, no longer maintained: 52||March 2017||Firefox 52.0|
|Old version, no longer maintained: 60||May 2018||Firefox 60.0|
|Old version, no longer maintained: 68||July 2019||Firefox 68.0|
|Old version, no longer maintained: 78||June 2020||Firefox 78.0|
|Old version, no longer maintained: 91||August 2021||Firefox 91.0|
|Old version, no longer maintained: 102||June 2022||Firefox 102.0|
|Current stable version: 103||July 2022||Firefox 103.0|
Instead of compiling whole functions, TraceMonkey was a tracing JIT, which operates by recording control flow and data types during interpreter execution. This data then informed the construction of trace trees, highly specialized paths of native code.
Improvements to JägerMonkey eventually made TraceMonkey obsolete, especially with the development of the SpiderMonkey type inference engine. TraceMonkey is absent from SpiderMonkey from Firefox 11 onward.
JägerMonkey, internally named MethodJIT, was a whole-method JIT compiler designed to improve performance in cases where TraceMonkey could not generate stable native code. It was first released in Firefox 4 and eventually entirely supplanted TraceMonkey. It has itself been replaced by IonMonkey.
The difference between TraceMonkey and JägerMonkey JIT techniques and the need for both was explained in a hacks.mozilla.org article. A more in-depth explanation of the technical details was provided by Chris Leary, one of SpiderMonkey's developers, in a blog post. More technical information can be found in other developer's blogs: dvander, dmandelin.
The WarpMonkey JIT replaces the former IonMonkey engine from version 83. It is able to inline other scripts and specialize code based on the data and arguments being processed. It translates the bytecode and Inline Cache data into a Mid-level Intermediate Representation (Ion MIR) representation. This graph is transformed and optimized before being lowered to a Low-level Intermediate Representation (Ion LIR). This LIR performs register allocation and then generates native machine code in a process called Code Generation. The optimizations here assume that a script continues to see data similar what has been seen before. The Baseline JITs are essential to success here because they generate ICs that match observed data. If after a script is compiled with Warp, it encounters data that it is not prepared to handle it performs a bailout. The bailout mechanism reconstructs the native machine stack frame to match the layout used by the Baseline Interpreter and then branches to that interpreter as though we were running it all along. Building this stack frame may use special side-table saved by Warp to reconstruct values that are not otherwise available.