https://github.com/JuliaLang/julia

sort by:
Revision Author Date Message Commit Date
f821430 Bump JuliaSyntax to 0.4.7 12 November 2023, 19:33:39 UTC
45461be 🤖 [release-1.10] Bump the Pkg stdlib from 484bc3ec0 to 9261a54d3 (#51664) Co-authored-by: Dilum Aluthge <dilum@aluthge.com> Fix Pkg.precompile ext races (#3645) 11 October 2023, 01:07:03 UTC
404750f release-1.10: set VERSION to 1.10.0-beta3 (#51542) 03 October 2023, 12:53:42 UTC
e6378ea [release-1.10] Backports for Julia 1.10.0-x (#50971) Backported PRs: - [x] #48625 <!-- add replace(io, str, patterns...) --> - [x] #48387 <!-- Improve documentation of sort-related functions --> - [x] #48363 <!-- Revise sort.md and docstrings in sort.jl --> - [x] #48977 <!-- Update SparseArrays.jl stdlib for SuiteSparse 7 --> - [x] #50719 <!-- fix `CyclePadding(::DataType)` --> - [x] #50694 <!-- inference: permit recursive type traits --> - [x] #50860 <!-- Add `Base.get_extension` to docs/API --> - [x] #50594 <!-- Disallow non-index Integer types in isassigned --> - [x] #50802 <!-- Makes IntrusiveLinkedListSynchronized mutable to avoid allocation on poptask --> - [x] #50858 <!-- Add a `threadpool` parameter to `Channel` constructor --> - [x] #50874 <!-- Restrict COFF to a single thread when symbol count is high --> - [x] #50822 <!-- Add default method for setmodifiers! --> - [x] #50730 <!-- Fix integer overflow in `isapprox` --> - [x] #50850 <!-- Remove weird Rational dispatch and add pi functions to list --> - [x] #50809 <!-- Limit type-printing in MethodError --> - [x] #50915 <!-- Add note the `Task` about sticky bit --> - [x] #50929 <!-- when widening tuple types in tmerge, only widen the complex parts --> - [x] #50928 <!-- Bump JuliaSyntax to 0.4.6 --> - [x] #50959 <!-- Update libssh2 patches --> - [x] #50823 <!-- Make ranges more robust with unsigned indexes. --> - [x] #48542 <!-- Add docs on task-specific buffering using multithreading --> - [x] #50912 <!-- Separate foreign threads into a :foreign threadpool --> - [x] #51010 <!-- Add ORIGIN to SuiteSparse rpath on Linux/FreeBSD --> - [x] #50753 <!-- cat: remove unused promote_eltype methods that confuse inference --> - [x] #51027 <!-- Implement realloc accounting correctly --> - [x] #51019 <!-- fix a case of potentially use of undefined variable when handling error in distributed message processing --> - [x] #51039 <!-- Revert "Optimize findall(f, ::AbstractArray{Bool}) (#42202)" --> - [x] #51036 <!-- add missing invoke edge for nospecialize targets --> - [x] #51042 <!-- inference: fix return_type_tfunc modeling of concrete functions --> - [x] #51114 <!-- Workaround upstream FreeBSD issue #272992 --> - [x] #50892 <!-- Add `JL_DLLIMPORT` to `small_typeof` declaration --> - [x] #51154 <!-- broadcast: use recursion rather than ntuple to map over a tuple --> - [x] #51153 <!-- fix debug typo in "add missing invoke edge for nospecialize targets (#51036)" --> - [x] #51222 <!-- Check again if the tty is open inside the IO lock --> - [x] #51236 <!-- Add lock around uv_unref during init --> - [x] #51243 <!-- GMP: Gracefully handle more overflows. --> - [x] #51254 <!-- Ryu: make sure adding zeros does not overwrite trailing dot --> - [x] #51175 <!-- shorten stale_age for cachefile lock --> - [x] #51300 <!-- fix method definition error for bad vararg --> - [x] #51307 <!-- fix force-throw ctrl-C on Windows --> - [x] #51303 <!-- ensure revising structs is safe --> - [x] #51393 - [x] #51403 Need manual backport: - [x] #51009 <!-- fix #50562, regression in `in` of tuple of Symbols --> - [x] #51053 <!-- Bump Statistics stdlib --> - [x] #51013 <!-- fix #50709, type bound error due to free typevar in sparam env --> - [x] #51305 <!-- reduce test time for rounding and floatfuncs --> Contains multiple commits, manual intervention needed: - [ ] #50663 <!-- Fix Expr(:loopinfo) codegen --> - [ ] #51035 <!-- refactor GC scanning code to reflect jl_binding_t are now first class --> - [ ] #51092 <!-- inference: fix bad effects for recursion --> - [x] #51247 <!-- Check if malloc has succeeded before incrementing gc stats --> - [x] #51294 <!-- use LibGit2_jll for LibGit2 library --> Non-merged PRs with backport label: - [ ] #51132 <!-- Handle `AbstractQ` in concatenation --> - [x] #51029 <!-- testdefs: make sure that if a test set changes the active project, they change it back when they're done --> - [ ] #50919 <!-- Code loading: do the "skipping mtime check for stdlib" check regardless of the value of `ispath(f)` --> - [ ] #50824 <!-- Add some aliasing warnings to docstrings for mutating functions --> - [x] #50385 <!-- Precompile pidlocks: add to NEWS and docs --> - [ ] #49805 <!-- Limit TimeType subtraction to AbstractDateTime --> 02 October 2023, 06:42:57 UTC
e084a40 Check if malloc has succeeded before updating GC counters (#51247) 26 September 2023, 17:28:20 UTC
ae8f9ad inference: follow up the `Vararg` fix in `abstract_call_unionall` (#51403) 26 September 2023, 15:09:42 UTC
f9ef654 inference: handle `Vararg` in `abstract_call_unionall` for `argtypes` computed by `abstract_apply` (#51393) This commit adds special handling for `Vararg` types that may appear at the end of `argtypes`, as computed by `abstract_apply`. Even though PR within the abstract state, they can still be part of `argtypes`. As a result, this kind of special handling is still necessary. It remains an open question whether we can refactor `abstract_apply` to prevent `Vararg`s from appearing in `argtypes` in the first place. 26 September 2023, 15:03:59 UTC
491dfb5 Backport a fix for GMP patches to `backports-release-1.10` (#51445) This backports `Fixes and improvements for source builds (#51422)` PR to the `backports-release-1.10` branch to make it buildable without binary builder (we are monitoring that branch in our CI to make sure we are up to date with the upcoming 1.10 release). Co-authored-by: Tim Besard <tim.besard@gmail.com> 25 September 2023, 10:56:49 UTC
b407e1b testdefs: make sure that if a test set changes the active project, they change it back when they're done (#51029) We already check the following for mutation by a test set: 1. DEPOT_PATH 2. LOAD_PATH 3. ENV So this PR just adds the active project to the list of things we check. Changing the active project during a test set can definitely have negative effects on subsequent test sets that are run on the same worker, so we want to make sure if a test set changes the active project, that they change it back when they're done. (cherry picked from commit 106e867e6c28347e42b91905d526cc4908e50ec3) 18 September 2023, 02:25:17 UTC
f0758b0 Precompile pidlocks: add to NEWS and docs (#50385) 18 September 2023, 02:24:16 UTC
eea9477 use LibGit2_jll for LibGit2 library (#51294) Fixes https://github.com/JuliaLang/julia/issues/51293 (cherry picked from commit 377f9dfb2dd8be2f2c3d80db7a397150dde53311) 16 September 2023, 00:35:29 UTC
76277fe reduce test time for rounding and floatfuncs (#51305) These test were taking on the order of 5 minutes and 10-100s of GB, but they really did not need to. (cherry picked from commit bab20f492a61d49e7a2af9289c156e75ebcecf5e) 16 September 2023, 00:30:59 UTC
763ec69 inference: type bound error due to free typevar in sparam env (#51013) Fix #50709 This issue *appears* fixed on master due to #50432, which simply removed the error. This fixes the underlying cause, which is that we sometimes return typevars in the environment from intersection that have free vars in their bounds. I think it's reasonable to just widen these aggressively, since we usually cannot do much with these kinds of unknown static parameters anyway. (cherry picked from commit a3e23161b60e51d7aaa1183559dc70b9c28426e6) 16 September 2023, 00:26:55 UTC
0eff9d8 jltypes: ensure revising structs is safe (#51303) (cherry picked from commit 11427597eb8e51afe4d31681c8ffde443ff44e10) 15 September 2023, 14:41:05 UTC
ea93115 fix force-throw ctrl-C on Windows (#51307) This was getting current-task on the wrong thread, which resulted in the value being NULL and crashing. Fixes #50325 (cherry picked from commit 5090bc05f01728ffaa7ab028611eb9df3159fbef) 15 September 2023, 14:41:05 UTC
503a44f fix method definition error for bad vararg (#51300) We had the ordering of tests incorrect, so Vararg was not correctly checked for validity during method definition. Fixes #51228 (cherry picked from commit 34e603503853ec16f6d2f8877c212d9029bb8f06) 15 September 2023, 14:41:05 UTC
de20256 shorten stale_age for cachefile lock (#51175) (cherry picked from commit 4af6be80f238fce9cd124925d488a4c7171cf74a) 15 September 2023, 14:41:04 UTC
2e14912 Ryu: make sure adding zeros does not overwrite trailing dot (#51254) Fix #43129 (cherry picked from commit 832e46d923d4cf81351038a046e22f221b5e6120) 15 September 2023, 14:41:03 UTC
c12e851 GMP: Gracefully handle more overflows. (#51243) Fixes https://github.com/JuliaLang/julia/issues/8286, which regressed due to a GMP upgrade in https://github.com/JuliaLang/julia/pull/45375. (cherry picked from commit 10974814b3faa1dea140062cfe1f3e63962074d5) 15 September 2023, 14:41:03 UTC
81c9a3c Add lock around uv_unref during init (#51236) This is not a legal operation outside the lock because it's not atomic Co-authored-by: Valentin Churavy <v.churavy@gmail.com> (cherry picked from commit bbbcc4fed67337c038b485f00677e2e88d24becd) 15 September 2023, 14:41:02 UTC
0c0638d Check again if the tty is open inside the IO lock (#51222) This can cause segfaults when exiting julia. Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com> (cherry picked from commit b3741c01f2e2d4956be3ba41858c4065c6fbc7e8) 15 September 2023, 14:41:00 UTC
0e7eed8 fix debug typo in "add missing invoke edge for nospecialize targets (#51036)" (#51153) Causes `matches` to get replaced with `MethodMatch` instead, which then later will fail to match with the expected value. Fixes #51146 Co-authored-by: Dilum Aluthge <dilum@aluthge.com> (cherry picked from commit da86735259702850ee7a66c58021c1d6e0ad259e) 15 September 2023, 14:41:00 UTC
8332712 broadcast: use recursion rather than ntuple to map over a tuple (#51154) Inference seems to have trouble with the anonymous function version, so go back to the recursive version. Fixes #51129 Probably also fixes #50859 (cherry picked from commit d949bb4332c5b18c93c428094b3b1a83190029ad) 15 September 2023, 14:40:59 UTC
7093764 Add `JL_DLLIMPORT` to `small_typeof` declaration (#50892) Resolves #50714 (cherry picked from commit 91b8c9b99f05b99db8b259257adeb1997f8c4415) 15 September 2023, 14:40:58 UTC
15359fa Workaround upstream FreeBSD issue #272992 (#51114) ELF doesn't handle WEAK symbols dynamically the way it handles them statically. Looking up overloaded WEAK symbols via a library-specific handle will often give you the empty stub (in `libc.so.7` in this case) instead of the strong implementation elsewhere (`ld-elf.so.1` here). Even after the [upstream fix](https://cgit.freebsd.org/src/commit/?id=21a52f99440c9bec7679f3b0c5c9d888901c3694), `dlsym`, `dladdr` and a ton of other symbols still have stubs with no trampoline in FreeBSD's libc: https://cgit.freebsd.org/src/tree/lib/libc/gen/dlfcn.c?id=21a52f99440c9bec7679f3b0c5c9d888901c3694 Thankfully `dl_iterate_phdr` appears to be the only function that we directly `ccall` from Julia's Libdl so we can leave this fix incomplete for now. Resolves #50846. (cherry picked from commit c65901171a30b261f063c6a56c4a58a36d492be0) 15 September 2023, 14:40:56 UTC
d889379 inference: fix return_type_tfunc modeling of concrete functions (#51042) The `aft` parameter is a value already, so we should be checking it in the value domain, not the type domain like `tt`. That check happens to already be done (somewhat unnecessarily) earlier in the function. Fixes #40606 --------- Co-authored-by: Shuhei Kadowaki <40514306+aviatesk@users.noreply.github.com> (cherry picked from commit f24a93a3f6607f569c739cbcd3a84d21bdc6c908) 15 September 2023, 14:40:56 UTC
210fb22 add missing invoke edge for nospecialize targets (#51036) We need 2 edges: one for the lookup (which uses the call signature) and one for the invoke (which uses the invoke signature). It is hard to make a small example for this, but the test case demonstrated this issue, particularly if inspected by `SnoopCompile.@snoopr`. Additionally, we can do some easy optimizations on the invoke invalidation, since in most cases we know from subtyping transativity that it is only invalid if the method callee target is actually deleted, and otherwise it cannot ever be partially replaced. Fixes: #50091 Likely introduced by #49404, so marking for v1.10 backport only (cherry picked from commit 6097140fdd7ed3523b1a80dd78a6c6a0a81c99ed) 15 September 2023, 14:40:54 UTC
aa11508 Revert "Optimize findall(f, ::AbstractArray{Bool}) (#42202)" (#51039) This reverts commit 4c4c94f4781da4f4109086368205db8a2f7ec7c4. (Except keeps the tests and adds a new one) fixes #46425 (cherry picked from commit defe187ed5b4f274778c964f979138334a2d1dfb) 15 September 2023, 14:40:53 UTC
78c8cf1 fix a case of potentially use of undefined variable when handling error in distributed message processing (#51019) There is a use of `oldstate` on line 244 which has the possibility of being undefined. This bug seems to have been introduced in https://github.com/JuliaLang/julia/commit/40c622b7e66a88c05d8892222126f1d13851bc62#diff-39fa44ff86c5b38bd6b9e7f60733b25724a9efd9221ca38f776ed3f3ab01dec2. I don't have a repro for this but this PR reverts back to the situation where `oldstate` is defined at the topmost level of the catch block as it was before the offending commit. (cherry picked from commit 777b784dde077defd0aea58b598241f95146152a) 15 September 2023, 14:40:52 UTC
e5e9142 Implement realloc accounting correctly (#51027) This was potentially making us getting wrong results. (cherry picked from commit ce8acdd4d9cd8321141c37ddafb63062191418f4) 15 September 2023, 14:40:51 UTC
4545f0b 🤖 [backports-release-1.10] Bump the Pkg stdlib from a3621e978 to 484bc3ec0 (#51285) Co-authored-by: Dilum Aluthge <dilum@aluthge.com> 12 September 2023, 20:59:02 UTC
25d58ad 🤖 [backports-release-1.10] Bump the Pkg stdlib from 61257864f to a3621e978 (#51076) 28 August 2023, 02:46:12 UTC
27f60cd Bump Statistics stdlib (#51053) For some reason we haven't updated Statistics since April. Diff: https://github.com/JuliaStats/Statistics.jl/compare/a3feba2bb63f06b7f40024185e9fa5f6385e2510...08562cb8abbe67829e437aa8533994121c350c05 25 August 2023, 19:28:34 UTC
77900dc fix #50562, regression in `in` of tuple of Symbols (#51009) fix #50562 24 August 2023, 18:12:05 UTC
0e01cb5 cat: remove unused promote_eltype methods that confuse inference (#50753) These cannot be reached, but they would imply this function might return Bottom, which it cannot. Fix #50550 (cherry picked from commit edff86adfa870b4d7ab86e94c9b1291e3796c5de) 24 August 2023, 00:16:04 UTC
c1126a3 add ORIGIN to rpath on Linux/FreeBSD (cherry picked from commit 89a7c953b23f1ddfe5b3a4de6fdf9194a2b5edea) 23 August 2023, 12:51:34 UTC
13ec3ce Separate foreign threads into a :foreign threadpool (#50912) Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com> Co-authored-by: Dilum Aluthge <dilum@aluthge.com> (cherry picked from commit 8be469e275a455ca894fdc5fad8a80aafb359544) 23 August 2023, 12:51:34 UTC
f58e1eb fix incorrect results in `expm1(::Union{Float16, Float32})` (#50989) `unsafe_trunc(UInt, -1.0)` is unspecified behavior but worked fine on apple and AMD so we didn't notice??? This has been very broken since 1.7. (cherry picked from commit 61ebaf6643c57cef8b3bb4013b75931608ac6344) 23 August 2023, 12:51:34 UTC
972259e types: fix hash values of Vararg (#50932) Fixes #50455 (cherry picked from commit c239e9966a30797949d856c18b14e4e5421a90e9) 23 August 2023, 12:51:34 UTC
07faa22 🤖 [backports-release-1.10] Bump the Pkg stdlib from 85d6ac617 to 61257864f (#50978) Co-authored-by: Dilum Aluthge <dilum@aluthge.com> 19 August 2023, 03:58:20 UTC
3fa4990 Make ranges more robust with unsigned indexes. (#50823) Fixes #44895 (cherry picked from commit 91093fe5b4bb4095ebb66698792631befe530a3c) 19 August 2023, 02:39:11 UTC
1094763 Add docs on task-specific buffering using multithreading (#48542) Co-authored-by: Mason Protter <mason.protter@icloud.com> (cherry picked from commit 02f80c6bdf87edd90898f0af5828d68343340afa) 19 August 2023, 02:27:20 UTC
1da3068 Update libssh2 patches (#50959) We're now using libssh2 v1.11.0 which includes the two patches we were carrying. The patches need to be dropped in order to build with `USE_BINARYBUILDER=0`. (This was my bad, I should have made this change as part of #50826, which updated libssh2 to v1.11.0.) (cherry picked from commit 315ff53a37556ae0d26188d73f97325be44c26de) 19 August 2023, 02:19:16 UTC
cd69cc4 Bump JuliaSyntax to 0.4.6 (#50928) This is just a minor update fixing several small but annoying bugs people have noticed since JuliaSyntax was integrated. (cherry picked from commit 43164cfad745d31f11525e6a2229d3f63adfb3cf) 19 August 2023, 02:19:15 UTC
0737e80 when widening tuple types in tmerge, only widen the complex parts (#50929) This is the part of https://github.com/JuliaLang/julia/pull/50927 required to fix https://github.com/JuliaLang/julia/issues/49249. Specifically, before this change `tmerge(Tuple{Any, Int}, Nothing)` would be `Union{Nothing, Tuple{Any, Int}}` but `tmerge(Tuple{BIG_UNION, Int}, Nothing)` would be `Union{Nothing, Tuple{Any, Any}}`. This feels bad intuitively because giving the compiler more type information led it to forget type information that it already knew about, and is especially damaging because it led to unnecessary type instability when iterating tuples with complex element types (because the iterator state should be inferrable as an `Int` even if you have no idea what the tuple type is). This is tagged for backport to 1.10 since it is a relatively unobtrusive change and it fixes the string regression in a more proper way. (cherry picked from commit 6e2e6d00258b930f5909d576f2b3510ffa49c4bf) 19 August 2023, 02:19:15 UTC
24f34d8 Limit type-printing in MethodError (#50809) This applies the same `...` depth-based parametric truncation to the signature in `MethodError` that we use in printing stacktraces. Fixes #50803 (cherry picked from commit 90b4eedbf4b2beae0b12e6b8317e15ef0bb91126) 19 August 2023, 02:19:14 UTC
19fdcce Remove weird Rational dispatch and add pi functions to list (#50850) Should fix https://github.com/JuliaLang/julia/issues/48735 (cherry picked from commit b7637287c50e1568582baea1f85b1b202c6d3f97) 19 August 2023, 02:19:12 UTC
03108f2 Add default method for setmodifiers! (#50822) Fixes #50690 (cherry picked from commit 0eb13d70a3ea2419f96fd5db5676db91a54ede32) 19 August 2023, 02:19:12 UTC
9477e1b Restrict COFF to a single thread when symbol count is high (#50874) (cherry picked from commit eb4416b16b8a865376da5c76451a4d60516e2c4a) 19 August 2023, 02:19:11 UTC
843937b Disallow non-index Integer types in isassigned (#50594) Extend #50587 to more general `AbstractArray`s. This is mainly to disallow `Bool` as an index in `isassigned`, as this isn't supported by `getindex`. After this ```julia julia> isassigned(rand(2,2), 1, true) ERROR: ArgumentError: invalid index: true of type Bool ``` which matches the behavior on v1.9. (cherry picked from commit b9913973f84b80e9125e37a0312a44bb38239b10) 19 August 2023, 02:19:11 UTC
6867fa6 inference: permit recursive type traits (#50694) We had a special case for Type that disallowed type trait recursion in favor of a pattern that almost never appears in code (only once in the compiler by accident where it doesn't matter). This was unnecessarily confusing and unexpected to predict what can infer, and made traits harder than necessary (such as Broadcast.ndims since 70fc3cdc11b). Fix #43296 Fix #43368 (cherry picked from commit 33e3d9f7de229a109cc2afeb72be2bb7931d3e79) 19 August 2023, 02:19:11 UTC
344ef77 fix `CyclePadding(::DataType)` (#50719) We probably want to add a test for this code path. (cherry picked from commit f4cb8bc014f21e7066c72ca4f2c32c14fdf7a59f) 19 August 2023, 02:19:10 UTC
86f75bf Revise sort.md and docstrings in sort.jl (#48363) Co-authored-by: Jeremie Knuesel <knuesel@gmail.com> (cherry picked from commit a134076bc85c78c4e46fa9a69b67665651a02a4d) 19 August 2023, 02:19:10 UTC
10cbf3c Improve documentation of sort-related functions (#48387) * document the `order` keyword in `sort!` * list explicitly the required properties of `lt` in `sort!` * clarify the sequence of "by" transformations if both `by` and `order` are given * show default values in the signatures for `searchsorted` and related functions * note that `by` is also applied to searched value in `searchsorted` and related * add `isunordered` to the manual (it's already exported) --------- Co-authored-by: Lilith Orion Hafner <lilithhafner@gmail.com> (cherry picked from commit a660798e47ed38c1f8039b0d7af3ff5a451f53e8) 19 August 2023, 02:19:09 UTC
747dea6 🤖 [backports-release-1.10] Bump the Pkg stdlib from e8197dd0e to 85d6ac617 (#50973) Co-authored-by: Dilum Aluthge <dilum@aluthge.com> fix inference of PackageSpec constructor in presence of imprecise input types (#3585) 19 August 2023, 01:21:27 UTC
ca52361 Fix Pkg branch (release-1.10) 18 August 2023, 19:54:26 UTC
111dc03 Add note the `Task` about sticky bit (#50915) Update the docs for `Task` to mention the fact that they default to sticky. Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com> (cherry picked from commit 5466d3d082e0dd1608351fb5f9be6d5ec3ae7056) 18 August 2023, 09:20:53 UTC
48746e9 Fix integer overflow in `isapprox` (#50730) Ensure that `isapprox` gives correct results when comparing an integer with another integer or with a float. For comparison between integers, the fix only works when keeping default values for `rtol` and `norm`, and with `atol < 1`. It is not possible to handle the (atypical) case where `norm !== abs`, but that's OK since the user is responsible for providing a safe function. It would be possible to handle the case where `rtol > 0` or `atol >= 1`, but with complex code which would check for overflow and handle all possible corner cases; it would work only for types defined in Base and would not be extensible by packages. So I'm not sure that's worth it. At least with PR fixes the most common case. Fixes https://github.com/JuliaLang/julia/issues/50380. (cherry picked from commit 5f03a18c615526348ef06bd0144a1498cb0b13a7) 18 August 2023, 09:20:51 UTC
7e92d14 Add a `threadpool` parameter to `Channel` constructor (#50858) Without this, the task created by a `Channel` will run in the threadpool of the creating task; in the REPL, this could be the interactive threadpool. On 1.8, without threadpools: ```julia % julia +1.8 -t 8 _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.8.5 (2023-01-08) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | julia> for _ in 1:10 Channel{Int}(1; spawn=true) do _ Core.print("threadid=$(Threads.threadid())\n") end end threadid=2 threadid=5 threadid=2 threadid=2 threadid=1 threadid=6 threadid=7 threadid=8 threadid=3 threadid=4 ``` On 1.9, with no interactive threads: ```julia % julia +1.9 -t 8 _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.9.2 (2023-07-05) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | julia> for _ in 1:10 Channel{Int}(1; spawn=true) do _ Core.print("threadid=$(Threads.threadid())\n") end end threadid=4 threadid=4 threadid=4 threadid=2 threadid=3 threadid=1 threadid=7 threadid=5 threadid=8 threadid=6 ``` On 1.9, with an interactive thread: ```julia % julia +1.9 -t 7,1 _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.9.2 (2023-07-05) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | julia> for _ in 1:10 Channel{Int}(1; spawn=true) do _ Core.print("threadid=$(Threads.threadid())\n") end end threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 ``` With this PR, the `:default` threadpool is used instead. ```julia % julia +master -t7,1 _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.11.0-DEV.244 (2023-08-09) _/ |\__'_|_|_|\__'_| | Commit d99f2496ff* (0 days old master) |__/ | julia> for _ in 1:10 Channel{Int}(1; spawn=true) do _ Core.print("threadid=$(Threads.threadid())\n") end end threadid=7 threadid=6 threadid=7 threadid=7 threadid=6 threadid=3 threadid=5 threadid=2 threadid=4 threadid=8 ``` And, the behavior can be overridden. ```julia % julia +master -t7,1 _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.11.0-DEV.244 (2023-08-09) _/ |\__'_|_|_|\__'_| | Commit d99f2496ff* (0 days old master) |__/ | julia> for _ in 1:10 Channel{Int}(1; spawn=true, threadpool=:interactive) do _ Core.print("threadid=$(Threads.threadid())\n") end end threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 threadid=1 ``` --------- Co-authored-by: Nathan Daly <NHDaly@gmail.com> (cherry picked from commit 555cd2304fb72669cc2cd92adb485306cc0caa7e) 18 August 2023, 09:20:51 UTC
3106779 Avoid race conditions with recursive rm (#50842) If two processes attempt to recursively delete a directory at the same time, then we can end up in a state where the initial `isdir` is `true`, but by the time it actually deletes the directory it is already gone. e.g. - https://buildkite.com/clima/climacore-ci/builds/2460#0189d254-76a9-474b-ad25-e5b16440d629/140-142 which is triggered by https://github.com/cjdoris/PackageExtensionCompat.jl/blob/636eb5a14ddf9134d004c93f598515903af26443/src/PackageExtensionCompat.jl#L59 - https://buildkite.com/clima/climacore-ci/builds/2457#0189c7fe-8872-40c5-9106-da2e621ff55a/139-150 which is triggered by https://github.com/JuliaGPU/GPUCompiler.jl/blob/06e670657d7ceebc1845d7c9534a8352c33490de/src/rtlib.jl#L152 I've been conservative and only applied this when `force=true`, but perhaps it should apply generally? (cherry picked from commit cbd3c89875afb0892c4e9e7559bca0254b2781d4) 18 August 2023, 09:20:50 UTC
a468aa1 release-1.10: set VERSON to 1.10.0-beta2 (#50935) 17 August 2023, 06:27:47 UTC
77e7e73 Backports for julia v1.10.0-beta2 (#50708) Backported PRs: - [x] #50637 <!-- Remove SparseArrays legacy code --> - [x] #50665 <!-- print `@time` msg into print buffer --> - [x] #50523 <!-- Avoid generic call in most cases for getproperty --> - [x] #50635 <!-- `versioninfo()`: include build info and unofficial warning --> - [x] #50670 <!-- Make reinterpret specialize fully. --> - [x] #50666 <!-- include `--pkgimage=no` caches for stdlibs --> - [x] #50765 - [x] #50764 - [x] #50768 - [x] #50767 - [x] #50618 <!-- inference: continue const-prop' when concrete-eval returns non-inlineable --> - [x] #50689 <!-- Attach `tanpi` docstring to method --> - [x] #50671 <!-- Fix rdiv of complex lhs by real factorizations --> - [x] #50598 <!-- only limit types in stack traces in the REPL --> - [x] #50766 <!-- Don't partition alwaysinline functions --> - [x] #50771 <!-- re-allow non-string values in ENV `get!` --> - [x] #50682 <!-- Add fallback if we have make a weird GC decision. --> - [x] #50781 <!-- fix `bit_map!` with aliasing --> - [x] #50172 <!-- print feature flags used for matching pkgimage --> - [x] #50844 <!-- Bump OpenBLAS binaries to use the new GEMM multithreading threshold --> - [x] #50826 <!-- Update dependency builds --> - [x] #50845 <!-- fix #50438, use default pool for at-threads --> - [x] #50568 <!-- `Array(::AbstractRange)` should return an `Array` --> - [x] #50655 <!-- fix hashing regression. --> - [x] #50779 <!-- Minor refactor to image generation --> - [x] #50791 <!-- Make symbols internal in jl_create_native, and only externalize them when partitioning --> - [x] #50724 <!-- Merge opaque closure modules with the rest of the workqueue --> - [x] #50738 <!-- Add alignment to constant globals --> - [x] #50871 <!-- macOS: Don't inspect dead threadtls during exception handling. --> Need manual backport: Contains multiple commits, manual intervention needed: Non-merged PRs with backport label: - [ ] #50850 <!-- Remove weird Rational dispatch and add pi functions to list --> - [ ] #50823 <!-- Make ranges more robust with unsigned indexes. --> - [ ] #50809 <!-- Limit type-printing in MethodError --> - [ ] #50663 <!-- Fix Expr(:loopinfo) codegen --> - [ ] #50594 <!-- Disallow non-index Integer types in isassigned --> - [ ] #50385 <!-- Precompile pidlocks: add to NEWS and docs --> - [ ] #49805 <!-- Limit TimeType subtraction to AbstractDateTime --> 16 August 2023, 08:43:08 UTC
1fc06f2 Change addprocs limit to total_memory instead of free memory. (cherry picked from commit 5e3fb41e349f0a50d6ecd8315717b6234c1b5fbb) 15 August 2023, 12:10:48 UTC
c11763f edit NEWS for 1.10 (#50848) NEWS and HISTORY have diverged, so I'm editing NEWS on the release branch and once that's locked down will move back to HISTORY on master. Opening the PR now so people know I'm doing this. 14 August 2023, 11:10:17 UTC
f9afbbb macOS: Don't inspect dead threadtls during exception handling. (#50871) Otherwise we may end up with the state of a dead thread, as the system IDs can alias. This can lead to an early return from the exception handler, resulting in e.g. safepoint exceptions being actually delivered to user code. --------- Co-authored-by: Jameson Nash <vtjnash@gmail.com> Co-authored-by: Cody Tapscott <topolarity@tapscott.me> 11 August 2023, 07:54:14 UTC
6b636b9 Combined compilation fixes 10 August 2023, 15:34:28 UTC
013e951 Make symbols internal in jl_create_native, and only externalize them when partitioning (#50791) (cherry picked from commit 8b8da91ad7701c5401947a749399720f5aa51418) 10 August 2023, 15:02:06 UTC
081bc5c Minor refactor to image generation (#50779) (cherry picked from commit f337c3d261c8618396506f3c56f5bde3479f66bf) 10 August 2023, 15:01:20 UTC
6ba470d Add alignment to constant globals (#50738) (cherry picked from commit 37082297452099ec262cd6100fe2aaa1717d7aa9) 10 August 2023, 14:57:19 UTC
e549d74 Merge opaque closure modules with the rest of the workqueue (#50724) This sticks the compiled opaque closure module into the `compiled_functions` list of modules that we have compiled for the particular `jl_codegen_params_t`. We probably should manage that vector in codegen_params, since it lets us see if a particular codeinst has already been compiled but not yet emitted. (cherry picked from commit 441fcb1e06513ceff4d5ca4e111863c2ebba957b) 10 August 2023, 14:51:12 UTC
8ad72d3 Reuse incremental JIT compilation for --image-codegen (#50649) We don't need to merge all of the workqueue modules when performing compilation with `--image-codegen` set, we just need the global variable initializers to be defined before they're used in one of the modules. Therefore we can do this by compiling all of the global variable initializers upfront, so that later references will link them properly. (cherry picked from commit ff14eafd803558f4c1f9ecdeecc44d3a4caa7343) 10 August 2023, 14:44:44 UTC
185dd81 Makes IntrusiveLinkedListSynchronized mutable to avoid allocation on poptask (#50802) Currently `poptask` is allocating every time it calls into `jl_task_get_next` due to `StickyWorkqueue` (`IntrusiveLinkedListSynchronized`) being immutable and requiring an allocation to be used as `Any` on the `ccall`. The allocations can be seen in the following snippet: ``` function work() done = 0.0 l = Threads.SpinLock() Threads.@sync for _ in 1:(Threads.nthreads() / 2) Threads.@spawn begin v = 1.0 for i in 1:(1<<33) v *= 1.0001 if i % (1 << 13) == 0 yield() end end Base.@lock_nofail l done += v end end return done end julia> @time work() 15.758794 seconds (5.03 M allocations: 153.523 MiB, 0.35% gc time) ``` Which after the change becomes: ``` julia> @time work() 15.907513 seconds (67 allocations: 4.719 KiB) ``` (cherry picked from commit 2f03072436e2a40549e35b56a84c40b71abbdf5a) 10 August 2023, 11:54:32 UTC
27bc777 Add `Base.get_extension` to docs/API (#50860) The documentation of `Pkg.jl` is instructing developers to rely on the existence of this function, and there doesn't seem to be any alternative which is a part of the API that developers can use instead on to guarantee forward compatibility for the same behavior. `Base.get_extension` is [referred to explicitly](https://pkgdocs.julialang.org/v1.9/creating-packages/#Backwards-compatibility) in the `Pkg.jl` docs to conditionally use package extensions vs `Requires.jl`. The `Pkg.jl` docs suggest ```julia if !isdefined(Base, :get_extension) include("../ext/PlottingContourExt.jl") end ``` to transition from "normal dependency to extension," which will break and automatically load the extension in future versions should `Base.get_extension` go away. `Base.get_extension` is the only way (that I know of) to directly access the module associated with a package extension, which can be a useful utility as well. (cherry picked from commit d1759bcde8e662e6bb7aaff94466b3ca1f3cf43b) 10 August 2023, 09:06:02 UTC
3e133c9 fix hashing regression. (#50655) This fixes 2 bugs introduced by #49996 and #50041. Closes #50628. (cherry picked from commit c777c714ff03c76ebbda07992639e8bced0983e2) 10 August 2023, 08:58:10 UTC
c33aad8 `Array(::AbstractRange)` should return an `Array` (#50568) Currently, `Array(r::AbstractRange)` falls back to `vcat(r)`, but certain ranges may choose to specialize `vcat(r::AbstractRange)` to not return an `Array`. This PR ensures that `Array(r)` always returns an `Array`. At present, there's some code overlap with `vcat` (just above the `Array` method added in this PR). Perhaps some of these may be replaced by `unsafe_copyto!`, but the tests for ranges include some special cases that don't support `getindex`, which complicates things a bit. I've not done this for now. In any case, the common bit of code is pretty simple, so perhaps the duplication is harmless. (cherry picked from commit 3cc05908a61aec885f3a4fc3fc9cb13cf3524108) 10 August 2023, 08:49:54 UTC
e22d308 fix #50438, use default pool for at-threads (#50845) (cherry picked from commit 744aa79c2c2655de526f02dcd1987ae1d7db6f6d) 10 August 2023, 07:53:00 UTC
c5e7846 Update dependency builds (#50826) This bumps the build numbers for stdlib and binary dependency JLLs, updates libssh2 to 1.11.0, libgit2 to 1.6.4, and objconv to 2.53. Julia's FreeBSD CI has been running on FreeBSD 13.2 for a while, but until more recently, Yggdrasil was still building FreeBSD binaries using the 12.2 sysroot. The sysroot was updated to 13.2 and I went through and rebuilt the dependencies that Julia uses. The updated build numbers correspond to these rebuilt but otherwise unchanged binaries. The actual version updates are because libssh2 in Yggdrasil was at 1.11.0 so I left it there (its [release notes](https://github.com/libssh2/libssh2/releases/tag/libssh2-1.11.0) suggest it's a safe update), libgit2 had a newer patch version available and needed to be fixed anyway since the Windows build was broken, and objconv needed its Yggdrasil build recipe fixed but Elliot's GitHub mirror of objconv was at 2.53 so I updated to use that. (cherry picked from commit 5e51fbe78df4304d7f4ca776928144905ba494bf) 10 August 2023, 07:53:00 UTC
98db4d5 Bump OpenBLAS binaries to use the new GEMM multithreading threshold (#50844) Detailed discussion and benchmarks by @oscardssmith in https://github.com/JuliaPackaging/Yggdrasil/pull/7189 (cherry picked from commit 626f6872ed8043b1565623a4653bc50f7e9a07cc) 10 August 2023, 07:53:00 UTC
9b78fb5 print feature flags used for matching pkgimage (#50172) ``` julia> @ccall jl_dump_host_cpu()::Cvoid CPU: znver2 Features: sse3, pclmul, ssse3, fma, cx16, sse4.1, sse4.2, movbe, popcnt, aes, xsave, avx, f16c, rdrnd, fsgsbase, bmi, avx2, bmi2, rdseed, adx, clflushopt, clwb, sha, rdpid, sahf, lzcnt, sse4a, prfchw, mwaitx, xsaveopt, xsavec, xsaves, clzero, wbnoinvd julia> target = only(Base.current_image_targets()) znver2; flags=0; features_en=(sse3, pclmul, ssse3, fma, cx16, sse4.1, sse4.2, movbe, popcnt, aes, xsave, avx, f16c, fsgsbase, bmi, avx2, bmi2, adx, clflushopt, clwb, sha, rdpid, sahf, lzcnt, sse4a, prfchw, mwaitx, xsavec, xsaves, clzero, wbnoinvd) ``` Co-authored-by: Prem Chintalapudi <prem.chintalapudi@gmail.com> Co-authored-by: Jameson Nash <vtjnash@gmail.com> (cherry picked from commit 958da95647da5f9a824f99cb56846eed22a4d098) 10 August 2023, 07:53:00 UTC
e57f1c7 fix `bit_map!` with aliasing (#50781) fixes #50780 caused by #47013. (cherry picked from commit 3e04129d61e19fe2957680b39e03b350db8e8c0d) 10 August 2023, 07:53:00 UTC
8cfb350 Add fallback if we have make a weird GC decision. (#50682) If something odd happens during GC (the PC goes to sleep) or a very big transient the heuristics might make a bad decision. What this PR implements is if we try to make our target more than double the one we had before we fallback to a more conservative method. This fixes the new issue @vtjnash found in https://github.com/JuliaLang/julia/issues/40644 for me. (cherry picked from commit ab94fadc9f8cd83c4c1550ac43483d4e0b1a3e9c) 10 August 2023, 07:53:00 UTC
aed6f5a re-allow non-string values in ENV `get!` (#50771) fixes #50472 (cherry picked from commit 6dd763bf2a0b130f03183e99c0ebf0a3c14c97d6) 10 August 2023, 07:53:00 UTC
ac0eec2 Don't partition alwaysinline functions (#50766) (cherry picked from commit bea8c444141c9cbbf4a3f6515ce572a28be3c0a1) 10 August 2023, 07:53:00 UTC
2e71492 only limit types in stack traces in the REPL (#50598) fixes #50575 Co-authored-by: Shuhei Kadowaki <40514306+aviatesk@users.noreply.github.com> (cherry picked from commit 98222572628fa67d733389cc718f2c70d45d2ea1) 10 August 2023, 07:53:00 UTC
6a8559d Fix rdiv of complex lhs by real factorizations (#50671) Co-authored-by: Martin Holters <martin@holters.name> (cherry picked from commit 210c5b526b828a2335232300252b2f113b41ccb5) 10 August 2023, 07:53:00 UTC
4799388 Attach `tanpi` docstring to method (#50689) (cherry picked from commit 5c69561b0028ae97fc120b6a4714bfc2eb11a947) 10 August 2023, 07:53:00 UTC
ffa2f9a rename env var JULIA_USE_NEW_PARSER -> JULIA_USE_FLISP_PARSER (#50849) (cherry picked from commit 1116d7c23805a264457ef9c35e5cff4d83ef6e29) Co-authored-by: Navid C. Constantinou <navidcy@users.noreply.github.com> 09 August 2023, 19:19:32 UTC
80ccc37 inference: continue const-prop' when concrete-eval returns non-inlineable (#50618) 05 August 2023, 04:51:55 UTC
9e9f67d optimizer: move inlineable constants into argument position during `compact!`-ion (#50767) In code like below ```julia Base.@assume_effects :nothrow function erase_before_inlining(x, y) z = sin(y) if x return "julia" end return z end let y::Float64 length(erase_before_inlining(true, y)) end ``` the constant prop' can figure out the constant return type of `erase_before_inlining(true, y)` while it is profitable not to inline expand it since otherwise we left some `!:nothrow` callees there (xref: https://github.com/JuliaLang/julia/pull/47305). In order to workaround this problem, this commit makes `compact!`move inlineable constants into argument positions so that the such "inlineable, but safe as a whole" calls to be erased during compaction. This should give us general compile-time performance improvement too as we no longer need to expand the IR for those calls. Requires: - #50764 - #50765 - #50768 04 August 2023, 13:03:40 UTC
2a70dac ssair: `compact!` constant `PiNode` (#50768) Currently the `compact!`-ion pass fails to fold constant `PiNode` like `PiNode(0.0, Const(0.0))`. This commit fixes it up. 04 August 2023, 13:03:30 UTC
f10c461 irinterp: refine `:nothrow` only when it is not proved yet (#50764) This makes irinterp not override `:nothrow=true` that are assumed by `Base.@assume_effects`. 04 August 2023, 13:03:21 UTC
821f6a5 effects: fix `:nothrow` modeling of `getglobal` (#50765) 04 August 2023, 13:03:13 UTC
21fe723 include `--pkgimage=no` caches for stdlibs (#50666) (cherry picked from commit 62605cc40f51f5a921e5a9bdced1821afd49183f) 28 July 2023, 15:48:06 UTC
528d4ed Make reinterpret specialize fully. (#50670) Fixes https://github.com/JuliaLang/julia/issues/50612 The issue here was the reinterpret change made a bunch of operations like `Core.bitcast(UInt64,24)` not fold, even though they are fully known at compile time. That made `UInt32(Char)` not inline which then caused the regression. (cherry picked from commit dc064683087d017927381e64c38bd162aea47b4e) 28 July 2023, 15:48:05 UTC
291dc6b `versioninfo()`: include build info and unofficial warning (#50635) (cherry picked from commit c43e5a10be27b7f93b5368875aa1d2596b4d4947) 28 July 2023, 15:48:05 UTC
d673a25 Avoid generic call in most cases for getproperty (#50523) More generic than https://github.com/JuliaLang/julia/pull/50444. Should we keep the boundscheck on the getfield since we got the index from the runtime itself? (cherry picked from commit 207c09a6b1e22fe6148de664f1e718c06faf12fb) 28 July 2023, 15:48:03 UTC
6ea6ddd print `@time` msg into print buffer (#50665) (cherry picked from commit 912423456dfe9f54c7454efd252a496aa1ea579f) 28 July 2023, 15:48:03 UTC
ea34b13 Remove SparseArrays legacy code (#50637) (cherry picked from commit c57d33a17ae713497052cddbba83a5f4b5aaeaa3) 28 July 2023, 15:48:02 UTC
6616549 release-1.10: set VERSON to 1.10.0-beta1 (#50662) 25 July 2023, 17:43:26 UTC
f9b2614 release-1.10: Backports for 1.10-alpha2 (#50508) Backported PRs: - [x] #50411 <!-- Fix weird dispatch of * with zero arguments --> - [x] #50202 <!-- Remove dynamic dispatch from _wait/wait2 --> - [x] #50064 <!-- Fix numbered prompt with input only with comment --> - [x] #50026 <!-- Store heapsnapshot files in tempdir() instead of current directory --> - [x] #50402 <!-- Add CPU feature helper function --> - [x] #50387 <!-- update newpages pointer after actually sweeping pages --> - [x] #50424 <!-- avoid potential type-instability in _replace_(str, ...) --> - [x] #50444 <!-- Optimize getfield lowering to avoid boxing in some cases --> - [x] #50474 <!-- docs: Fix a `!!! note` which was miscapitalized --> - [x] #50466 <!-- relax assertion involving pg->nold to reflect that it may be a bit in… --> - [x] #50490 <!-- Fix compat annotation for italic printstyled --> - [x] #50488 <!-- fix typo in `Base.isassigned` with `Tridiagonal` --> - [x] #50476 <!-- Profile: Add specifying dir for `take_heap_snapshot` and handling if current dir is unwritable --> - [x] #50461 <!-- fix typo in the --gcthreads argument description --> - [x] #50528 <!-- ssair: Correctly handle stmt insertion at end of basic block --> - [x] #50533 <!-- ensure internal_obj_base_ptr checks whether objects past freelist pointer are in freelist --> - [x] #49322 <!-- improve cat design / performance --> - [x] #50540 <!-- gc: remove over-eager assertion --> - [x] #50542 <!-- gf: remove unnecessary assert cycle==depth --> - [x] #50559 <!-- Expand kwcall lowering positional default check to vararg --> - [x] #50058 <!-- Add unwrapping mechanism for triangular mul and solves --> - [x] #50551 <!-- typeintersect: also record chained `innervars` --> - [x] #50552 <!-- read(io, Char): fix read with too many leading ones --> - [x] #50541 <!-- precompile: ensure globals are not accidentally created where disallowed --> - [x] #50576 <!-- use atomic compare exchange when setting the GC mark-bit --> - [x] #50578 <!-- gf: make method overwrite/delete an error during precompile --> - [x] #50516 <!-- Fix visibility of assert on GCC12/13 --> - [x] #50597 <!-- Fix memory corruption if task is launched inside finalizer --> - [x] #50591 <!-- build: fix various makefile bugs --> - [x] #50599 <!-- faster invalid object lookup in conservative gc --> - [x] #50634 <!-- 🤖 [master] Bump the SparseArrays stdlib from b4b0e72 to 99c99b4 --> - [x] #50639 <!-- Backport LLVM patches to fix various issues. --> - [x] #50546 <!-- Revert storage of method instance in LineInfoNode --> - [x] #50631 <!-- Shift DCE pass to optimize imaging mode code better --> - [x] #50525 <!-- only check that values are finite in `generic_lufact` when `check=true` --> - [x] #50587 <!-- isassigned for ranges with BigInt indices --> - [x] #50144 <!-- Page based heap size heuristics --> Need manual backport: - [ ] #50595 <!-- Rename ENV variable `JULIA_USE_NEW_PARSER` -> `JULIA_USE_FLISP_PARSER` --> Non-merged PRs with backport label: - [ ] #50637 <!-- Remove SparseArrays legacy code --> - [ ] #50618 <!-- inference: continue const-prop' when concrete-eval returns non-inlineable --> - [ ] #50598 <!-- only limit types in stack traces in the REPL --> - [ ] #50594 <!-- Disallow non-index Integer types in isassigned --> - [ ] #50568 <!-- `Array(::AbstractRange)` should return an `Array` --> - [ ] #50523 <!-- Avoid generic call in most cases for getproperty --> - [ ] #50172 <!-- print feature flags used for matching pkgimage --> 24 July 2023, 20:01:52 UTC
back to top