Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
7dafd41
bump Pkg to latest 1.13
KristofferC Feb 4, 2026
db3d2b9
Fix `remove-argument-side-effects` with keyword call (#60195)
mlechu Nov 22, 2025
7a96c45
Compiler: fix typo in can_propagate_conditional (#60902)
Keno Feb 2, 2026
8e464cf
Term hist UI tweaks (#60076)
fingolfin Nov 13, 2025
5132fec
Improve the invalidation situation somewhat when someone defines `con…
KristofferC Dec 17, 2025
954b3de
Remove potential unitialized memory in the GC stack (#60651)
gbaraldi Jan 16, 2026
26e4244
Fix precompilepkgs when waiting for another job (#60811)
IanButterworth Feb 3, 2026
b49c181
bump JuliaSyntax to latest 1.13
KristofferC Feb 4, 2026
ea9608d
[backports-release-1.13] Bump actions/checkout from 5.0.0 to 6.0.2 (#…
dependabot[bot] Feb 6, 2026
3b0d8c7
deprecate `merge(::Callable ..)` in favor of `mergewith` (#59775)
adienes Oct 27, 2025
a4c67b4
Fix embedding with MSVC (#60142)
barche Nov 15, 2025
d513153
1.13: Copy module metadata from source module, if any. (#58508) (#60987)
maleadt Feb 11, 2026
f6d4f88
[backports-release-1.13] Bump JuliaSyntax version (#61068)
mlechu Feb 25, 2026
3f631d2
Bump Documenter to 1.17.0 (for Julia 1.13) (#61119)
fingolfin Feb 26, 2026
6d7a45f
nospecialize `fieldtypes` and `InteractiveUtils._subtypes_in!` (#61156)
timholy Feb 25, 2026
cc9e397
Ensure CI from external MI and foreign abs interpreter survive precom…
vchuravy Mar 3, 2026
f52ee6f
Set max_methods for `lock` and `unlock` to 1 (#60803)
JamesWrigley Jan 30, 2026
68f1b06
Artifacts stdlib: Fix some tests if we aren't running with `--depwarn…
DilumAluthge Feb 8, 2026
302800d
codegen: Mark resolved `const` `GlobalRef` as method root (#60945)
topolarity Feb 10, 2026
bb80f2e
trimming: fix-up support for `Core._apply_iterate` (#60062)
topolarity Feb 12, 2026
8515b6f
Make.inc: fix xcrun invocation (#61040)
fingolfin Feb 15, 2026
df34dfe
PCRE2_jll: Fix Windows DLL name to use versioned filename (#61047)
IanButterworth Feb 16, 2026
416ba8c
Fix `Base.show(io::IO, b::Binding)` for e.g. `:(:)` or `:(==)` (#61043)
fingolfin Feb 17, 2026
a9d6491
Fix history search appending to typed text instead of replacing (#609…
riazation42 Feb 17, 2026
9afb7d4
Fix GDBJITDebugInfoRegistrationPlugin deadlock (#61049)
xal-0 Feb 17, 2026
84b8e2d
codegen: fix bitcast of union values with inline_roots (#61027)
gbaraldi Feb 19, 2026
5584383
runtime_intrinsics: Fix f16 ABI fallback (#61094)
Keno Feb 20, 2026
6a24ae9
fix typo in GC thrashing detection condition (#61112)
adienes Feb 21, 2026
3c4f84c
Serialization: Fix typo: `method` ---> `meth` (#61108)
DilumAluthge Feb 21, 2026
4ff8248
codegen: Replace saveIP with InsertPointGuard (#61107)
vtjnash Feb 21, 2026
b8646f7
module: add missing GC write barriers for bpart->restriction stores (…
adienes Feb 22, 2026
942d689
Unicode: Qualify `Base.ismalformed` when calling it (#61140)
DilumAluthge Feb 26, 2026
9bcd85e
Add API to disable full collections (#61087)
gbaraldi Feb 26, 2026
c552dda
REPL: Fix the `doc_completions(::Symbol)` method, and add another met…
DilumAluthge Feb 28, 2026
91da460
REPL: Convert char to string before calling `escape_string` (#61143)
DilumAluthge Mar 1, 2026
7ffa167
Unicode: Add some tests for `combining_class` (#61172)
DilumAluthge Mar 1, 2026
c48eb99
REPL: add OSC 52 clipboard fallback and graceful degradation (#61151)
Keno Mar 3, 2026
0a82b27
bump Pkg to latest 1.13
KristofferC Mar 3, 2026
a56051c
REPL: Add OSC parsing to the keymap (#61181)
Keno Mar 2, 2026
ca12ca6
Serialization stdlib: Replace a call to `Core.memoryref` with `Core.m…
DilumAluthge Mar 3, 2026
51d1c7b
Handle non-standard Method.source in jl_ir_flag_has_image_globalref (…
maleadt Mar 4, 2026
486eee8
prefer returning the loaded version from `pkgversion` (#61136)
KristofferC Mar 5, 2026
d7cad1d
Set sret alignment to julia_alignment (#61192)
maleadt Mar 3, 2026
bebdbbf
Restore check to avoid duplicate method tables serialization (#61221)
maleadt Mar 6, 2026
2e5181b
Avoid using `mktemp -p` (#60091)
fingolfin Nov 10, 2025
c18c945
build: use mktemp more (#60080)
vtjnash Dec 3, 2025
d9ed2ed
Don't delete input `expmap` files (#60329)
giordano Dec 6, 2025
937ea23
stdlib: Move TOML serializer to Base (#61210)
topolarity Mar 5, 2026
4975702
Profile: simplify `Memory` in heap snapshot (#60930)
topolarity Mar 6, 2026
947c085
build: defer libwhich lookup in symlink_system_library (#61243)
fingolfin Mar 6, 2026
654d257
fix pkg loading from read-only filesystems on unix (#61253)
nolta Mar 7, 2026
214852c
Make `FileWatching.Pidfile` public (#61208)
fingolfin Mar 7, 2026
3f38a75
Dates: fix a syntax error on 1.13
KristofferC Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/Typos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
timeout-minutes: 5
steps:
- name: Checkout the JuliaLang/julia repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Check spelling with typos
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/Whitespace.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
timeout-minutes: 2
steps:
- name: Checkout the JuliaLang/julia repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: julia-actions/setup-julia@5c9647d97b78a5debe5164e9eec09d653d29bd71 # v2.6.1
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cffconvert.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out a copy of the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

Expand Down
2 changes: 1 addition & 1 deletion Compiler/src/abstractinterpretation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ function can_propagate_conditional(@nospecialize(rt), argtypes::Vector{Any})
return false
end
return isa(argtypes[rt.slot], Conditional) &&
is_const_bool_or_bottom(rt.thentype) && is_const_bool_or_bottom(rt.thentype)
is_const_bool_or_bottom(rt.thentype) && is_const_bool_or_bottom(rt.elsetype)
end

function propagate_conditional(rt::InterConditional, cond::Conditional)
Expand Down
14 changes: 10 additions & 4 deletions Compiler/src/precompile.jl
Original file line number Diff line number Diff line change
Expand Up @@ -311,8 +311,7 @@ function enqueue_specialization!(all::Bool, worklist, mi::Core.MethodInstance)
while codeinst !== nothing
do_compile = false
if codeinst.owner !== nothing
# TODO(vchuravy) native code caching for foreign interpreters
# Skip foreign code instances
# This code instance is from a foreign interpreter, so we skip it
elseif use_const_api(codeinst) # Check if invoke is jl_fptr_const_return
do_compile = true
elseif codeinst.invoke != C_NULL || codeinst.precompile
Expand Down Expand Up @@ -344,7 +343,8 @@ function compile_and_emit_native(worlds::Vector{UInt},
newmodules, # Vector{Module} or Nothing
mod_array, # Vector{Module} or Nothing
all::Bool,
module_init_order::Vector{Any}) # Vector{Module}
module_init_order::Vector{Any}, # Vector{Module}
ext_foreign_cis::Vector{Any}) # Vector{CodeInstance}
latestworld = worlds[end]

# Step 1: Precompile all __init__ methods that will be required
Expand Down Expand Up @@ -375,7 +375,13 @@ function compile_and_emit_native(worlds::Vector{UInt},
if new_ext_cis !== nothing
for i in 1:length(new_ext_cis::Vector{Any})
ci = new_ext_cis[i]::CodeInstance
enqueue_specialization!(all, specialization_worklist, get_ci_mi(ci))
if ci.owner !== nothing
# enqueue_specialization will skip over CIs from foreign interpreters
# and currently will visit at most one (do_compile) CI per method instance
push!(ext_foreign_cis, ci)
else
enqueue_specialization!(all, specialization_worklist, get_ci_mi(ci))
end
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion Compiler/src/typeinfer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ function finish!(interp::AbstractInterpreter, caller::InferenceState, validation
inferred_result = maybe_compress_codeinfo(interp, mi, inferred_result)
result.is_src_volatile = false
elseif ci.owner === nothing
# The global cache can only handle objects that codegen understands
# The global cache can only handle objects that codegen understands (nothing or CodeInfo)
inferred_result = nothing
end
end
Expand Down
3 changes: 2 additions & 1 deletion Compiler/src/verifytrim.jl
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,6 @@ function verify_codeinstance!(interp::NativeInterpreter, codeinst::CodeInstance,
end
# TODO: check for calls to Base.atexit?
elseif isexpr(stmt, :call)
error = "unresolved call"
farg = stmt.args[1]
ftyp = widenconst(argextype(farg, codeinfo, sptypes))
if ftyp <: IntrinsicFunction
Expand Down Expand Up @@ -250,6 +249,8 @@ function verify_codeinstance!(interp::NativeInterpreter, codeinst::CodeInstance,
elseif Core.memoryrefmodify! isa ftyp
error = "trim verification not yet implemented for builtin `Core.memoryrefmodify!`"
else @assert false "unexpected builtin" end
else
error = "unresolved call"
end
extyp = argextype(SSAValue(i), codeinfo, sptypes)
if extyp === Union{}
Expand Down
12 changes: 12 additions & 0 deletions Compiler/test/codegen.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1075,3 +1075,15 @@ let io = IOBuffer()
str = String(take!(io))
@test occursin("julia.write_barrier", str)
end

# sret parameters must have an alignment attribute (required by LLVM LangRef).
@testset "sret alignment attribute" begin
struct SretAlignTest
a::Float32
b::Float32
c::Float32
end
@noinline f_srettest(x::Float32) = SretAlignTest(x, x+1, x+2)
ir = get_llvm(f_srettest, Tuple{Float32}, true, true, true)
@test occursin(r"sret\([^)]+\) align \d+", ir)
end
14 changes: 14 additions & 0 deletions Compiler/test/inference.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6531,4 +6531,18 @@ function haskey_inference_test()
end
@inferred haskey_inference_test()

# issue #60883: conditional propagation through wrapper functions
mutable struct A60883
a::Int
end
inner60883(a, b) = iszero(a.a) && !b
outer60883(a, b) = inner60883(a, b)
function issue60883()
a = A60883(0)
b = iszero(a.a)
if outer60883(a, b) else end
return b # should not be narrowed to Const(false)
end
@test issue60883() === true

end # module inference
2 changes: 1 addition & 1 deletion Make.inc
Original file line number Diff line number Diff line change
Expand Up @@ -1708,7 +1708,7 @@ endif
CLANGSA_FLAGS :=
CLANGSA_CXXFLAGS :=
ifeq ($(OS), Darwin) # on new XCode, the files are hidden
CLANGSA_FLAGS += -isysroot $(shell xcrun --show-sdk-path -sdk macosx)
CLANGSA_FLAGS += -isysroot $(shell xcrun --show-sdk-path --sdk macosx)
endif
ifeq ($(USEGCC),1)
# try to help clang find the c++ files for CC by guessing the value for --prefix
Expand Down
5 changes: 5 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@ Deprecated or removed

* The method `merge(combine::Callable, d::AbstractDict...)` is now deprecated to favor `mergewith` instead ([#59775]).

Deprecated or removed
---------------------

* The method `merge(combine::Callable, d::AbstractDict...)` is now deprecated to favor `mergewith` instead ([#59775]).

<!--- generated by NEWS-update.jl: -->
[#47102]: https://github.com/JuliaLang/julia/issues/47102
[#48507]: https://github.com/JuliaLang/julia/issues/48507
Expand Down
2 changes: 1 addition & 1 deletion base/Base.jl
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ include("threadcall.jl")
# code loading
include("uuid.jl")
include("pkgid.jl")
include("toml_parser.jl")
include("toml/toml.jl")
include("linking.jl")
include("loading.jl")

Expand Down
5 changes: 2 additions & 3 deletions base/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,10 @@ endif

define symlink_system_library
libname_$2 := $$(notdir $(call versioned_libname,$2,$3))
libpath_$2 := $$(shell $$(call spawn,$$(LIBWHICH)) -p $$(libname_$2) 2>/dev/null)
symlink_$2: $$(build_private_libdir)/$$(libname_$2)
$$(build_private_libdir)/$$(libname_$2):
@if [ -e "$$(libpath_$2)" ]; then \
REALPATH=$$(libpath_$2); \
@REALPATH=`$$(call spawn,$$(LIBWHICH)) -p $$(libname_$2) 2>/dev/null`; \
if [ -e "$$$$REALPATH" ]; then \
$$(call resolve_path,REALPATH) && \
[ -e "$$$$REALPATH" ] && \
rm -f "$$@" && \
Expand Down
2 changes: 1 addition & 1 deletion base/docs/Docs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ function metadata(__source__, __module__, expr, ismodule)
if isa(eachex, Symbol) || isexpr(eachex, :(::))
# a field declaration
if last_docstr !== nothing
push!(fields, P(namify(eachex), last_docstr))
push!(fields, P(namify(eachex)::Symbol, last_docstr))
last_docstr = nothing
end
elseif isexpr(eachex, :function) || isexpr(eachex, :(=))
Expand Down
9 changes: 8 additions & 1 deletion base/docs/bindings.jl
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,14 @@ function Base.show(io::IO, b::Binding)
if b.mod === Base.active_module()
print(io, b.var)
else
print(io, b.mod, '.', Base.isoperator(b.var) ? ":" : "", b.var)
print(io, b.mod, '.')
if Base.isoperator(b.var)
# ensures symbols are quoted right, so e.g. :(==), :(:), :+ or :-
show(io, b.var)
else
# print ordinary identifiers without any quoting
print(io, b.var)
end
end
end

Expand Down
2 changes: 2 additions & 0 deletions base/io.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ struct SystemError <: Exception
end

lock(::IO) = nothing
typeof(lock).name.max_methods = UInt8(1)
unlock(::IO) = nothing
typeof(unlock).name.max_methods = UInt8(1)

"""
reseteof(io)
Expand Down
30 changes: 20 additions & 10 deletions base/loading.jl
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,16 @@ struct LoadingCache
located::Dict{Tuple{PkgId, Union{String, Nothing}}, Union{Tuple{String, String}, Nothing}}
end
const LOADING_CACHE = Ref{Union{LoadingCache, Nothing}}(nothing) # n.b.: all access to and through this are protected by require_lock
LoadingCache() = LoadingCache(load_path(), Dict(), Dict(), Dict(), Set(), Dict(), Dict(), Dict())
LoadingCache() = LoadingCache(
load_path(),
Dict{String, UUID}(),
Dict{String, Union{Bool, String}}(),
Dict{String, Union{Nothing, String}}(),
Set{String}(),
Dict{Tuple{PkgId, String}, Union{Nothing, Tuple{PkgId, String}}}(),
Dict{String, Union{Nothing, Tuple{PkgId, String}}}(),
Dict{Tuple{PkgId, Union{String, Nothing}}, Union{Tuple{String, String}, Nothing}}()
)


struct TOMLCache{Dates}
Expand Down Expand Up @@ -617,13 +626,15 @@ the form `pkgversion(@__MODULE__)` can be used.
This function was introduced in Julia 1.9.
"""
function pkgversion(m::Module)
path = pkgdir(m)
path === nothing && return nothing
@lock require_lock begin
v = get_pkgversion_from_path(path)
pkgorigin = get(pkgorigins, PkgId(moduleroot(m)), nothing)
# Cache the version
if pkgorigin !== nothing && pkgorigin.version === nothing
if pkgorigin !== nothing && pkgorigin.version !== nothing
return pkgorigin.version
end
path = pkgdir(m)
path === nothing && return nothing
v = get_pkgversion_from_path(path)
if pkgorigin !== nothing
pkgorigin.version = v
end
return v
Expand Down Expand Up @@ -1909,9 +1920,8 @@ function compilecache_freshest_path(pkg::PkgId;
try
# update timestamp of precompilation file so that it is the first to be tried by code loading
touch(path_to_try)
catch ex
catch
# file might be read-only and then we fail to update timestamp, which is fine
ex isa IOError || rethrow()
end
return path_to_try
@label check_next_path
Expand Down Expand Up @@ -2133,8 +2143,8 @@ end
if stalecheck
try
touch(path_to_try) # update timestamp of precompilation file
catch ex # file might be read-only and then we fail to update timestamp, which is fine
ex isa IOError || rethrow()
catch
# file might be read-only and then we fail to update timestamp, which is fine
end
end
# finish loading module graph into staledeps
Expand Down
7 changes: 6 additions & 1 deletion base/precompilation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1258,6 +1258,11 @@ function _color_string(cstr::String, col::Union{Int64, Symbol}, hascolor)
end

# Can be merged with `maybe_cachefile_lock` in loading?
# Wraps the precompilation function `f` with cachefile lock handling.
# Returns the result from `f()`, which can be:
# - `nothing`: cache already existed
# - `Tuple{String, Union{Nothing, String}}`: this process just compiled
# - `Exception`: compilation failed
function precompile_pkgs_maybe_cachefile_lock(f, io::IO, print_lock::ReentrantLock, fancyprint::Bool, pkg_config, pkgspidlocked, hascolor, parallel_limiter::Base.Semaphore)
if !(isdefined(Base, :mkpidlock_hook) && isdefined(Base, :trymkpidlock_hook) && Base.isdefined(Base, :parse_pidfile_hook))
return f()
Expand All @@ -1284,7 +1289,7 @@ function precompile_pkgs_maybe_cachefile_lock(f, io::IO, print_lock::ReentrantLo
Base.release(parallel_limiter) # release so other work can be done while waiting
try
# wait until the lock is available
@invokelatest Base.mkpidlock_hook(() -> begin
cachefile = @invokelatest Base.mkpidlock_hook(() -> begin
delete!(pkgspidlocked, pkg_config)
Base.acquire(f, parallel_limiter)
end,
Expand Down
2 changes: 1 addition & 1 deletion base/runtime_internals.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1363,7 +1363,7 @@ julia> fieldtypes(Foo)
(Int64, String)
```
"""
fieldtypes(T::Type) = (@_foldable_meta; ntupleany(i -> fieldtype(T, i), fieldcount(T)))
fieldtypes(@nospecialize T::Type) = (@_foldable_meta; ntupleany(i -> fieldtype(T, i), fieldcount(T)))

# return all instances, for types that can be enumerated

Expand Down
2 changes: 1 addition & 1 deletion base/shell.jl
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ function shell_split(s::AbstractString)
parsed = shell_parse(s, false)[1]
args = String[]
for arg in parsed
push!(args, string(arg...))
push!(args, string(arg...)::String)
end
args
end
Expand Down
Loading
Loading