Repository navigation
[JSC] Ahead-of-time compilation #757
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+1,004,933
−5,222
Merged
Changes from 250 commits
Commits
Show all changes
470 commits
Select commit
Hold shift + click to select a range
a6d5b3f
AOT: count executions for type coverage
Jarred-Sumner 892f229
AOT: type coverage counts calls, and knows a rare branch
Jarred-Sumner cf122bc
AOT: constant objects
Jarred-Sumner dd4069d
AOT: types survive await, and prototypes of closed-world scopes
Jarred-Sumner b7659ac
AOT: typed arrays of unknown type, likely callees, generator frames
Jarred-Sumner 0c6bb6a
AOT: inlined closures below a scope that is never made, return values…
Jarred-Sumner cad6541
AOT: remove useAOTScopeAsCallee and useAOTEnvironmentsOnStack
Jarred-Sumner 85996cb
AOT: capture by value, saves at definitions and dead frame slots are …
Jarred-Sumner 8226361
AOT: remove useAOTFunctionSplitting and useAOTWholeFunctionSplitting
Jarred-Sumner eaeb582
AOT: closures of functions whose number does not fit in a type, remov…
Jarred-Sumner ce441cf
AOT: count scopes that are never made by lexical position
Jarred-Sumner 4bf4fd1
AOT: a function's name can be read while collecting
Jarred-Sumner 413c7cc
AOT: StackVisitor does not walk to the adapter in a VM with one instance
Jarred-Sumner d5e7760
AOT: tools that generate programs and compare the work of two builds
Jarred-Sumner f9dc315
AOT: a constant index is not taken for an address
Jarred-Sumner fc299f0
AOT: a function that cannot be compiled fails the build
Jarred-Sumner 7e4f367
AOT: fuzz-programs.py generates loops
Jarred-Sumner 138f015
AOT: fuzz-programs.py generates arithmetic
Jarred-Sumner b0da97c
AOT: test arithmetic at the edges of int32 in loops
Jarred-Sumner 53351da
AOT: an output builder of its own: folded constants, and guards dropp…
Jarred-Sumner c4b17ea
AOT: what is known about the length of typed arrays is forgotten with…
Jarred-Sumner 5d23bb9
AOT: fuzz-programs.py generates classes
Jarred-Sumner 8527409
AOT: remove twelve options that nothing sets
Jarred-Sumner 4ec4351
AOT: no memory that was never written in an image
Jarred-Sumner ea2b24a
AOT: a call that nothing has reached yet has no result and no effects
Jarred-Sumner eaa6ea7
AOT: what cannot be an object cannot be called, in type inference
Jarred-Sumner 560d360
AOT: three more steps of type inference that were not monotone
Jarred-Sumner 6a7b0e0
AOT: order scopes by their maker, not by their address
Jarred-Sumner 1cedad7
B3: do not create values in the order of a hash table of pointers
Jarred-Sumner e674b78
AOT: quote the source in errors from class field initializers
Jarred-Sumner 6bcf989
AOT: no check for a getter when reading from super
Jarred-Sumner f3478e7
AOT: restore the tests of reads from super that the last commit replaced
Jarred-Sumner 2999517
AOT: a string constant of code that runs once is not an atom
Jarred-Sumner b626bae
AOT: making the executable of a function does not start a collection
Jarred-Sumner 6d2ece5
AOT: only remember integers that can be taken for addresses
Jarred-Sumner 3624f8c
AOT: dump only one function
Jarred-Sumner c9a07ca
AOT: keep object literals that have a typed layout
Jarred-Sumner 1e83a17
AOT: do not blind constants in regular expressions compiled for an image
Jarred-Sumner a8947ad
AOT: scalar-replace object literals that have a typed layout again
Jarred-Sumner ce07c57
AOT: box a number whose type has no Int32 as a double
Jarred-Sumner bb9f1e6
AOT: no shape for an object literal that does not fit the dispatch table
Jarred-Sumner d5f69d0
AOT: validate code generation against the analysis, and that inferenc…
Jarred-Sumner ca74836
AOT: check and convert values of typed object literals returned in re…
Jarred-Sumner b13dad7
B3: Jump tables in position-independent code
Jarred-Sumner 0ade91d
AOT: Fix bugs found by comparing with DFG and FTL, add type rules and…
Jarred-Sumner 1551491
B3: Duplicate tails in position-independent procedures
Jarred-Sumner b556a1c
AOT: Fix range of a loop counter on re-entry into the fast copy
Jarred-Sumner 0a26932
AOT: Fix second batch of bugs found by auditing
Jarred-Sumner 2b899c1
AOT: Keep caches of rarely run code filled, add operation counters
Jarred-Sumner 5c200dd
AOT: Keep the code of functions that only construct code creates
Jarred-Sumner 2a82a17
AOT: Fix soundness bugs, lower typed array accesses, add oracles for …
Jarred-Sumner 2f8bb4d
AOT: Keep reachable traps at the end of functions, note callees from …
Jarred-Sumner 18d77da
AOT: Validate typed literals that have other names, store into typed …
Jarred-Sumner 204f9ea
AOT: Inline calls in split loops, plan construction across type check…
Jarred-Sumner 951d841
Yarr: Share equal character classes within a pattern
Jarred-Sumner 17008ff
AOT: Fix unpaired returns in call stubs
Jarred-Sumner af4d070
AOT: Stop trusting declared array types, keep type tags across handle…
Jarred-Sumner 59ba842
AOT: Prevent overriding of built-ins, fold call / apply / bind on the…
Jarred-Sumner 2cd1e7f
AOT: Run every run line of a test on its own in run-tests.py
Jarred-Sumner 4ac91d4
AOT: Fix tail calls of lowered built-ins, read constants from slots, …
Jarred-Sumner 883bb54
AOT: Do not fill a pair that the megamorphic cache has, and count mor…
Jarred-Sumner 6acbaec
AOT: Fix two wrong folds on built-in values and an inference rule tha…
Jarred-Sumner a3e13d5
AOT: Faster spreads and direct stores, verify folded branches
Jarred-Sumner 3276897
AOT: Read properties by the name recorded for a guessed slot
Jarred-Sumner fb2d765
AOT: Store by recorded names, guards over whole functions, fixes
Jarred-Sumner 967800a
AOT: Fix split loops starved by name checks, add object families
Jarred-Sumner 053953f
AOT: Find property names by hash, fix two debug-only failures
Jarred-Sumner d8cf5c1
AOT: Fix two miscompiles of guards over whole functions
Jarred-Sumner 2eaa55d
AOT: Remove the checks of recorded property names
Jarred-Sumner 33cdb5c
AOT: Fix the final graph contradicting the whole-program analysis in …
Jarred-Sumner 23d5def
AOT: Fix a test of an argument that may be empty not narrowing in an …
Jarred-Sumner b6ae515
AOT: Fix the compiler aborting when a function contradicts the analys…
Jarred-Sumner 84fd5d5
AOT: Fix a test in two steps of an argument that may be empty not nar…
Jarred-Sumner dc2a54d
AOT: Add an option that makes graphs contradict the analysis, for tes…
Jarred-Sumner c08baff
AOT: Fix validated code never checking the parameters of a function
Jarred-Sumner f3757ae
AOT: Fix builds with families depending on the order of compiler threads
Jarred-Sumner 0e3a9c4
AOT: Do not check the callee's register as a parameter in validated code
Jarred-Sumner 9edecf0
AOT: Fix a crash with useAOTTypeCoverageCounters and no aotTypeCovera…
Jarred-Sumner abd868b
AOT: Write the identifiers of a map file in order
Jarred-Sumner 794fd45
AOT: Fix validated code not checking values after the last bytecode o…
Jarred-Sumner d6e167e
AOT: Fix type inference depending on the order of compiler threads
Jarred-Sumner 33f6335
AOT: Enable guards over whole functions and families by default
Jarred-Sumner f6996af
AOT: Remove options for guards over whole functions and families
Jarred-Sumner 4516d82
AOT: Add an option to shuffle the order of type inference for testing
Jarred-Sumner 72dde0f
AOT: Fix type inference depending on order through its limit of passes
Jarred-Sumner b5be4ae
AOT: Fix cubic time of type inference on long chains of tests
Jarred-Sumner 1ce629a
AOT: Add Structures whose fields are stable or whose shape is immutable
Jarred-Sumner b683570
AOT: Fix JSON.parse's reviver storing any value into a typed field
Jarred-Sumner ed1e2a8
Merge commit '0c06faadf65bf8e8c8ad3a5a8aca83e1e9ed653f' into claude/c…
Jarred-Sumner c9f02f1
[JSC] AOT: WIP: a compiler for programs translated by their static types
Jarred-Sumner c2bd67e
Merge remote-tracking branch 'origin/main' into claude/compile-aot
Jarred-Sumner 0030946
[JSC] Don't build the table of all time zones for the first local Date
Jarred-Sumner e416019
[JSC] AOT: WIP: snapshot of the compiler for statically typed programs
Jarred-Sumner 0db3f5e
Revert "[JSC] Don't build the table of all time zones for the first l…
Jarred-Sumner a537a43
wip
Jarred-Sumner 0da0a4a
AOT: snapshot of the engine work since the last commit
Jarred-Sumner a4e9bfd
Merge main into compile-aot
Jarred-Sumner da657fe
AOT: per-realm built-in lock, dead designs removed, loader and debugg…
Jarred-Sumner 6227115
AOT: the first design's run time removed, Windows builds, fixes
Jarred-Sumner afe5bf6
AOT: live bindings, huge literals as text, the lock in sloppy code, c…
Jarred-Sumner 3cbd28f
AOT: objects born with room, fewer stack checks, smaller slow paths, …
Jarred-Sumner 5698252
AOT: a lookup table for property access by name, async generators, sm…
Jarred-Sumner 44cb391
Merge main into compile-aot
Jarred-Sumner 8805107
AOT: cheaper property access by name, typed JSON parsing, loops that …
Jarred-Sumner 7488000
AOT: plain names, smaller typed code, compiled date and number format…
Jarred-Sumner ed6cada
AOT: fix the Windows build, keep in-place conversions in bounds, fast…
Jarred-Sumner bc15181
AOT: fix the Windows ASAN build, run every marking constraint again, …
Jarred-Sumner 0ed1d74
AOT: fix the Windows build again, faster instanceof, smaller code out…
Jarred-Sumner 0ae359e
AOT: walk the stack on Windows x64, image stamp for Windows, shared g…
Jarred-Sumner f3a215c
AOT: fix the build, ship AOTTypedBuiltinLists.h with a prebuilt WebKit
Jarred-Sumner cb17232
AOT: a flat matcher for run-time RegExps, string buffers only where t…
Jarred-Sumner 4008c5f
AOT: keep the caller's registers in the front end of Object.hasOwn on…
Jarred-Sumner a2ef284
AOT: fixes for literal unions, prototypes, instanceof and the RegExp …
Jarred-Sumner d2df562
AOT: fixes from CI and from real test suites
Jarred-Sumner a4f1b23
AOT: smaller import() functions, cheaper setPrototypeOf, iterables, f…
Jarred-Sumner bf1070a
AOT: the RegExp matcher never answers when it gives up, and other fixes
Jarred-Sumner 2b9b22d
AOT: a structure's flags survive collection, JSON parsing that expect…
Jarred-Sumner fb07502
AOT: shorter string comparisons, module graphs kept apart, fewer trip…
Jarred-Sumner 42c3d09
AOT: fixes for two compiler aborts, module guards are not rare code, …
Jarred-Sumner d70450c
AOT: blocks follow the likely path, exceptions across module graphs, …
Jarred-Sumner 61ae3e8
AOT: fix the ASAN build, more call sites share one body
Jarred-Sumner 30b7133
AOT: a wait for the collector uses the conn it is handed, cheaper key…
Jarred-Sumner f2df6d5
AOT: revert the one-table keyed store, faster Object.assign on typed …
Jarred-Sumner 84c71e9
AOT: constant Sets and Maps as read-only tables, Object.create object…
Jarred-Sumner 88050aa
AOT: inline site caches in Bun's per-request modules, constant Sets t…
Jarred-Sumner 25baf35
AOT: fix converted array elements on arm64, cheaper lookups in consta…
Jarred-Sumner 845b646
AOT: four wrong answers that depended on how hot a function is
Jarred-Sumner 85e843a
AOT: the engine's own sort, plain objects read without converting, me…
Jarred-Sumner 2a26607
AOT: array method chains as one loop, plain records read in place, ta…
Jarred-Sumner 8813190
AOT: fix the Windows build, take out run-time changes that are not pa…
Jarred-Sumner 14197ac
AOT: inline caches stay in the per-request modules, cheaper checks be…
Jarred-Sumner b973b21
AOT: fused String.replace is out, cheaper sorts of typed records, loc…
Jarred-Sumner 5bb9e4b
AOT: inline caches for the hottest functions, names stored through an…
Jarred-Sumner e6c5d9a
AOT: a generated JSON parser that takes keys in any order, cheaper he…
Jarred-Sumner 49220e7
AOT: the generated JSON parser never parses nested bytes twice, undec…
Jarred-Sumner 6c16057
AOT: fix two memory-safety bugs in typed JSON, scan compressed pointe…
Jarred-Sumner 50dd4bf
AOT: remove unused code, rename internals, run the top level of built…
Jarred-Sumner b4ecf32
AOT: move code out of SlotVisitor.cpp and CachedTypes.cpp, remove unu…
Jarred-Sumner 3c35c2b
AOT: checkpoint of the rewritten compiler
Jarred-Sumner 398e876
AOT: three days of work on the rewritten compiler
Jarred-Sumner 58f2ff4
Merge branch 'main' into claude/compile-aot
Jarred-Sumner 4dc2908
Merge remote-tracking branch 'origin/main' into claude/compile-aot-merge
Jarred-Sumner 46c28b0
AOT: remove five leftover .orig files
Jarred-Sumner 1b3ae0a
Fix the ARM64 build after the merge with main
Jarred-Sumner 36eef3b
AOT: an hour of work on passes, the linear-scan generator, flow and t…
Jarred-Sumner 5a4ece4
Merge branch 'claude/compile-aot-merge' into claude/compile-aot
Jarred-Sumner 51f863c
AOT: fixes for the file-by-file build, the table of built-ins anew, s…
Jarred-Sumner 77c819a
AOT: builds on ARM64, Android, FreeBSD, musl and Windows; a preview r…
Jarred-Sumner 3e7c65f
AOT: macOS and Windows link again, two spaces of built-in ids, harden…
Jarred-Sumner 7e4ea48
AOT: every file compiles alone again, jsc and testaot link without a …
Jarred-Sumner a893d28
AOT: the table of built-ins is compiled by the embedder, Windows link…
Jarred-Sumner d0e0b8c
AOT: an ASAN build keeps fastMalloc in libpas, as main does
Jarred-Sumner a5c3076
AOT: the table of built-ins from the engine alone, a Windows macro na…
Jarred-Sumner 6f09279
AOT: a write-back store never stores its own base on ARM64, generated…
Jarred-Sumner c5ffbfe
AOT: the generated table of built-ins leaves the tree, its generator …
Jarred-Sumner 987c35a
AOT: the include in front of sources that CMake compiles alone, a ful…
Jarred-Sumner c1df675
AOT: builds with assertions, musl and FreeBSD compile again; fixes, t…
Jarred-Sumner eda6a0d
AOT: less code: relational summaries, flattened objects, unused passe…
Jarred-Sumner 50788cd
AOT: bring back the passes, B3 phases and RegExp text evaluation that…
Jarred-Sumner 25f9c37
Merge main into compile-aot
Jarred-Sumner c31dccb
AOT: bring back three flow results that typed code depends on, with t…
Jarred-Sumner 3e3da34
Merge branch 'claude/compile-aot-merge-1023' into claude/compile-aot
Jarred-Sumner 5c8235f
Mark structures correctly when the marking version wraps; Object.from…
Jarred-Sumner d56fcd8
AOT: generated records name their own Vector; frame records on Window…
Jarred-Sumner caf16a9
AOT: fixes from CI and the test suites; four Air and B3 phases are up…
Jarred-Sumner 2c3495a
AOT: fixes from fuzzing and CI; a testing switch that makes predictio…
Jarred-Sumner 4ba5c62
AOT: the address-space budget compiles on musl; terminating a Worker …
Jarred-Sumner 65eca57
AOT: fixes from fuzzing and from CI on ARM64 and under ASAN; a check …
Jarred-Sumner 0248c92
AOT: fixes from fuzzing the direct code generator, whose frame slots …
Jarred-Sumner 749216c
AOT: at most 4,096 property orders per object type
Jarred-Sumner 2db9f2e
AOT: a shift or a sum of 32 bits is no part of a 64-bit address; a st…
Jarred-Sumner 5c2923e
AOT: two pairs of one type are compared, for libstdc++ 13
Jarred-Sumner 3301f7d
AOT: fixes from fuzzing, ASAN and CI; a check of finished binaries fo…
Jarred-Sumner 6a3a747
AOT: the slow path of a lock never collects
Jarred-Sumner c02d721
AOT: the data of compiled code lies behind it in pages that are not e…
Jarred-Sumner 8ec44cb
AOT: every module keeps its path again
Jarred-Sumner dd1c994
AOT: a switch around calls of native functions; the hardened build ke…
Jarred-Sumner a3251c8
AOT: a heap that stays almost full owes its error; tables without wha…
Jarred-Sumner 91ef8f6
AOT: an executable starts through the dynamic loader; a build option …
Jarred-Sumner 4184cc9
AOT: the directory of the FFI stubs leaves the executable pages; a ha…
Jarred-Sumner 598707c
AOT: a locked realm keeps its arrays when a realm it depends on has a…
Jarred-Sumner aa17a19
AOT: a member of a literal type that nothing spells keeps its word an…
Jarred-Sumner 12a6b5f
AOT: a dictionary with immutable properties keeps its offsets when it…
Jarred-Sumner 63e317b
AOT: a tail call whose checked casts flow proves stays a tail call; t…
Jarred-Sumner b3543e7
AOT: an expected type that lists too many layouts keeps whether the v…
Jarred-Sumner 0e1db58
AOT: a lane that has the compiler carries "-aot" in its label; JSON.p…
Jarred-Sumner 903f4a9
AOT: a field far into a large object is read through the objects that…
Jarred-Sumner 4639429
AOT: a validated call whose type reaches more than 256 objects is val…
Jarred-Sumner 83068d7
AOT: the fusing of returned chains of array methods goes out again; O…
Jarred-Sumner 0a9b77b
AOT: `key in value` asks whether the value is an object before it loo…
Jarred-Sumner 9b86efe
B3: a load from a stack slot is not treated as immutable; AOT: the ob…
Jarred-Sumner 9396758
Merge branch 'main'
Jarred-Sumner b888d84
AOT: a string made behind a merge stays where it is made when the blo…
Jarred-Sumner 6086be4
AOT: every function goes through B3; ARM64 gets the lookup behind the…
Jarred-Sumner 049eb4b
AOT: a cell in a frame is born by a value with an effect; claims to B…
Jarred-Sumner 1471622
AOT: flow asks chains of lookups last; a loop's unlikely test in its …
Jarred-Sumner 2e815be
AOT: the build without ENABLE(AOT) compiles again; ARM64 replaces an …
Jarred-Sumner 473ad60
AOT: a definition by descriptor reads the object's method table behin…
Jarred-Sumner b88d649
AOT: SeparateUnlikelyLoopPaths no longer moves tests out of loop headers
Jarred-Sumner 31c615a
AOT: operationAOTDefineOwnProperty is listed for find-structures-deco…
Jarred-Sumner b57ae44
AOT: an executable may hold several images, one for each entry point …
Jarred-Sumner f7aebcd
AOT: a build that stops says which function and pass it was in; block…
Jarred-Sumner 40f2601
AOT: what a bound built-in does to its receiver is applied where nati…
Jarred-Sumner f3dbb6f
AOT: a generator's head that reads is not moved past stores; a chain …
Jarred-Sumner bac28d0
AOT: own accessors through the slot, long strings compared in the stu…
Jarred-Sumner 3cf3f0d
AOT: members of a literal below Object.create, wrappers entered throu…
Jarred-Sumner 2f4fb1f
AOT: code that the build has not seen is loaded, a function's one cal…
Jarred-Sumner c7250f6
AOT: a callback that call() hands on runs as often as the built-in ru…
Jarred-Sumner 602c9e8
AOT: the class that a type names is tested for first, a function that…
Jarred-Sumner a6dae5c
AOT: a store of an equal string or number into a locked property succ…
Jarred-Sumner 9e130e0
AOT: the check of words that never change reads memory outside the he…
Jarred-Sumner c4a81a7
AOT: the plans of a typed parse are prepared with terminations deferred
Jarred-Sumner 4677cbd
AOT: a set of callees that is not complete proves nothing about how o…
Jarred-Sumner d002ce3
AOT: a loop's poll throws the RangeError that is owed at the heap's l…
Jarred-Sumner 08cbeb6
AOT: an element stored below a String object or a typed array, what i…
Jarred-Sumner 7119740
AOT: a dictionary's table is pinned before a stub adds to it, the sta…
Jarred-Sumner 83eb947
AOT: captured exports are captured on demand, a failed cycle fails al…
Jarred-Sumner 0ba9fb2
AOT: a read that finds an empty slot above a method stays typed, Comm…
Jarred-Sumner 8fe92b9
AOT: shorter passes, flow, code generation, object model and run time…
Jarred-Sumner 0866a5c
AOT: the tables of the flow solver's indices have a written-out defau…
Jarred-Sumner 22c6a32
AOT: AOTTypedArrayOperations.cpp includes the types of the built-in ids
Jarred-Sumner a578122
AOT: a call keeps its validation whoever is called, `export *` resolv…
Jarred-Sumner b05f085
AOT: functions whose bytecode is written by native code, validators a…
Jarred-Sumner b585fbc
AOT: the release tarball includes AOTBuiltinTableEnums.h
Jarred-Sumner b370000
AOT: more validation nodes, a regular expression search can say it ga…
Jarred-Sumner 9c01894
AOT: a nested literal is an object of its own, a release copies one f…
Jarred-Sumner 41c3344
AOT: validation moves to a follow-up, no object lies inside another o…
Jarred-Sumner d5b3378
AOT: a Worker started from an embedded file is compiled however its p…
Jarred-Sumner 13db273
AOT: the sort writes back with a store that may be refused, `process`…
Jarred-Sumner ae1234f
AOT: each call of a closure factory in a module's body gets its own c…
Jarred-Sumner f23d36e
AOT: heat no longer goes by shares of a small program, native functio…
Jarred-Sumner 111fdee
AOT: what the host calls per event is hot, `subarray` is a range of a…
Jarred-Sumner e7631bb
AOT: listing own values refuses fields that are not enumerable or are…
Jarred-Sumner 30bbb0b
AOT: effects say what they said before six refinements
Jarred-Sumner 9abcacb
AOT: a loop in code that runs once is compiled like the same loop in …
Jarred-Sumner 3b12c25
AOT: loops in code that runs once, the inliner, array capacities and …
Jarred-Sumner de44fec
AOT: a value is retyped when the operand it read was narrowed and the…
Jarred-Sumner 5ec5b02
AOT: the form of a built-in that takes bounds says what its row says,…
Jarred-Sumner d2e6890
AOT: a cast that keeps a value's own type is not put in front of a gu…
Jarred-Sumner fa4810f
AOT: a store by name into any object reaches every field under its ke…
Jarred-Sumner b07b782
AOT: require() of a module runs the loader's jobs before it returns, …
Jarred-Sumner 0d27a4b
AOT: the handler of null checks finds the image by the address of the…
Jarred-Sumner 15467f1
AOT: two rules of the previous commits are out again
Jarred-Sumner 9ba7e91
AOT: the type of a slot is what its writers test, only a module that …
Jarred-Sumner 9e2daee
AOT: imported CommonJS files run while the graph loads, a direct call…
Jarred-Sumner ad82225
AOT: nothing behind a loop made of tail calls restarts in the generic…
Jarred-Sumner 2a7a2cf
AOT: a type test leaves a loop only if what it proves lies inside the…
Jarred-Sumner fd9cf77
AOT: a closure that is built late keeps the declared types of its cap…
Jarred-Sumner 742a035
AOT: `SinkAllocations` splits a list by a test of its elements as before
Jarred-Sumner 9e2cded
AOT: a copy of a host object holds its enumerable members, a getter w…
Jarred-Sumner File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
The diff you're trying to view is too large. We only load the first 3000 changed files.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
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
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.