https://github.com/JuliaLang/julia

sort by:
Revision Author Date Message Commit Date
5594d50 Update src/task.c Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com> 22 March 2024, 17:24:43 UTC
23f3b82 Update src/task.c Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com> 22 March 2024, 17:24:35 UTC
698c6bb wip 04 March 2024, 17:33:49 UTC
e0885fa [DOC] jl_rng_split: further update comment text 04 March 2024, 17:28:32 UTC
4d5a20d Docs: Change "Packages that wrap external libraries or programs should be named after those libraries or programs" to "Packages that wrap external libraries or programs can be named after those libraries or programs" (#53567) Before this PR: > Packages that wrap external libraries or programs should be named after those libraries or programs. I think that "should" is a little too strong. After this PR: > Packages that wrap external libraries or programs can be named after those libraries or programs. ## Motivation This might make it a bit easier to convince package authors that they can use a longer more descriptive name for their package, instead of needing to exactly match the name of the underlying software that they are wrapping. Suppose for example that someone is making a Julia package to wrap a piece of software named `HW`. Under the "should be named..." guideline, this would lead the package author to register a Julia package named HW.jl. Personally I'd like to encourage longer and more descriptive names. So, under the "can be named..." guideline, the author won't feel like the Julia package needs to be named HW.jl, and thus they might be more amenable to a longer name such as HelloWorld.jl. 04 March 2024, 11:36:24 UTC
bc2212c allow convert from RegexMatch to Dict/NamedTuple (#50988) Added implementation + tests, will add to docs if ok --------- Co-authored-by: Dilum Aluthge <dilum@aluthge.com> Co-authored-by: Jeff Bezanson <jeff.bezanson@gmail.com> 04 March 2024, 01:20:49 UTC
7179050 Always return a value in 1-d circshift! of abstractarray.jl (#53554) Co-authored-by: Sukera <11753998+Seelengrab@users.noreply.github.com> Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com> 03 March 2024, 03:14:28 UTC
0f902bf Provide better error hint when `UndefVarError` results from name clashes (#53469) We can detect this since we set the `usingfailed` bit when the clash occurs (to avoid printing the `WARNING` multiple times). In this case, typos or missing imports (the current message) isn't quite as clear as it could be, because in fact the name is probably spelled totally right, it's just that there is a missing explicit import or the name should be qualified. This code will stop working if we change the flags in `Core.Binding`, but the test I added should catch that. However if REPL is supposed to be independent of Base and not depend on internals there, there could be an issue. In that case we should probably add an API to Base to inspect this `usingfailed` bit so we can use it in the REPL. --------- Co-authored-by: Jameson Nash <vtjnash@gmail.com> Co-authored-by: Alex Arslan <ararslan@comcast.net> 03 March 2024, 03:14:06 UTC
e7734ea Add a GitHub Actions workflow for automatic validation of the citation metadata file (`CITATION.CFF`) (#44062) Hello! We noticed that your `CITATION.cff` had a small issue and fixed it. In addition to the fix, this Pull Request automates validation of that file using the [cffconvert GitHub Action](https://github.com/marketplace/actions/cffconvert). That way, it's a little bit easier to be robust against future changes to the `CITATION.cff` file. BTW it's perfectly fine if you don't feel like accepting this Pull Request for whatever reason -- we just thought it might be helpful is all. We found your repository using a partially automated workflow; if you have any questions about that, feel free to create an issue over at https://github.com/cffbots/filtering/issues/ On behalf of the cffbots team, @abelsiqueira / @fdiblen / @jspaaks --------- Co-authored-by: Max Horn <max@quendi.de> 03 March 2024, 01:23:18 UTC
a586d3c Clarify docstring for `zero`, `one`, and `oneunit`. (#52107) spurred by a conversation on Slack where someone was thrown off wondering why `zero(Vector{Int})` errors, but `zero(Int)` is fine. --------- Co-authored-by: Sukera <11753998+Seelengrab@users.noreply.github.com> Co-authored-by: Max Horn <max@quendi.de> Co-authored-by: Simon Byrne <simonbyrne@gmail.com> 03 March 2024, 01:16:51 UTC
86f5b21 Make dump print `const` before const fields (#53492) This provides more information to the user when dumping types, and also makes the output of dump slightly more similar to the type definition syntax. EDIT: This has been changed to print: * The kind of type before the type name `abstract type`, `mutable struct`, etc. * `const` only for `const` fields of `mutable struct` New behaviour ``` julia> dump(Float32) primitive type Float32 <: AbstractFloat julia> dump(Signed) abstract type Signed <: Integer julia> dump(Pair{Int, String}) struct Pair{Int64, String} <: Any first::Int64 second::String julia> dump(BitSet) mutable struct BitSet <: AbstractSet{Int64} const bits::Vector{UInt64} offset::Int64 julia> dump(Set) UnionAll var: TypeVar name: Symbol T lb: Union{} ub: abstract type Any body: struct Set{T} <: AbstractSet{T} dict::Dict{T, Nothing} ``` --------- Co-authored-by: Shuhei Kadowaki <aviatesk@gmail.com> 03 March 2024, 01:16:23 UTC
e3b2462 fix number of chunks (#53413) The manual claims that `a` is split into `nthreads()` chunks, but this is not true in general. As it was you could get an error, if `length(a) < nthreads()`, or a number of chunks larger than `nthreads()`, if `nthreads()` is smaller than `length(a)` but does not divide it. With `cld`, on the other hand, you always get at most `nthreads()` chunks. 02 March 2024, 19:02:45 UTC
8bf6a07 revert "Add @create_log_macro for making custom styled logging macros (#52196)" (#53551) 02 March 2024, 16:49:08 UTC
2b95956 use `_readdirx` for `walkdir` (#53545) On a M2 Mac there is some benefit, but assumed to be much greater on slower filesystems. ``` # master julia> @btime collect(walkdir(expanduser("~/Downloads"))); 380.086 ms (310696 allocations: 25.29 MiB) # This PR julia> @btime collect(walkdir(expanduser("~/Downloads"))); 289.747 ms (103300 allocations: 7.50 MiB) ``` The implementations appear to produce the same result ``` julia> collect(walkdir(expanduser("~/Downloads"))) == collect(walkdirx(expanduser("~/Downloads"))) true ``` 01 March 2024, 23:04:35 UTC
188e386 use more efficient `_readdirx` for tab completion (#53540) Fixes https://github.com/JuliaLang/julia/issues/53153 01 March 2024, 23:03:41 UTC
c703a17 Update package naming guidelines to encourage consideration of the global namespace (#53514) Co-authored-by: Daniel Wennberg <daniel.wennberg@gmail.com> Co-authored-by: Matt Bauman <mbauman@juliahub.com> 01 March 2024, 17:58:09 UTC
ac41e2a Fix `hypot` promotion bug (#53541) Fixes #53505 01 March 2024, 15:24:30 UTC
0918cf1 Allow sysimage build without the doc system (#53533) The earliest bootstrapping code has a definition of `atdoc` that is just supposed to ignore the doc string and pass the defining code through. This function is then replaced by the actual docsystem once that is available. For testing, I wanted to build the whole system image without the doc system using this boostrap definition. However, this turns out not to be possible, because there's a few doc syntax semantics that do not actually just ignore the doc string. In particular: ``` """ I am a doc for a particular signature """ foo(x::Int, y::Float64) ``` Does not acutally result in a call to `foo`. And similarly ``` """ I am a doc for a global binding """ MyModule.foo ``` Does not require `MyModule.foo` to actually have a value, since it only documents the binding. This PR allows both of those cases in the boostrap version of `atdoc` so that we can bootstrap without the doc system if we wanted to. 01 March 2024, 06:34:00 UTC
136f018 Allow GlobalRef and module qualified names in macro definitions (#53535) The following is currently an error: ``` julia> module MyMacroModule macro mymacro end end Main.MyMacroModule julia> macro MyMacroModule.mymacro() 1 end ERROR: syntax: invalid macro definition around REPL[2]:1 Stacktrace: [1] top-level scope @ REPL[2]:1 ``` Discussing with Jeff, we didn't think there was any good reason not to allow this, just a missing case in lowering. It's probably not particularly useful (unlike the corresponding case for functions that is used all the time), but it came up in writing a test case for #53515. 01 March 2024, 06:32:36 UTC
95f54c4 fix InteractiveUtils call in Base.runtests on failure (#53525) Noticed in CI that `Base.runtests(["fail"])` fails here instead of throwing the correct error later, since #53326. 01 March 2024, 02:38:38 UTC
2501e37 post-opt analysis: fix conditional successor visitation logic (#53518) Previously `conditional_successors_may_throw` performed post-domination analysis not on the initially specified `bb` (which was given as the argument), but on those BBs being analyzed that were popped from the work-queue at the time. As a result, there were cases where not all conditional successors were visited. fixes #53508 01 March 2024, 00:43:00 UTC
989c4db add _readdirx for returning more object info gathered during dir scan (#53377) 29 February 2024, 23:04:39 UTC
fbcc99a Add documentation about failure cases of trig functions & return types (#50855) 29 February 2024, 23:04:08 UTC
c06662a Implement and export `isfull` (#53159) This PR implements `isfull(c::Channel)`. It calls `n_avail(c) ≥ c.sz_max` in all cases. The original implementation was inspired by [this comment](https://discourse.julialang.org/t/function-to-check-if-channel-is-full/44795/3?u=thelatekronos), and therefore had a special case for unbuffered channels, which fell back to `isready`. I opted against this behaviour, because it fails to respect that an unbuffered channel is always full, in two important senses: 1) The number of elements available is greater than or equal the capacity 2) A call to `put!` will block With the current implementation, the behaviour is simply understood and summarized in all cases by the start of the docstring: > Determines whether a `Channel` is full, in the sense that calling `put!(c, some_value)` will block. Shoutout to @SamuraiAku for their work in https://github.com/JuliaLang/julia/pull/40720, which helped me a lot on thinking this through, and remembering to change all relevant files. In particular, the detail around how `c.cond_take.waitq` may result in immediate unblocking, which is a really important caveat on a function that may be used to check if `put!`ing will block. However, for buffered channels, `isfull` is extremely close to `putwillblock` from #40720 (just a little better, with >= instead of ==), and for unbuffered channels it does not make much sense to see if `put!`ing will block. This PR is created based on [this](https://github.com/JuliaLang/julia/issues/22863#issuecomment-1921498544) "call to action". Checklist: - [x] Entry in news - [x] Docstring with example - [x] Export function - [x] Mention in manual - [x] Entry in [docs-reference](https://docs.julialang.org/en/v1/base/parallel/) --------- Co-authored-by: Jameson Nash <vtjnash@gmail.com> 29 February 2024, 18:01:47 UTC
962bbf7 Introduce -m/--module flag to execute a `main` function in a package (#52103) This aims to bring similar functionality to Julia as the `-m` flag for Python which exists to directly run some function in a package and being able to pass arguments to that function. While in Python, `python -m package args` runs the file `<package>.__main__.py`, the equivalent Julia command (`julia -m Package args`) instead runs `<Package>.main(args)`. The package is assumed to be installed in the environment `julia` is run in. An example usage could be: Add the package: ```julia (@v1.11) pkg> add https://github.com/KristofferC/Rot13.jl Cloning git-repo `https://github.com/KristofferC/Rot13.jl` Updating git-repo `https://github.com/KristofferC/Rot13.jl` Resolving package versions... Updating `~/.julia/environments/v1.11/Project.toml` [43ef800a] + Rot13 v0.1.0 `https://github.com/KristofferC/Rot13.jl#master` Updating `~/.julia/environments/v1.11/Manifest.toml` [43ef800a] + Rot13 v0.1.0 `https://github.com/KristofferC/Rot13.jl#master` ``` And then it can be run (since it has a `main` function) via: ``` ❯ ./julia/julia -m Rot13 "encrypt this for me" "and this as well" rapelcg guvf sbe zr naq guvf nf jryy ``` I'm not sure if `-m/--module` is the best choice but perhaps the association to Python makes it worth it. 29 February 2024, 18:01:22 UTC
e50ca99 fix potential double-free in flisp table implementation (#53519) In this case we would add two finalizers, leading to a double free. Introduced by 5fc4ba91931526a08fc1bf8d3937aac731ee2cc6. However, I believe we never hit this in the julia front end, since it requires making a large pre-initialized table (i.e. with many arguments to `table`) which is later freed. That tends not to happen since initialized tables tend to be global constants. 29 February 2024, 15:40:01 UTC
715c50d codegen: make gcroots for argument-derived values (#53501) This function might previously refuse to make gc roots for any of the function's arguments (i.e. it potentially assumed everything was in an alloca), which was only valid if we could guarantee that no IPO passes run. This commit aims to make that safe, but deferring such decisions about their source until llvm-late-gc-lowering can make them valid. This should make inlining-safe gc annotations for code_llvm(raw=true, optimize=false, (Some{Int},)) do x; GC.@preserve x GC.safepoint(); end and also better annotations even without inlining for code_llvm(raw=true, optimize=false, (Some{Any},)) do x; GC.@preserve x GC.safepoint(); end 29 February 2024, 14:32:17 UTC
24aaf00 add back an alias for `check_top_bit` (#53523) Used in some packages (e.g. rfourquet/BitIntegers.jl) Renamed in https://github.com/JuliaLang/julia/pull/53166 29 February 2024, 14:22:15 UTC
84ae351 🤖 [master] Bump the Pkg stdlib from 1f16df404 to 48eea8dbd (#53517) Stdlib: Pkg URL: https://github.com/JuliaLang/Pkg.jl.git Stdlib branch: master Julia branch: master Old commit: 1f16df404 New commit: 48eea8dbd Julia version: 1.12.0-DEV Pkg version: 1.11.0(Does not match) Bump invoked by: @KristofferC Powered by: [BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl) Diff: https://github.com/JuliaLang/Pkg.jl/compare/1f16df404a2fbe8642ea3eecc9f4d7064c400a73...48eea8dbd7b651cdc932b909c1b718bb9c3f94f4 ``` $ git log --oneline 1f16df404..48eea8dbd 48eea8dbd setenv -> addenv (#3819) ``` Co-authored-by: Dilum Aluthge <dilum@aluthge.com> 29 February 2024, 10:15:12 UTC
77c0672 task splitting: change additive accumulation to multiplicative (#53408) Issue raised [here](https://discourse.julialang.org/t/linear-relationship-between-xoshiro-tasks/110454). Given this definition, look at output values: ```jl using .Threads macro fetch(ex) :(fetch(@spawn($(esc(ex))))) end function taskCorrelatedXoshiros(+ = +) r11, r10 = @fetch (@fetch(rand(UInt64)), rand(UInt64)) r01, r00 = (@fetch(rand(UInt64)), rand(UInt64)) r01 + r10 - (r00 + r11) end ``` Before: ```jl julia> sort!(unique(taskCorrelatedXoshiros() for _ = 1:1000)) 9-element Vector{UInt64}: 0x0000000000000000 0x0000000000000001 0x00000000007fffff 0x0000000000800000 0x0000000000800001 0xffffffffff7fffff 0xffffffffff800000 0xffffffffff800001 0xffffffffffffffff ``` After: ```jl julia> sort!(unique(taskCorrelatedXoshiros() for _ = 1:1000)) 1000-element Vector{UInt64}: 0x000420647a085960 0x0038c5b889b585c6 0x007b29fae8107ff7 0x00e73b9e883ac1c8 ⋮ 0xfe68be9c0dde1e88 0xfeca042354218c35 0xfeeb8203e470c96b 0xfff5dbb8771307b9 julia> sort!(unique(taskCorrelatedXoshiros(*) for _ = 1:1000)) 1000-element Vector{UInt64}: 0x00126f951c1e56dc 0x0025a82477ffac08 0x002dd82c9986457a 0x00a713c4d56a3dbc ⋮ 0xfe2e40a5b345095e 0xfe77b90881967436 0xfea2559be63f1701 0xff88b5b28cefac5f ``` 28 February 2024, 23:06:12 UTC
c80a964 update staled `Core.Compiler.Effects` documentation (#53507) 28 February 2024, 22:34:54 UTC
71f68b4 Avoid compiler warning about redefining jl_globalref_t (#53499) 28 February 2024, 05:46:20 UTC
c379db7 🤖 [master] Bump the Pkg stdlib from 76070d295 to 1f16df404 (#53495) 27 February 2024, 22:33:57 UTC
b18a62d Fix formatting & typo in methods.md (#53486) * Fixed what I suspect is a typo: commonly -> common * Added code quotes to eltype: eltype -> `eltype` Sentence now reads: Instead, common code will dispatch first on the container type, then recurse down to a more specific method based on `eltype`. 27 February 2024, 19:54:46 UTC
2b79326 Move the list of Base's `public` names from `base/exports.jl` to `base/public.jl` (#53487) 27 February 2024, 17:22:16 UTC
c19c68e Add error hint for incorrect stacked indexing (#40934) A common entry level mistake is to try to index a matrix with two sets of brackets, e.g. `a = [1 2; 3 4]; a[1][2] = 5` This will lead to an error that `setindex!()` on the element type of `a` is missing. This PR adds an error hint for the case where a MethodError is raised when `setindex!` is called with a `Number` as the first argument. I considered going broader than numbers, but it seems more likely that this kind of mistake would happen when working with simple number arrays vs. something more advanced. Could also consider if it is possible to do the same for when `getindex()` is called on a `Number`, which emits a BoundsError. Co-authored-by: Michael Abbott <32575566+mcabbott@users.noreply.github.com> 27 February 2024, 16:17:15 UTC
b3b2736 add IR encoding for EnterNode (#53482) fixes #53248 27 February 2024, 13:57:49 UTC
35cb8a5 minor fixes on test/precompile.jl (#53476) These changes are driven-by fixes I found during investigating into a more complex issue related to precompilation with external abs int. 27 February 2024, 06:12:46 UTC
2e9b0bb `rm`: move open DLLs to temp dir to allow dir to be deleted (#53456) 27 February 2024, 02:42:36 UTC
98b3f72 Fix boundscheck in unsetindex for SubArrays (#53475) These had been copy-pasted incorrectly, and should throw an error if the indices are out of bounds. 27 February 2024, 01:16:22 UTC
a2be715 gf: allow method shadowing with exact signatures without deletion (#53415) We already allowed method shadowing for an inexact signature and implicit method deletion by exact signatures, so it was fairly arbitrary to implement it as a deletion for a replacement by an exact signature rather than use the morespecific definition for this. This change should be useful to Mocking libraries, such as Pluto, which previously had a buggier version of this which tried to re-activate or re-define the old methods. There is a bit of code cleanup in here, either of unused features, or of aspects that were broken, or of world_valid computations that were not actually impacting the final result (e.g. when there is a more specific result matches, it does not need to limit the result valid world range because of a less specific result that does not get returned). 26 February 2024, 21:08:57 UTC
7f92880 add dedicated IO thread (capability only) (#53422) It has been oft-requested that we have a dedicated IO thread. That actually turns out to already be the case of something that exists, except that we hard-code the identity of that thread as being thread 0. This PR replaces all of the places where we hard code that assumption with a variable so that they are more easily searched for in the code. It also adds an internal function (`jl_set_io_loop_tid`) that can be used to transfer ownership of the loop to any (valid) tid. In conjunction with the prior foreign-threads work and foreign-thread pool, this lets us spawn a dedicate IO-management thread with this bit of code: ```julia function make_io_thread() tid = UInt[0] threadwork = @cfunction function(arg::Ptr{Cvoid}) Base.errormonitor(current_task()) # this may not go particularly well if the IO loop is dead, but try anyways @ccall jl_set_io_loop_tid((Threads.threadid() - 1)::Int16)::Cvoid wait() # spin uv_run as long as needed nothing end Cvoid (Ptr{Cvoid},) err = @ccall uv_thread_create(tid::Ptr{UInt}, threadwork::Ptr{Cvoid}, C_NULL::Ptr{Cvoid})::Cint err == 0 || Base.uv_error("uv_thread_create", err) @ccall uv_thread_detach(tid::Ptr{UInt})::Cint err == 0 || Base.uv_error("uv_thread_detach", err) # n.b. this does not wait for the thread to start or to take ownership of the event loop nothing end ``` 26 February 2024, 21:06:35 UTC
189a255 🤖 [master] Bump the Distributed stdlib from 41c0106 to 6a07d98 (#53477) Stdlib: Distributed URL: https://github.com/JuliaLang/Distributed.jl Stdlib branch: master Julia branch: master Old commit: 41c0106 New commit: 6a07d98 Julia version: 1.12.0-DEV Distributed version: 1.11.0(Does not match) Bump invoked by: @IanButterworth Powered by: [BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl) Diff: https://github.com/JuliaLang/Distributed.jl/compare/41c01069533e22a6ce6b794746e4b3aa9f5a25cd...6a07d9853ab7686df7440a47d1b585c6c9f3be35 ``` $ git log --oneline 41c0106..6a07d98 6a07d98 Merge pull request #93 from JuliaLang/ib/guard_rmprocs 41cd14f suppress interrupt trace from SIGTERM test 2b23ae4 guard rmprocs in tests 8c03305 do not call worker_from_id with pid<1 (#92) 25ee836 Add warning about new workers not sharing prior global state (#14) ``` Co-authored-by: Dilum Aluthge <dilum@aluthge.com> 26 February 2024, 20:18:44 UTC
a796a41 add suffix kwarg to `tempname` (#53474) `tempname` checks that the name its returning is not already a file, however if you want that filename to contain other information, like a file extension, that can mean the uniquing isn't complete. This adds `tempname(suffix = "_foo.txt")` to include a suffix in the name and uniquing check. --------- Co-authored-by: Jameson Nash <vtjnash@gmail.com> 26 February 2024, 19:52:42 UTC
4634c74 add array `typeinfo` support for NamedTuples (#53465) Closes https://github.com/JuliaLang/julia/issues/53455 26 February 2024, 19:17:38 UTC
3db7323 Simplify some tests with `@test ... {broken,skip}=...` (#53470) 26 February 2024, 14:07:32 UTC
3ebba8f use ScopedValues for MPFR precision and rounding (#51362) Should fix thread safety issues. Actually fixes #27139 26 February 2024, 14:06:32 UTC
b18824a Wrap `contrib/check-whitespace.jl` in a function (#53468) 26 February 2024, 08:18:52 UTC
4b47cc4 Remove stale explicit imports from many stdlibs (#53464) Found via my new https://github.com/ericphanson/ExplicitImports.jl ```julia using ExplicitImports ExplicitImports.inspect_session(; inner=print_stale_explicit_imports) ``` These are not being used in the modules they are being imported into (or in some cases they are being used, but only in a qualified way where the explicit import is unnecessary). It can happen that someone imports a name into a module in order to have it available in that namespace, to then access it from another module (e.g. `TOML.Internals` seems to work like this). I've tried to notice those situations and not remove the imports in cases where I suspect the import is playing such a role, but hopefully CI will figure out if I got it right in all cases. I only looked at stdlibs that happened to be loaded in my Julia session and whose code is in this repo, so there are probably more stale explicit imports out there. 26 February 2024, 07:36:47 UTC
34a5151 Use `@test ... skip=...` instead of `@test_skip` 26 February 2024, 01:57:48 UTC
849d551 Use `@test ... broken=...` instead of `@test_broken` 26 February 2024, 01:57:48 UTC
90d03b2 [LibGit2_jll] Update to v1.7.2 (#53467) Memo to self: * update version number in `stdlib/LibGit2_jll/Project.toml` * update test result in `stdlib/LibGit2_jll/test/runtests.jl` * update version number and commit sha in `deps/libgit2.version` * refresh checksums with `make -f contrib/refresh_checksums.mk -j libgit2` 26 February 2024, 00:37:13 UTC
669cbdc [MozillaCACerts_jll] Update to v2023-12-12 (#53466) Memo to self: * update the version in `stdlib/MozillaCACerts_jll/Project.toml` * update `MOZILLA_CACERT_VERSION` in `deps/libgit2.version` * generate new checksums with `make -f contrib/refresh_checksums.mk mozillacert` * manually delete old checksums in `deps/checksums/cacert-<OLD-VERSIONS>` 25 February 2024, 22:55:35 UTC
b8a0a39 Prevent tainting native code loading from propagating (#53457) When we use options like code coverage, we can't use the native code present in the cache file since it is not instrumented. PR #52123 introduced the capability of skipping the native code during loading, but created the issue that subsequent packages could have an explicit or implicit dependency on the native code. PR #53439 tainted the current process by setting `use_sysimage_native_code`, but this flag is propagated to subprocesses and lead to a regression in test time. Move this to a process local flag to avoid the regression. In the future we might be able to change the calling convention for cross-image calls to `invoke(ci::CodeInstance, args...)` instead of `ci.fptr(args...)` to handle native code not being present. --------- Co-authored-by: Jameson Nash <vtjnash@gmail.com> 25 February 2024, 02:48:37 UTC
714c6d0 clarify keyword arg method error message (#53460) This is a nice explanatory message, so I think we should make the wording less obscure. 25 February 2024, 01:26:49 UTC
138aba7 improve `--heap-size-hint` arg handling (#48050) Previously, `--heap-size-hint` would silently ignore many flavors of "bad" input, parsing things like "3PB" as 3 bytes. This change makes it significantly less permissive, erroring unless it can parse a number (still relying on the C `sscanf` `%Lf` format specifier there) with an optional unit (case-insensitive, either with or without the trailing `b`). Also test it. 23 February 2024, 22:04:29 UTC
9839aa3 free more thread state in jl_delete_thread and GC (#52198) This prevents most memory growth in workloads that start many foreign threads. In the future, we could do even better by moving pages in the heap of an exited thread (and also maybe pooled stacks) elsewhere so they can be reused, and then also free the TLS object itself. 23 February 2024, 21:38:06 UTC
936c8a6 make debug messages for relocatable srcfiles into a separate group (#53446) These create a lot of noisy output that is typically not interesting. As an example of the output : ``` ┌ Debug: include() files from /Users/kristoffercarlsson/.julia/compiled/v1.12/Pkg/tUTdb_NNLzf.ji are not relocatable │ srcfiles = │ Set{String} with 27 elements: │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/BinaryPlatforms_compat.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/MiniProgressBars.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/registry_instance.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/Registry.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/maxsum.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Types.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/REPLMode/command_declarations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/versionweights.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Artifacts.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Operations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/API.jl" │ ⋮ └ @ Base loading.jl:3051 ┌ Debug: include() files from /Users/kristoffercarlsson/.julia/compiled/v1.12/Pkg/tUTdb_Qo7WJ.ji are not relocatable │ srcfiles = │ Set{String} with 27 elements: │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/BinaryPlatforms_compat.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/MiniProgressBars.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/registry_instance.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/Registry.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/maxsum.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Types.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/REPLMode/command_declarations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/versionweights.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Artifacts.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Operations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/API.jl" │ ⋮ └ @ Base loading.jl:3051 ┌ Debug: include() files from /Users/kristoffercarlsson/.julia/compiled/v1.12/Pkg/tUTdb_bHWms.ji are not relocatable │ srcfiles = │ Set{String} with 27 elements: │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/BinaryPlatforms_compat.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/MiniProgressBars.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/registry_instance.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/Registry.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/maxsum.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Types.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/REPLMode/command_declarations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/versionweights.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Artifacts.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Operations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/API.jl" │ ⋮ └ @ Base loading.jl:3051 ┌ Debug: include() files from /Users/kristoffercarlsson/.julia/compiled/v1.12/Pkg/tUTdb_ePY5e.ji are not relocatable │ srcfiles = │ Set{String} with 27 elements: │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/BinaryPlatforms_compat.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/MiniProgressBars.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/registry_instance.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/Registry.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/maxsum.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Types.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/REPLMode/command_declarations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/versionweights.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Artifacts.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Operations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/API.jl" │ ⋮ └ @ Base loading.jl:3051 ┌ Debug: include() files from /Users/kristoffercarlsson/.julia/compiled/v1.12/Pkg/tUTdb_s9CWW.ji are not relocatable │ srcfiles = │ Set{String} with 27 elements: │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/BinaryPlatforms_compat.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/MiniProgressBars.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/registry_instance.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Registry/Registry.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/maxsum.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Types.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/REPLMode/command_declarations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Resolve/versionweights.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Artifacts.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/Operations.jl" │ "/Users/kristoffercarlsson/JuliaPkgs/Pkg.jl/src/API.jl" │ ⋮ ``` 23 February 2024, 20:04:41 UTC
ea1a0d2 when loading code for internal purposes, load stdlib files directly(#53326) This bypasses DEPOT_PATH, LOAD_PATH, and stale checks when loading known stdlib code for known purposes from known locations, specifically to avoid the problem that I cannot fix my tools because I have used my tools to break my tools. This helps avoid the situation that the user can break important Pkg, REPL, Socket or similar features simply because they chose to remove `@stdlib` from their environment. For example, if you make an edit to REPL, then this will trigger recompilation and load the edited version: ``` $ ./julia -e 'using REPL' -iq ┌ Info: Precompiling REPL [3fa0cd96-eef1-5676-8a61-b3b8758bbffb] (cache misses: include_dependency fsize change (2), invalid header (10), mismatched flags (1)) └ @ Base loading.jl:2643 julia> ``` But this will load the version that shipped with Julia, regardless of the state of the cache or the source code (unless you delete the cache files): ``` $ ./julia -iq julia> ``` Fixes #53365 23 February 2024, 19:59:20 UTC
2ebb896 Audit sequential consistent atomic usage in the codebase (#53440) 23 February 2024, 19:40:57 UTC
6cbed31 staticdata: fix assert from partially disabled native code (#53439) This should fix the assertion failure that has been plaguing the Pkg tests, as discussed in https://github.com/JuliaLang/julia/pull/52123#issuecomment-1959965395 23 February 2024, 16:16:17 UTC
923fe2d Add update mechanism for Terminfo, and common user-alias data (#53285) Now that we take care of terminfo parsing ourselves, having a clear origin and processing method for arriving at our reference terminfo data seems somewhat important. The original form was acquired by re-purposing some pre-processed terminfo data from NCurses (I forget the exact source). I considered adding a separate ingestion/processing script, but it occurred to me that it would make sense to have the method for updating the data file be _in_ the data file, by turning it into a quine. This seems to work rather well, and so long as the NCurses source file format stays the same, updating the terminfo data is now dead simple. While working on the terminfo files, some minor refactors popped up as "probably nice to have". One of which makes the reported number of flags/numbers/strings actually accurate. Lastly, to support the ergonomic use of capability variable names instead of the short (read: uninformative) capname, we now also import the NCurses-recognised extended capabilities, and generate/specify some nice aliases for them. ----- If we separate out the terminfo parser/data into a small stdlib, the state here will be the initial state of the repo. 23 February 2024, 08:19:02 UTC
6e1d062 Add annotate! method for AnnotatedIOBuffer (#53284) The annotate! function provides a convenient way of adding annotations to an AnnotatedString/AnnotatedChar without accessing any of the implementation details of the Annotated* types. When AnnotatedIOBuffer was introduced, an appropriate annotations method was added, but annotate! was missed. To correct that, we refactor the current annotate! method for AnnotatedString to a more general helper function _annotate! that operates on the annotation vector itself, and use this new helper method to easily provide an annotate! method for AnnotatedIOBuffer. 23 February 2024, 08:16:42 UTC
fee198b Add debug variant of loader_trampolines.o (#53437) This prevents a race condition when building 'julia-cli-debug julia-cli-release' simultaneously (as we do for libjulia_jll, and also generally seems appropriate given what is done for all other source files. Motivated by https://github.com/JuliaPackaging/Yggdrasil/pull/8151 so I'll first see if it works there. Closes #45002. 23 February 2024, 07:46:36 UTC
bf965f3 Fix typos in docstrings for `in` and `∉` (#53443) 23 February 2024, 03:31:51 UTC
37c48e8 Subtype: skip slow-path in `local_∀_∃_subtype` if inputs contain no ∃ typevar. (#53429) This should be safe as ∀ vars' bounds are frozen in env. If there's no ∃ var, then the current env won't change after `local_∀_∃_subtype`. Thus, the slow path should be equivalent to the fast path if the latter returns 1. Close #53371. 22 February 2024, 23:06:06 UTC
a125bc2 free even more state for exited threads 22 February 2024, 21:01:10 UTC
848ae2c free more thread state in jl_delete_thread and GC 22 February 2024, 20:53:22 UTC
a96726b Fix synchronization issue on the GC scheduler (#53355) This aims to slightly simplify the synchronization by making `n_threads_marking` the sole memory location of relevance for it, it also removes the fast path, because being protected by the lock is quite important so that the observed gc state arrays are valid. Fixes: #53350 Fixes: #52757 Maybe fixes: #53026 Co-authored-by: Jameson Nash <vtjnash@gmail.com> 22 February 2024, 17:24:54 UTC
ccba6c9 make `code_lowered` type stable (#53416) 22 February 2024, 11:41:07 UTC
a1db8da protect against PkgId and UUID being imported and losing Base prefix in create_expr_cache (#53387) Fixes https://github.com/JuliaLang/julia/issues/53381 22 February 2024, 09:30:07 UTC
8425b0e Fix documentation: thread pool of main thread (#53388) See https://github.com/JuliaLang/julia/issues/53217#issuecomment-1930891907 21 February 2024, 20:33:54 UTC
962d833 undo breaking change of removing `parent` field from CodeInfo (#53393) This drops the unnecessary breaking change from https://github.com/JuliaLang/julia/pull/53219 by re-adding the optional `parent` field to CodeInfo. A few months ago, I had actually already put together a branch that also fixed Keno's complaints about how it was not set reliably, so I copied that code here also, so that it should get set more reliably whenever a CodeInfo is associated with a MethodInstance (either because it called `retrieve_code_info` to get IR from the Method or `uncompress_ir` to get it from the inference cache). This does not entirely fix Cthulhu's test errors, since I don't see any particular reason to re-introduce the other fields (min_world, max_world, inferred, edges, method_for_inference_limit_heuristics) that got removed or are now set incorrectly, and most errors appear to be instead related to the `Expr(:boundscheck, true/false)` change. However, they could be trivially re-added back as placeholders, if someone encounters a broken package that still needs them. 21 February 2024, 20:18:43 UTC
65f24da doc: expand the `<:` doc string (#53001) Clear up some things, state some expected properties and limitations, add cross-references, add more examples. Co-authored-by: Jameson Nash <vtjnash@gmail.com> 21 February 2024, 14:54:33 UTC
ef8fab0 update libwhich to latest commit (#53398) It supports more platforms. it is part of on-going work to port julia to OpenBSD. 21 February 2024, 14:44:57 UTC
2126b67 [Serialization] fix format bug for pre_13 code pre_13 would fail to read the max_world field, resulting in the stream getting desynchronized and corrupted. Add some type-asserts to help detect that error earlier. 21 February 2024, 14:07:00 UTC
7057763 fix cases where metadata was not being set correctly 21 February 2024, 14:07:00 UTC
f2c6334 undo breaking change of removing parent from CodeInfo The loss provided no value, as it is easy to provide this info, and has downstream users as well as being documented for use. 21 February 2024, 14:07:00 UTC
4e72944 posix compatibility: avoid grep GNU extension (#53400) the `.\+` meta-character is a GNU extension. prefer to use the POSIX equivalent `..*` to work with `grep` on wider platforms. it is part of on-going work to port julia to OpenBSD. 21 February 2024, 08:49:58 UTC
9d896dc Throw OverflowError on `copysign(typemin(Int)//1, 1)` (#53395) The default `copysign(x::Real, y::Real)` in `number.jl` works, so the incorrect method in `rational.jl` isn't needed. Here is a benchmark of the new version. ```julia using BenchmarkTools function foo!(c,a,b) c .= copysign.(a, b) nothing end N = 1000 @btime foo!(c,a,b) setup=(c=zeros(Rational{Int},N); a=rand(Int,N).//rand(Int,N); b=fill(-1,N)) ``` On master: 406.215 ns (0 allocations: 0 bytes) On this PR: 869.327 ns (0 allocations: 0 bytes) 21 February 2024, 04:07:45 UTC
3742d33 fix sysimage-native-code=yes option (#53407) Follow up to #53373, it seems this assert was broken for empty packages, causing CI issues. It is not necessary. Observed in CI here: https://github.com/JuliaLang/julia/pull/53395 https://buildkite.com/julialang/julia-master/builds/33860#018dc4dc-a603-4ad1-90cf-574540a41720 21 February 2024, 04:07:24 UTC
61fc907 fix code coverage bug in tail position and `else` (#53354) This was due to lowering keeping the same location info for the inserted `return` or `goto` statement, even though the last seen location might not have executed. Also fixes inliner handling of the sentinel `0` value for code locations. 20 February 2024, 21:42:30 UTC
d12a620 Fix NEWS.md (#53411) Closes #53409 Closes #53410 20 February 2024, 21:00:02 UTC
3351e57 jlchecksum: use sha512 if present (#53397) Add the BSD `sha512` binary for checking sha512 checksum (note that this is completely unrelated to the debian binary of the same name from `hashalot`). While here, silence `which` error message about unavailable binaries. 20 February 2024, 18:32:36 UTC
fbc766a More consistent return value for annotations, take 2 (#53333) Relands #53281 with some fixes noticed, though not the original causes of the failure. 20 February 2024, 17:21:58 UTC
5c14d33 posix compatibility: avoid using ln -v (#53396) the PR removes `-v` argument from `ln` invocation. it permits to stick to POSIX `ln` version without using extension. it is part of on-going work to port julia to OpenBSD. 20 February 2024, 17:06:23 UTC
1a90409 Add `_unsetindex!` methods for `SubArray`s and `CartesianIndex`es (#53383) With this, the following (and equivalent calls) work: ```julia julia> copyto!(view(zeros(BigInt, 2), 1:2), Vector{BigInt}(undef,2)) 2-element view(::Vector{BigInt}, 1:2) with eltype BigInt: #undef #undef julia> copyto!(view(zeros(BigInt, 2), 1:2), view(Vector{BigInt}(undef,2), 1:2)) 2-element view(::Vector{BigInt}, 1:2) with eltype BigInt: #undef #undef ``` Close https://github.com/JuliaLang/julia/issues/53098. With this, all the `_unsetindex!` branches in `copyto_unaliased!` work for `Array`-views, and this makes certain indexing operations vectorize and speed-up: ```julia julia> using BenchmarkTools julia> a = view(rand(100,100), 1:100, 1:100); b = view(similar(a), axes(a)...); julia> @btime copyto!($b, $a); 16.427 μs (0 allocations: 0 bytes) # master 2.308 μs (0 allocations: 0 bytes) # PR ``` Improves (but doesn't resolve) https://github.com/JuliaLang/julia/issues/40962 and https://github.com/JuliaLang/julia/issues/53158 ```julia julia> a = rand(40,40); b = rand(40,40); julia> @btime $a[1:end,1:end] .= $b; 5.383 μs (0 allocations: 0 bytes) # v"1.12.0-DEV.16" 3.194 μs (0 allocations: 0 bytes) # PR ``` ƒ Co-authored-by: Jameson Nash <vtjnash@gmail.com> 20 February 2024, 17:05:02 UTC
ea2b255 Add `Sys.isreadable, Sys.iswriteable`, update `ispath` (#53320) As discussed here: https://github.com/JuliaLang/julia/pull/53286#discussion_r1487039190 Readds the methods that were removed in https://github.com/JuliaLang/julia/pull/12819. 20 February 2024, 16:59:29 UTC
e9aa43d NEWS maintenance for 1.12 (#53359) 20 February 2024, 16:14:25 UTC
262dc3b move the 1.11 NEWS to HISTORY 20 February 2024, 16:12:58 UTC
1ef3693 update links in NEWS 20 February 2024, 16:11:39 UTC
c31f1ee add note on windows ACL problems 20 February 2024, 10:46:22 UTC
4f20a42 skip some tests on windows 20 February 2024, 10:46:18 UTC
02699bb fix sysimage-native-code=no option with pkgimages (#53373) Loading pkgimages would try to access the sysimage native code, which will fail. Ensure that no code tries to load if the sysimage native code is not available, as it may try to link against it. Fixes #53147 19 February 2024, 12:52:29 UTC
9c0f1dc add being able to pass a `CacheFlags()` to `isprecompiled` to verify a precompile file against a set of custom flags (#53332) 19 February 2024, 12:11:08 UTC
59102aa 🤖 [master] Bump the Pkg stdlib from 6dd0e7c9e to 76070d295 (#53357) Stdlib: Pkg URL: https://github.com/JuliaLang/Pkg.jl.git Stdlib branch: master Julia branch: master Old commit: 6dd0e7c9e New commit: 76070d295 Julia version: 1.12.0-DEV Pkg version: 1.11.0(Does not match) Bump invoked by: @IanButterworth Powered by: [BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl) Diff: https://github.com/JuliaLang/Pkg.jl/compare/6dd0e7c9e99d578aa5477e2c78c91a161ce4c357...76070d295fc4a1f27f852e05400bbc956962e084 ``` $ git log --oneline 6dd0e7c9e..76070d295 76070d295 Prevent repl crash on invalid command (#3800) d267986c2 RFC: stop testing non-ARM on mac on CI (#3794) 2571be6d1 CI: Add Apple Silicon (macOS aarch64) to the CI matrix (#3793) 3075fb78c Simplify Pkg.Registry APIs. (#3785) e6f1e0902 Explain about Manifest.toml per julia version (#3791) ``` Co-authored-by: Dilum Aluthge <dilum@aluthge.com> 19 February 2024, 02:07:49 UTC
1c25d93 Refactor CodeInfo/CodeInstance separation and interfaces (#53219) The `CodeInfo` type is one of the oldest types in the system and has grown a bit of cruft. In particular, the `rettype`, `inferred`, `parent`, `edges`, `min_world`, `max_world` fields are not used for the original purpose of representing code, but for one or more of (in decreasing order of badness): 1. Smuggling extra results from inference into the compiler 2. Sumggling extra arguments into OpaqueClosure constructors 3. Passing extra information from generated functions to inference The first of these points in particular causes a fair bit of mixup between caching concerns and compiler concerns and results in external abstract interpreters maintainging their own dummy CodeInfos, just to comply with the interface. Originally, I just wanted to clean up that bit, but it didn't really make sense as a standalone piece, so this PR is more comprehensive. In particular, this PR: 1. Removes the `parent`, `inferred` and `rettype` fields of `CodeInfo`. They are largely vestigal and code accessing these is probably doing the wrong thing. They should instead be looking at either the CodeInstance or remembering the query that was asked of the cache in the first place. 2. Makes `edges`, `min_world` and `max_world` used for generated functions only. All other uses were replaced by appropriate queries on the CodeInstance. In particular, inference no longer sets these. In the future we may want to consider removing these also and having generated functions return some other object, but that is a topic to revisit once the broader compiler plugins landscape is more clear. 3. Makes the external type inference interface return `CodeInstance` rather than `CodeInfo`. This results in a lot of cleanup, because many functions had multiple code paths, some for CodeInstance and others for fallback to inference/CodeInfo. This is all cleaned up now. If you don't have a CodeInstance, you can ask inference for one. This CodeInstance may or may not be in the cache, but you can look at its types, compile it, etc. 4. Moves the main inference entrypoint out of the codegen library. There is still a little bit of entangelement, but this makes codegen much more of an independent system that you give a CodeInstance and it just fills in the invoke pointer for. With these changes, only the third use of the above mentioned fields remains. The overall theme here is decoupling. Over time, various parties have wanted to use the julia compiler with custom IR datastructure, backend code generators, caches, etc. This doesn't quite get us all the way there, but makes inference and codegen much more independent with a clear IR-format-independent interface (CodeInstance). --------- Co-authored-by: Valentin Churavy <v.churavy@gmail.com> 19 February 2024, 01:35:56 UTC
c0a93f8 fixed typo in performance-tips.md (#53379) I have ESL, but I'm quite certain in should be "repeatedly accessing it" and not "repeated access it" 18 February 2024, 16:01:59 UTC
4505855 fix typos in docs (#53378) fix typos in docs 18 February 2024, 15:44:13 UTC
2a9c95a Implement `circshift(::Tuple, ::Integer)` (#52438) 18 February 2024, 13:10:42 UTC
back to top