Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating dev to 2590e675 #77

Merged
merged 865 commits into from
Dec 6, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
865 commits
Select commit Hold shift + click to select a range
0b9fcb5
Implement faster `issubset` for `CartesianIndices{N}` (#56282)
xili-h Oct 23, 2024
6c70bf7
Improve doc example: Extracting the type parameter from a super-type …
ArnoStrouwen Oct 23, 2024
005608a
llvmpasses: force vector width for compatibility with non-x86 hosts. …
maleadt Oct 23, 2024
b9b4dfa
Reduce generic matrix*vector latency (#56289)
jishnub Oct 23, 2024
28b0abd
Type `Base.is_interactive` as `Bool` (#56303)
LilithHafner Oct 23, 2024
4236a33
REPL: don't complete str and cmd macros when the input matches the in…
IanButterworth Oct 23, 2024
0a6277d
fix REPL test if a "juliadev" directory exists in home (#56218)
nhz2 Oct 23, 2024
894296b
Fix trampoline warning on x86 as well (#56280)
gbaraldi Oct 23, 2024
53ffe56
typeintersect: more fastpath to skip intersect under circular env (#5…
N5N3 Oct 23, 2024
2a06376
Preserve type in `first` for `OneTo` (#56263)
jishnub Oct 24, 2024
bf6da77
Matmul: dispatch on specific blas paths using an enum (#55002)
jishnub Oct 24, 2024
c188e0c
Scaling `mul!` for generic `AbstractArray`s (#56313)
jishnub Oct 24, 2024
20f933a
InteractiveUtils.jl: fixes issue where subtypes resolves bindings and…
dgleich Oct 24, 2024
f285de5
[CRC32c] Support AbstractVector{UInt8} as input (#56164)
nhz2 Oct 24, 2024
5cdf378
Put `jl_gc_new_weakref` in a header file again (#56319)
lgoettgens Oct 24, 2024
bc66047
use textwidth for string display truncation (#55442)
stevengj Oct 24, 2024
dc60727
Use `pwd()` as the default directory to walk in `walkdir` (#55550)
fredrikekre Oct 24, 2024
beda632
Reset mtime of BOLTed files to prevent make rebuilding targets (#55587)
Zentrik Oct 24, 2024
c94102b
add docstring note about `displaysize` and `IOContext` with `context`…
IanButterworth Oct 25, 2024
ac5bb66
LinearAlgebra: replace some hardcoded loop ranges with axes (#56243)
jishnub Oct 25, 2024
29b509d
inference: fix `[modifyfield!|replacefield!]_tfunc`s (#56310)
aviatesk Oct 25, 2024
e8aacbf
inference: don't allow `SSAValue`s in assignment lhs (#56314)
aviatesk Oct 25, 2024
ec2e121
Fix `unsafe_read` for `IOBuffer` with non dense data (#55776)
nhz2 Oct 25, 2024
b38fde1
support `isless` for zero-dimensional `AbstractArray`s (#55772)
nsajko Oct 25, 2024
bf8f814
inference: don't add backdge when `applicable` inferred to return `Bo…
aviatesk Oct 25, 2024
b81e33f
Mark `require_one_based_indexing` and `has_offset_axes` as public (#5…
adrhill Oct 25, 2024
fb297af
Avoid some allocations in various `println` methods (#56308)
PallHaraldsson Oct 25, 2024
49e3b87
Add a developer documentation section to the `LinearAlgebra` docs (#5…
jishnub Oct 25, 2024
db3d816
drop require lock when not needed during loading to allow parallel pr…
vtjnash Oct 25, 2024
2b3a0f0
Make `String(::Memory)` copy (#54457)
nhz2 Oct 25, 2024
f1a90e0
🤖 [master] Bump the Pkg stdlib from 799dc2d54 to 116ba910c (#56336)
DilumAluthgeBot Oct 25, 2024
f6a38e0
Wall-time/all tasks profiler (#55889)
d-netto Oct 25, 2024
ee09ae7
recommend explicit `using Foo: Foo, ...` in package code (was: "using…
KristofferC Oct 26, 2024
446d20f
Change some hardcoded loop ranges to axes in dense linalg functions (…
jishnub Oct 27, 2024
fcf7ec0
Make `LinearAlgebra.haszero` public (#56223)
jishnub Oct 27, 2024
87ecf8f
remove spurious parens in profiler docs (#56357)
d-netto Oct 27, 2024
2cdfe06
Fix `log_quasitriu` for internal scaling `s=0` (#56311)
aravindh-krishnamoorthy Oct 28, 2024
9dbdeb4
loading: clean up more concurrency issues (#56329)
vtjnash Oct 28, 2024
e802eff
make `_unsetindex` fast for isbits eltype (#56364)
oscardssmith Oct 28, 2024
4c076c8
improved `eltype` for `flatten` with tuple argument (#55946)
matthias314 Oct 28, 2024
710e1f9
Reland "Reroute (Upper/Lower)Triangular * Diagonal through __muldiag …
jishnub Oct 29, 2024
cb757c4
Add one-arg `norm` method (#56330)
jishnub Oct 29, 2024
07530bc
fix a forgotten rename `readuntil` -> `copyuntil` (#56380)
KristofferC Oct 29, 2024
e3d5aa3
remove unnecessary operations from `typejoin_union_tuple` (#56379)
aviatesk Oct 29, 2024
e4dc9d3
precompile: fix performance issues with IO (#56370)
vtjnash Oct 29, 2024
9850a38
cache the `find_all_in_cache_path` call during parallel precompilatio…
KristofferC Oct 29, 2024
a9342d6
[docs] Fix note admonition in llvm-passes.md (#56392)
giordano Oct 30, 2024
2fe6562
structure-preserving broadcast for `SymTridiagonal` (#56001)
jishnub Oct 30, 2024
599b7ec
🤖 [master] Bump the Pkg stdlib from 116ba910c to 9f8e11a4c (#56386)
DilumAluthgeBot Oct 30, 2024
717bf54
load extensions with fewer triggers earlier (#49891)
KristofferC Oct 30, 2024
c0ce290
Dispatch in generic_matmatmul (#56384)
jishnub Oct 30, 2024
db6e95e
Add `atol` to addmul tests (#56210)
jishnub Oct 30, 2024
c6e7f83
Export jl_gc_new_weakref again via julia.h (#56373)
fingolfin Oct 31, 2024
2a24b8f
InteractiveUtils: define `InteractiveUtils.@code_ircode` (#56390)
aviatesk Oct 31, 2024
f8c6d1c
Fix some missing write barriers and add some helpful comments (#56396)
Keno Oct 31, 2024
da74ef1
compiler: fix specialization mistake introduced by #40985 (#56404)
vtjnash Oct 31, 2024
7715cf2
Avoid racy double-load of binding restriction in `import_module` (#56…
Keno Oct 31, 2024
040174c
define `InteractiveUtils.@infer_[return|exception]_type` (#56398)
aviatesk Nov 1, 2024
671e1d8
irinterp: set `IR_FLAG_REFINED` for narrowed `PhiNode`s (#56391)
aviatesk Nov 1, 2024
dc57caf
document isopen(::Channel) (#56376)
mrufsvold Nov 1, 2024
706a4f6
Make build system respect `FORCE_COLOR` and `NO_COLOR` settings (#56346)
giordano Nov 1, 2024
7635190
Add `edges` vector to CodeInstance/CodeInfo to keep backedges as edge…
vtjnash Nov 1, 2024
85dc2c7
docs: remove `dirname.c` from THIRDPARTY file (#56413)
inkydragon Nov 1, 2024
7d81897
Allow ext → ext dependency if triggers are a strict superset (#56368)…
topolarity Nov 1, 2024
3de1b1d
[docs] Fix rendering of warning admonition in llvm passes page (#56412)
giordano Nov 1, 2024
4393f8c
Fix dispatch for `rdiv!` with `LU` (#55764)
dkarrasch Nov 1, 2024
770b144
Remove overwritten method of OffsetArray (#56414)
JamesWrigley Nov 1, 2024
c3c3cd1
Add a missing GC root in constant declaration (#56408)
Keno Nov 2, 2024
10a1d6f
Teach compiler about partitioned bindings (#56299)
Keno Nov 2, 2024
9d1cedb
Restore JL_NOTSAFEPOINT in jl_stderr_obj (#56407)
Keno Nov 2, 2024
715eb1d
reland "Inlining: Remove outdated code path for GlobalRef movement (#…
aviatesk Nov 2, 2024
671fc42
copy effects key to `Base.infer_effects` (#56363)
MasonProtter Nov 2, 2024
fe67097
Fix `make install` for asan build (#56347)
Zentrik Nov 2, 2024
9a77240
Add dims check to triangular mul (#56393)
jishnub Nov 3, 2024
0249feb
clarify short-circuit && and || docs (#56420)
stevengj Nov 3, 2024
74640a1
docs: replace 'leaf types' with 'concrete types' (#56418)
fatteneder Nov 4, 2024
50713ee
Remove aggressive constprop annotation on generic_matmatmul_wrapper! …
jishnub Nov 4, 2024
349f142
Clarify the FieldError docstring (#55222)
LilithHafner Nov 4, 2024
66c50ac
Allow `Time`s to be rounded to `Period`s (#52629)
TheLostLambda Nov 4, 2024
36f06b8
Replace unconditional store with cmpswap to avoid deadlocking in jl_f…
gbaraldi Nov 4, 2024
589203e
Correct nothrow modeling of `get_binding_type` (#56430)
Keno Nov 5, 2024
8e0a171
add tip for module docstrings before load (#56445)
IanButterworth Nov 5, 2024
567a7ca
compiler: Strengthen some assertions and fix a couple small bugs (#56…
Keno Nov 5, 2024
11cd809
inference: minor follow-ups to JuliaLang/julia#56299 (#56450)
aviatesk Nov 5, 2024
50ad4d9
Ensure that String(::Memory) returns only a String, not any owner (#5…
vtjnash Nov 5, 2024
9e99ed5
Take safepoint lock before going to sleep in the scheduler. (#56443)
gbaraldi Nov 5, 2024
9af0dea
Profile: mention `kill -s SIGUSR1 julia_pid` for Linux (#56441)
Moelf Nov 5, 2024
cbcad6f
Fix and test an overflow issue in `searchsorted` (#56464)
LilithHafner Nov 5, 2024
d3130ae
Update docs of calling convention arg in `:foreigncall` AST node (#56…
fatteneder Nov 6, 2024
80a2791
`step(::AbstractUnitRange{Bool})` should return `Bool` (#56405)
putianyi889 Nov 6, 2024
d63dd4b
fixup! JuliaLang/julia#56028, fix up the type-level escapability check
aviatesk Nov 5, 2024
f49f292
add `show(::IO, ::ArgEscapeInfo)`
aviatesk Nov 6, 2024
1782c6b
EA: disable finalizer inlining for allocations that are edges of `Phi…
aviatesk Nov 6, 2024
df4db53
fixup! JuliaLang/julia#56028, fix up the type-level escapability chec…
aviatesk Nov 6, 2024
e3d26c2
make `verify_ir` error messages more informative (#56452)
aviatesk Nov 6, 2024
ded3e3d
[GHA] Explicitly install Julia for whitespace workflow (#56468)
giordano Nov 6, 2024
bce3d4d
Allow taking Matrix slices without an extra allocation (#56236)
vtjnash Nov 6, 2024
efc43cb
[late-gc-lowering] null-out GC frame slots for dead objects (#52935)
d-netto Nov 6, 2024
d90c2e2
Added test for resolving array references in exprresolve (#56471)
Priynsh Nov 6, 2024
37f0220
Fix and test searchsorted for arrays whose first index is `typemin(In…
LilithHafner Nov 6, 2024
dbf2c4b
Move Core.Compiler into Base
Keno Oct 12, 2024
22c5bdc
Delete buggy `stat(::Integer)` method (#54855)
LilithHafner Nov 7, 2024
671cd5e
missing gc-root store in subtype (#56472)
vtjnash Nov 7, 2024
4278ded
further defer jl_insert_backedges after loading (#56447)
vtjnash Nov 7, 2024
9e14bf8
count bytes allocated through malloc more precisely (#55223)
d-netto Nov 7, 2024
5848445
Fix external IO loop thead interaction and add function to Base.Exper…
gbaraldi Nov 7, 2024
910bf7e
[REPL] raise default implicit `show` limit to 1MiB (#56297)
ericphanson Nov 7, 2024
6644796
Add a docstring for `Base.divgcd` (#53769)
putianyi889 Nov 7, 2024
8593792
Fix compilation warning on aarch64-linux (#56480)
giordano Nov 7, 2024
cd7250d
Make Compiler an independent package
Keno Oct 31, 2024
f336314
Make heap size hint available as an env variable (#55631)
MilesCranmer Nov 7, 2024
683da41
Make Compiler an independent package (that lives in the julia repo) (…
Keno Nov 8, 2024
0e811e4
Allow indexing `UniformScaling` with `CartesianIndex{2}` (#56461)
jishnub Nov 8, 2024
a005c07
Simplify first index in `FastContiguousSubArray` definition (#56491)
jishnub Nov 8, 2024
6541d1b
Make `popat!` support `@inbounds` (#56323)
putianyi889 Nov 8, 2024
bb234e2
NEWS.md: clarify `--trim` (#56460)
lassepe Nov 8, 2024
2f58a4b
Remove aggressive constprop annotation from 2x2 and 3x3 matmul (#56453)
jishnub Nov 8, 2024
bfcd3e9
`sincos` for non-float symmetric matrices (#56484)
jishnub Nov 8, 2024
9c4541b
Specialize 2-arg `show` for `LinearIndices` (#56482)
jishnub Nov 8, 2024
d0af9c5
Avoid constprop in `syevd!` and `syev!` (#56442)
jishnub Nov 8, 2024
62f8cff
make: define `basecompiler.ji` target (#56498)
aviatesk Nov 8, 2024
ca2d6aa
speed up bootstrapping by compiling few optimizer subroutines earlier…
aviatesk Nov 8, 2024
4cbeea5
remove top-level branches checking for Base (#56507)
JeffBezanson Nov 9, 2024
435516d
Undo the decision to publish incomplete types to the binding table (#…
Keno Nov 9, 2024
fb5e96a
Merge identical methods for Symmetric/Hermitian and SymTridiagonal (#…
jishnub Nov 9, 2024
473d0db
Specialize findlast for integer AbstractUnitRanges and StepRanges (#5…
jishnub Nov 9, 2024
024d42a
Loop over `Iterators.rest` in `_foldl_impl` (#56492)
jishnub Nov 9, 2024
ecfd1a0
better error message for rpad/lpad with zero-width padding (#56488)
stevengj Nov 9, 2024
803316a
Safer indexing in dense linalg methods (#56451)
jishnub Nov 9, 2024
cd748a5
The `info` in LAPACK calls should be a Ref instead of a Ptr (#56511)
ViralBShah Nov 9, 2024
0cc5518
Scaling loop instead of broadcasting in strided matrix exp (#56463)
jishnub Nov 10, 2024
4feca1f
codegen: Respect binding partition (#56494)
Keno Nov 10, 2024
88201cf
Profile: fix Compiler short path (#56515)
IanButterworth Nov 10, 2024
b6a2cc1
Check `isdiag` in dense trig functions (#56483)
jishnub Nov 10, 2024
afdba95
Profile: add helper method for printing profile report to file (#56505)
IanButterworth Nov 10, 2024
3318941
Change in-place exp to out-of-place in matrix trig functions (#56242)
jishnub Nov 11, 2024
14df038
Test: Don't change scope kind in `test_{warn,nowarn}` (#56524)
Keno Nov 11, 2024
97e41d7
For loop instead of while in generic `copyto!` (#56517)
jishnub Nov 11, 2024
38e3d14
Add `diagview` to obtain a view along a diagonal (#56175)
jishnub Nov 11, 2024
f93138e
Specialize `isbanded` for `StridedMatrix` (#56487)
jishnub Nov 11, 2024
ad24368
Tighten typechecking in `repeat` to match what's documented (#55444)
mcabbott Nov 11, 2024
1e0cee5
Replace `MulAddMul` by `alpha,beta` in `__muldiag` (#56360)
jishnub Nov 11, 2024
c4802e1
🤖 [master] Bump the SparseArrays stdlib from 0dd8d45 to 14333ea (#56531)
DilumAluthgeBot Nov 12, 2024
366a38e
simplifies the definitions of `@test_[no]warn` (#56525)
aviatesk Nov 12, 2024
001c666
infer_compilation_signatures for more cases (#56495)
vtjnash Nov 12, 2024
45c5c9b
Move `compiler` tests to `Compiler` package (#56522)
Keno Nov 12, 2024
505907b
Add lowering and interpreter support for `:latestworld` (#56523)
Keno Nov 12, 2024
fa9f0de
do union split and concrete compilation search
vtjnash Nov 7, 2024
8f24144
aotcompile: add missing codegen support for OC
vtjnash Nov 12, 2024
882f940
aotcompile: reimplement canPartition correctly
vtjnash Nov 12, 2024
1edc6f1
Merge Compiler.isready and Base.isready (#56536)
Keno Nov 13, 2024
c5ee5db
Update Documenter 1.4.0 => 1.8.0 (#56538)
mortenpi Nov 13, 2024
16ece81
[libblastrampoline_jll] Upgrade to v5.11.2 (#56534)
amontoison Nov 13, 2024
5cc5878
Improve docstrings for `filesize` and `stat` (#56244)
KronosTheLate Nov 13, 2024
a23e313
Fix and test special loading support for Compiler (#56535)
Keno Nov 13, 2024
9945df9
Some misc compiler-related code cleanup (#56540)
Keno Nov 13, 2024
48e7854
fix `IRShow.show` of the standard library `Compiler` (#56542)
aviatesk Nov 13, 2024
072d9d1
remove type piracy from `==` defined in `Compiler` (#56541)
aviatesk Nov 13, 2024
aa05c98
precompile: do better union split and concrete compilation search (#5…
vtjnash Nov 13, 2024
286ece2
inference: infer_compilation_signatures for even more cases (#56552)
vtjnash Nov 14, 2024
1e063d8
allow the Compiler.jl stdlib to be installed on older version of Juli…
aviatesk Nov 14, 2024
a32dba5
compiler: fix several more specialization mistake introduced by #4098…
vtjnash Nov 14, 2024
cf36497
inference: complete the inference even for recursive cycles (#56551)
vtjnash Nov 14, 2024
2e7e3ed
add LICENSE.md and `[compat]` entry for the Compiler.jl stdlib (#56559)
aviatesk Nov 14, 2024
d99d569
inference: Don't try to infer optimized opaque_closure (#56557)
Keno Nov 14, 2024
100e305
prevent deadlock when releasing the jl_unique_gcsafe_lock causes gc (…
vtjnash Nov 14, 2024
2d9a2ee
optimize `abstract_invoke` (#56560)
aviatesk Nov 15, 2024
e5f3010
Sockets: fix `getipaddr()` (#56528)
barucden Nov 15, 2024
55bdb54
Delete unnecessary methods in OffsetArrays.jl (#56564)
JamesWrigley Nov 15, 2024
5ec3215
OpenBLAS: Source build fixes for RISC-V (#56556)
maleadt Nov 15, 2024
caa2f7d
infer more completely everything that the optimizer/codegen requires …
vtjnash Nov 15, 2024
7fa26f0
Move Compiler <-> OpaqueClosure interface code to Compiler (#56576)
Keno Nov 16, 2024
e1cfa73
Fix debug build against non-debug LLVM (#56590)
Keno Nov 18, 2024
3770051
EA: remove `_TOP_MOD` and just use `Base` (#56581)
aviatesk Nov 18, 2024
0990665
Buildkite Test Engine: fix JSON comma separate bug (#56588)
pda Nov 18, 2024
83ef112
staticdata edges: fix missing visiting clearing during cycle handling…
vtjnash Nov 18, 2024
38908e9
[GCChecker] add a few more know functions to lock list (#56573)
vtjnash Nov 18, 2024
fa880a7
threading deadlock: change jl_fptr_wait_for_compiled to actually comp…
vtjnash Nov 18, 2024
b6eeef2
fix precompile(::MethodInstance) ccall signature (#56595)
vtjnash Nov 18, 2024
0de9164
Don't throw an error in raw! if the stream is closed (#56589)
Keno Nov 18, 2024
aff6512
codegen: Restore `ct->scope` in `jl_eh_restore_state` (#55907)
topolarity Nov 18, 2024
deac82a
lowering: don't reverse handler order in `(pop-handler-list ...)` (#5…
topolarity Nov 18, 2024
c5899c2
cli: Add required `--experimental` flag for experimental features (e.…
topolarity Nov 18, 2024
af9e6e3
optimize `abstract_call_gf_by_type` (#56572)
aviatesk Nov 18, 2024
0bd8292
Add missing `convert` methods for `Cholesky` (#56562)
timholy Nov 19, 2024
83ef55d
codegen: manually restore `ct->scope` when no exception handler is em…
topolarity Nov 19, 2024
b660649
🤖 [master] Bump the SparseArrays stdlib from 14333ea to 1b4933c (#56614)
DilumAluthgeBot Nov 20, 2024
4ed8814
gracefully fall back to non pid locked precompilation if FileWatching…
KristofferC Nov 20, 2024
bdd4e05
make `choosetests` find the test files for devved stdlibs (#56558)
KristofferC Nov 20, 2024
0592b54
use the correct path to include Compiler.jl in release builds (#56601)
KristofferC Nov 20, 2024
d9d1fc5
fix some new-edges issues (#56598)
vtjnash Nov 20, 2024
6c5f221
Prevent extensions from blocking parallel pre-compilation (#55910)
topolarity Nov 21, 2024
034e609
Make world-age increments explicit (#56509)
Keno Nov 21, 2024
4709b6c
`copytrito!` for triangular matrices (#56620)
jishnub Nov 21, 2024
33e69e5
use `Base.@show` for the Compiler.jl standard library (#56616)
aviatesk Nov 21, 2024
0ded536
🤖 [master] Bump the Pkg stdlib from 9f8e11a4c to 7b759d7f0 (#56631)
DilumAluthgeBot Nov 21, 2024
859c25a
inference: refine `setglobal!` rt for invalid assignments (#56622)
aviatesk Nov 21, 2024
c31710a
Make Expr(:invoke) target be a CodeInstance, not MethodInstance (#54899)
vtjnash Nov 21, 2024
873a1e4
inference: add missing modeling for `swapglobal!` (#56623)
aviatesk Nov 21, 2024
1fb8df6
Fix `unsafe_trunc` test for `NaN16` (#56630)
giordano Nov 21, 2024
712b2e5
precompilepkgs: fix is_direct_dep -> is_project_dep (#56643)
IanButterworth Nov 21, 2024
78fd186
Make Compiler tests runnable as package (#56632)
Keno Nov 21, 2024
858cb62
Profile: Fix short names (#56627)
IanButterworth Nov 22, 2024
e624440
inference: add missing tfuncs to the `xxxglobal` builtins (#56641)
aviatesk Nov 22, 2024
1bf2ef9
allow `apply_type_tfunc` to handle argtypes with `Union` (#56617)
aviatesk Nov 22, 2024
215189e
complete the tests for Compiler.jl as the stdlib. (#56648)
aviatesk Nov 22, 2024
522f496
only import REPL in runtests if we are actually going to use it (#56635)
KristofferC Nov 22, 2024
bdf78c9
fix jl_mutex_lock deadlock under rr (#56644)
vtjnash Nov 22, 2024
2a02fc3
More testsets, fix commented out test, add Array{UInt8} conversion te…
kshyatt Nov 22, 2024
e29d211
Test lastindex for LazyString (#56585)
kshyatt Nov 22, 2024
5fab51a
Tests for substrings of annotated strings (#56584)
kshyatt Nov 22, 2024
7354be3
codegen: make more judicious use of global rooting (#56625)
vtjnash Nov 22, 2024
0bedaae
precompilepkgs: make the circular dep warning clearer and more inform…
IanButterworth Nov 22, 2024
a1dbfd0
Test extensions of "parent" dependencies
topolarity Nov 24, 2024
06f8519
Prevent pre-compilation target package from triggering extensions
topolarity Nov 24, 2024
fa18951
make EAUtils.jl loadable even if `Main.EscapeAnalysis` isn't defined …
aviatesk Nov 24, 2024
377643f
Highlight circular references (#56663)
jakobjpeters Nov 24, 2024
f892a9e
Fix typo in nextfloat and prevfloat docs (#56670)
LilithHafner Nov 24, 2024
e5e7be2
move out LinearAlgebra into its own repository (#56637)
KristofferC Nov 24, 2024
94f542d
Prevent pre-compilation package from triggering its own extensions (#…
topolarity Nov 24, 2024
81568a6
Bump LLVMLibUnwind to v19.1.4 (#56674)
Zentrik Nov 25, 2024
7df1dfa
subtype: fast path for Type == TypeVar (#56640)
N5N3 Nov 26, 2024
ea82538
attach binomial(n::Integer, k::Integer) method to docstring (#56679)
stevengj Nov 26, 2024
a17db2b
Make DefaultStable and DefaultUnstable dispatchable and display witho…
LilithHafner Nov 26, 2024
f6ebc4b
optimizer: handle `EnterNode` with `catch_dest == 0` (#56686)
aviatesk Nov 27, 2024
4280731
Pass `JULIA_NUM_THREADS=1` to the sysimage builder (#56695)
gbaraldi Nov 27, 2024
68fa4a9
deps/cacert: Update to 2024-11-26 (#56697)
eschnett Nov 28, 2024
e50f1ce
Make Threads.Condition public (#56503)
jakobnissen Nov 28, 2024
79d8d3f
support passing a specific Method to invoke (#56692)
vtjnash Nov 28, 2024
7e2e0ae
Add mechanism to disable creating new worlds (#56639)
vtjnash Nov 28, 2024
680803c
get trimming test working again (#56689)
JeffBezanson Nov 28, 2024
60f0057
doc: fix docstring for `Dates.format` (#56682)
inkydragon Nov 28, 2024
f5dc26b
Make a failed extension load throw an error during pre-compilation (#…
topolarity Nov 28, 2024
9162b14
Remove arraylist_t from external native code APIs. (#56693)
maleadt Nov 28, 2024
447dc2d
fix world_age_at_entry in codegen (#56700)
vtjnash Nov 28, 2024
1ed2b98
Fix typo in `@cmd` docstring (#56664)
LilithHafner Nov 28, 2024
5053a17
deps/pcre: Update to version 10.44 (#56704)
eschnett Nov 28, 2024
c1f806d
compile: make more efficient by discarding internal names (#56702)
vtjnash Nov 29, 2024
d32843b
Automatically enable JITPROFILING with ITTAPI (#55598)
vchuravy Nov 30, 2024
ef32806
Fix string handling in jlchecksum (#56720)
Zentrik Dec 1, 2024
ea42112
Clarifying ispunct behavior difference between Julia and C in documen…
Priynsh Dec 1, 2024
8ce7d0f
[NEWS.md] Add PR numbers and remove some 1.11 changes that accidental…
christiangnrd Dec 2, 2024
f1b0b01
Fix scope of hoisted signature-local variables (#56712)
Keno Dec 2, 2024
efa917e
Extend `invoke` to accept CodeInstance (#56660)
Keno Dec 3, 2024
ba8290e
Update references to LTS from v1.6 to v1.10 (#56729)
PallHaraldsson Dec 3, 2024
2c87290
lowering: Canonicalize to builtins for global assignment (#56713)
Keno Dec 3, 2024
9acf112
Actually show glyphs for latex or emoji shortcodes being suggested in…
jkrumbiegel Dec 3, 2024
2590e67
Update annotated.jl docstrings according to #55741 (#56736)
danielwe Dec 3, 2024
4df5661
Merge branch 'origin-master' into dev
udesou Dec 4, 2024
a9d0fe3
Merge branch 'dev' into updating-dev-2590e675
udesou Dec 6, 2024
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
Prev Previous commit
Next Next commit
Extend invoke to accept CodeInstance (JuliaLang#56660)
This is an alternative mechanism to JuliaLang#56650 that largely achieves the
same result, but by hooking into `invoke` rather than a generated
function. They are orthogonal mechanisms, and its possible we want both.
However, in JuliaLang#56650, both Jameson and Valentin were skeptical of the
generated function signature bottleneck. This PR is sort of a hybrid of
mechanism in JuliaLang#52964 and what I proposed in
JuliaLang#56650 (comment).

In particular, this PR:

1. Extends `invoke` to support a CodeInstance in place of its usual
`types` argument.

2. Adds a new `typeinf` optimized generic. The semantics of this
optimized generic allow the compiler to instead call a companion
`typeinf_edge` function, allowing a mid-inference interpreter switch
(like JuliaLang#52964), without being forced through a concrete signature
bottleneck. However, if calling `typeinf_edge` does not work (e.g.
because the compiler version is mismatched), this still has well defined
semantics, you just don't get inference support.

The additional benefit of the `typeinf` optimized generic is that it
lets custom cache owners tell the runtime how to "cure" code instances
that have lost their native code. Currently the runtime only knows how
to do that for `owner == nothing` CodeInstances (by re-running
inference). This extension is not implemented, but the idea is that the
runtime would be permitted to call the `typeinf` optimized generic on
the dead CodeInstance's `owner` and `def` fields to obtain a cured
CodeInstance (or a user-actionable error from the plugin).

This PR includes an implementation of `with_new_compiler` from JuliaLang#56650.
This PR includes just enough compiler support to make the compiler
optimize this to the same code that JuliaLang#56650 produced:

```
julia> @code_typed with_new_compiler(sin, 1.0)
CodeInfo(
1 ─      $(Expr(:foreigncall, :(:jl_get_tls_world_age), UInt64, svec(), 0, :(:ccall)))::UInt64
│   %2 =   builtin Core.getfield(args, 1)::Float64
│   %3 =    invoke sin(%2::Float64)::Float64
└──      return %3
) => Float64
```

However, the implementation here is extremely incomplete. I'm putting it
up only as a directional sketch to see if people prefer it over JuliaLang#56650.
If so, I would prepare a cleaned up version of this PR that has the
optimized generics as well as the curing support, but not the full
inference integration (which needs a fair bit more work).
  • Loading branch information
Keno authored Dec 3, 2024
commit efa917e8775cd40fdd74b657d1e5d2db2342cd07
15 changes: 15 additions & 0 deletions Compiler/extras/CompilerDevTools/Manifest.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# This file is machine-generated - editing it directly is not advised

julia_version = "1.12.0-DEV"
manifest_format = "2.0"
project_hash = "84f495a1bf065c95f732a48af36dd0cd2cefb9d5"

[[deps.Compiler]]
path = "../.."
uuid = "807dbc54-b67e-4c79-8afb-eafe4df6f2e1"
version = "0.0.2"

[[deps.CompilerDevTools]]
path = "."
uuid = "92b2d91f-d2bd-4c05-9214-4609ac33433f"
version = "0.0.0"
5 changes: 5 additions & 0 deletions Compiler/extras/CompilerDevTools/Project.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name = "CompilerDevTools"
uuid = "92b2d91f-d2bd-4c05-9214-4609ac33433f"

[deps]
Compiler = "807dbc54-b67e-4c79-8afb-eafe4df6f2e1"
56 changes: 56 additions & 0 deletions Compiler/extras/CompilerDevTools/src/CompilerDevTools.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
module CompilerDevTools

using Compiler
using Core.IR

struct SplitCacheOwner; end
struct SplitCacheInterp <: Compiler.AbstractInterpreter
world::UInt
inf_params::Compiler.InferenceParams
opt_params::Compiler.OptimizationParams
inf_cache::Vector{Compiler.InferenceResult}
function SplitCacheInterp(;
world::UInt = Base.get_world_counter(),
inf_params::Compiler.InferenceParams = Compiler.InferenceParams(),
opt_params::Compiler.OptimizationParams = Compiler.OptimizationParams(),
inf_cache::Vector{Compiler.InferenceResult} = Compiler.InferenceResult[])
new(world, inf_params, opt_params, inf_cache)
end
end

Compiler.InferenceParams(interp::SplitCacheInterp) = interp.inf_params
Compiler.OptimizationParams(interp::SplitCacheInterp) = interp.opt_params
Compiler.get_inference_world(interp::SplitCacheInterp) = interp.world
Compiler.get_inference_cache(interp::SplitCacheInterp) = interp.inf_cache
Compiler.cache_owner(::SplitCacheInterp) = SplitCacheOwner()

import Core.OptimizedGenerics.CompilerPlugins: typeinf, typeinf_edge
@eval @noinline typeinf(::SplitCacheOwner, mi::MethodInstance, source_mode::UInt8) =
Base.invoke_in_world(which(typeinf, Tuple{SplitCacheOwner, MethodInstance, UInt8}).primary_world, Compiler.typeinf_ext, SplitCacheInterp(; world=Base.tls_world_age()), mi, source_mode)

@eval @noinline function typeinf_edge(::SplitCacheOwner, mi::MethodInstance, parent_frame::Compiler.InferenceState, world::UInt, source_mode::UInt8)
# TODO: This isn't quite right, we're just sketching things for now
interp = SplitCacheInterp(; world)
Compiler.typeinf_edge(interp, mi.def, mi.specTypes, Core.svec(), parent_frame, false, false)
end

# TODO: This needs special compiler support to properly case split for multiple
# method matches, etc.
@noinline function mi_for_tt(tt, world=Base.tls_world_age())
interp = SplitCacheInterp(; world)
match, _ = Compiler.findsup(tt, Compiler.method_table(interp))
Base.specialize_method(match)
end

function with_new_compiler(f, args...)
tt = Base.signature_type(f, typeof(args))
world = Base.tls_world_age()
new_compiler_ci = Core.OptimizedGenerics.CompilerPlugins.typeinf(
SplitCacheOwner(), mi_for_tt(tt), Compiler.SOURCE_MODE_ABI
)
invoke(f, new_compiler_ci, args...)
end

export with_new_compiler

end
48 changes: 39 additions & 9 deletions Compiler/src/abstractinterpretation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2218,16 +2218,46 @@ function abstract_invoke(interp::AbstractInterpreter, arginfo::ArgInfo, si::Stmt
ft = widenconst(ft′)
ft === Bottom && return Future(CallMeta(Bottom, Any, EFFECTS_THROWS, NoCallInfo()))
types = argtype_by_index(argtypes, 3)
if types isa Const && types.val isa Method
method = types.val::Method
types = method # argument value
lookupsig = method.sig # edge kind
argtype = argtypes_to_type(pushfirst!(argtype_tail(argtypes, 4), ft))
nargtype = typeintersect(lookupsig, argtype)
nargtype === Bottom && return Future(CallMeta(Bottom, TypeError, EFFECTS_THROWS, NoCallInfo()))
nargtype isa DataType || return Future(CallMeta(Any, Any, Effects(), NoCallInfo())) # other cases are not implemented below
if types isa Const && types.val isa Union{Method, CodeInstance}
method_or_ci = types.val
if isa(method_or_ci, CodeInstance)
our_world = sv.world.this
argtype = argtypes_to_type(pushfirst!(argtype_tail(argtypes, 4), ft))
sig = method_or_ci.def.specTypes
exct = method_or_ci.exctype
if !hasintersect(argtype, sig)
return Future(CallMeta(Bottom, TypeError, EFFECTS_THROWS, NoCallInfo()))
elseif !(argtype <: sig)
exct = Union{exct, TypeError}
end
callee_valid_range = WorldRange(method_or_ci.min_world, method_or_ci.max_world)
if !(our_world in callee_valid_range)
if our_world < first(callee_valid_range)
update_valid_age!(sv, WorldRange(first(sv.world.valid_worlds), first(callee_valid_range)-1))
else
update_valid_age!(sv, WorldRange(last(callee_valid_range)+1, last(sv.world.valid_worlds)))
end
return Future(CallMeta(Bottom, ErrorException, EFFECTS_THROWS, NoCallInfo()))
end
# TODO: When we add curing, we may want to assume this is nothrow
if (method_or_ci.owner === Nothing && method_ir_ci.def.def isa Method)
exct = Union{exct, ErrorException}
end
update_valid_age!(sv, callee_valid_range)
return Future(CallMeta(method_or_ci.rettype, exct, Effects(decode_effects(method_or_ci.ipo_purity_bits), nothrow=(exct===Bottom)),
InvokeCICallInfo(method_or_ci)))
else
method = method_or_ci::Method
types = method # argument value
lookupsig = method.sig # edge kind
argtype = argtypes_to_type(pushfirst!(argtype_tail(argtypes, 4), ft))
nargtype = typeintersect(lookupsig, argtype)
nargtype === Bottom && return Future(CallMeta(Bottom, TypeError, EFFECTS_THROWS, NoCallInfo()))
nargtype isa DataType || return Future(CallMeta(Any, Any, Effects(), NoCallInfo())) # other cases are not implemented below
# Fall through to generic invoke handling
end
else
widenconst(types) >: Method && return Future(CallMeta(Any, Any, Effects(), NoCallInfo()))
widenconst(types) >: Union{Method, CodeInstance} && return Future(CallMeta(Any, Any, Effects(), NoCallInfo()))
(types, isexact, isconcrete, istype) = instanceof_tfunc(argtype_by_index(argtypes, 3), false)
isexact || return Future(CallMeta(Any, Any, Effects(), NoCallInfo()))
unwrapped = unwrap_unionall(types)
Expand Down
2 changes: 1 addition & 1 deletion Compiler/src/abstractlattice.jl
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ end
if isa(t, Const)
# don't consider mutable values useful constants
val = t.val
return isa(val, Symbol) || isa(val, Type) || isa(val, Method) || !ismutable(val)
return isa(val, Symbol) || isa(val, Type) || isa(val, Method) || isa(val, CodeInstance) || !ismutable(val)
end
isa(t, PartialTypeVar) && return false # this isn't forwardable
return is_const_prop_profitable_arg(widenlattice(𝕃), t)
Expand Down
10 changes: 9 additions & 1 deletion Compiler/src/bootstrap.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,15 @@
# especially try to make sure any recursive and leaf functions have concrete signatures,
# since we won't be able to specialize & infer them at runtime

activate_codegen!() = ccall(:jl_set_typeinf_func, Cvoid, (Any,), typeinf_ext_toplevel)
function activate_codegen!()
ccall(:jl_set_typeinf_func, Cvoid, (Any,), typeinf_ext_toplevel)
Core.eval(Compiler, quote
let typeinf_world_age = Base.tls_world_age()
@eval Core.OptimizedGenerics.CompilerPlugins.typeinf(::Nothing, mi::MethodInstance, source_mode::UInt8) =
Base.invoke_in_world($(Expr(:$, :typeinf_world_age)), typeinf_ext_toplevel, mi, Base.tls_world_age(), source_mode)
end
end)
end

function bootstrap!()
let time() = ccall(:jl_clock_now, Float64, ())
Expand Down
11 changes: 11 additions & 0 deletions Compiler/src/stmtinfo.jl
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,17 @@ end
add_edges_impl(edges::Vector{Any}, info::UnionSplitApplyCallInfo) =
for split in info.infos; add_edges!(edges, split); end

"""
info::InvokeCICallInfo

Represents a resolved call to `Core.invoke` targeting a `Core.CodeInstance`
"""
struct InvokeCICallInfo <: CallInfo
edge::CodeInstance
end
add_edges_impl(edges::Vector{Any}, info::InvokeCICallInfo) =
add_one_edge!(edges, info.edge)

"""
info::InvokeCallInfo

Expand Down
4 changes: 2 additions & 2 deletions Compiler/src/utilities.jl
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ function count_const_size(@nospecialize(x), count_self::Bool = true)
# No definite size
(isa(x, GenericMemory) || isa(x, String) || isa(x, SimpleVector)) &&
return MAX_INLINE_CONST_SIZE + 1
if isa(x, Module) || isa(x, Method)
# We allow modules and methods, because we already assume they are externally
if isa(x, Module) || isa(x, Method) || isa(x, CodeInstance)
# We allow modules, methods and CodeInstance, because we already assume they are externally
# rooted, so we count their contents as 0 size.
return sizeof(Ptr{Cvoid})
end
Expand Down
2 changes: 2 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,8 @@ New library features
* New `ltruncate`, `rtruncate` and `ctruncate` functions for truncating strings to text width, accounting for char widths ([#55351])
* `isless` (and thus `cmp`, sorting, etc.) is now supported for zero-dimensional `AbstractArray`s ([#55772])
* `invoke` now supports passing a Method instead of a type signature making this interface somewhat more flexible for certain uncommon use cases ([#56692]).
* `invoke` now supports passing a CodeInstance instead of a type, which can enable
certain compiler plugin workflows ([#56660]).

Standard library changes
------------------------
Expand Down
17 changes: 17 additions & 0 deletions base/docs/basedocs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2031,6 +2031,7 @@ applicable
"""
invoke(f, argtypes::Type, args...; kwargs...)
invoke(f, argtypes::Method, args...; kwargs...)
invoke(f, argtypes::CodeInstance, args...; kwargs...)

Invoke a method for the given generic function `f` matching the specified types `argtypes` on the
specified arguments `args` and passing the keyword arguments `kwargs`. The arguments `args` must
Expand All @@ -2056,6 +2057,22 @@ Note in particular that the specified `Method` may be entirely unreachable from
If the method is part of the ordinary method table, this call behaves similar
to `invoke(f, method.sig, args...)`.

!!! compat "Julia 1.12"
Passing a `Method` requires Julia 1.12.

# Passing a `CodeInstance` instead of a signature
The `argtypes` argument may be a `CodeInstance`, bypassing both method lookup and specialization.
The semantics of this invocation are similar to a function pointer call of the `CodeInstance`'s
`invoke` pointer. It is an error to invoke a `CodeInstance` with arguments that do not match its
parent MethodInstance or from a world age not included in the `min_world`/`max_world` range.
It is undefined behavior to invoke a CodeInstance whose behavior does not match the constraints
specified in its fields. For some code instances with `owner !== nothing` (i.e. those generated
by external compilers), it may be an error to invoke them after passing through precompilation.
This is an advanced interface intended for use with external compiler plugins.

!!! compat "Julia 1.12"
Passing a `CodeInstance` requires Julia 1.12.

# Examples
```jldoctest
julia> f(x::Real) = x^2;
Expand Down
27 changes: 27 additions & 0 deletions base/optimized_generics.jl
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,31 @@ module KeyValue
function get end
end

# Compiler-recognized intrinsics for compiler plugins
"""
module CompilerPlugins

Implements a pair of functions `typeinf`/`typeinf_edge`. When the optimizer sees
a call to `typeinf`, it has license to instead call `typeinf_edge`, supplying the
current inference stack in `parent_frame` (but otherwise supplying the arguments
to `typeinf`). typeinf_edge will return the `CodeInstance` that `typeinf` would
have returned at runtime. The optimizer may perform a non-IPO replacement of
the call to `typeinf` by the result of `typeinf_edge`. In addition, the IPO-safe
fields of the `CodeInstance` may be propagated in IPO mode.
"""
module CompilerPlugins
"""
typeinf(owner, mi, source_mode)::CodeInstance

Return a `CodeInstance` for the given `mi` whose valid results include at
the least current tls world and satisfies the requirements of `source_mode`.
"""
function typeinf end

"""
typeinf_edge(owner, mi, parent_frame, world, abi_mode)::CodeInstance
"""
function typeinf_edge end
end

end
22 changes: 22 additions & 0 deletions src/builtins.c
Original file line number Diff line number Diff line change
Expand Up @@ -1587,6 +1587,28 @@ JL_CALLABLE(jl_f_invoke)
if (!jl_tuple1_isa(args[0], &args[2], nargs - 1, (jl_datatype_t*)m->sig))
jl_type_error("invoke: argument type error", argtypes, arg_tuple(args[0], &args[2], nargs - 1));
return jl_gf_invoke_by_method(m, args[0], &args[2], nargs - 1);
} else if (jl_is_code_instance(argtypes)) {
jl_code_instance_t *codeinst = (jl_code_instance_t*)args[1];
jl_callptr_t invoke = jl_atomic_load_acquire(&codeinst->invoke);
if (jl_tuple1_isa(args[0], &args[2], nargs - 2, (jl_datatype_t*)codeinst->def->specTypes)) {
jl_type_error("invoke: argument type error", codeinst->def->specTypes, arg_tuple(args[0], &args[2], nargs - 2));
}
if (jl_atomic_load_relaxed(&codeinst->min_world) > jl_current_task->world_age ||
jl_current_task->world_age > jl_atomic_load_relaxed(&codeinst->max_world)) {
jl_error("invoke: CodeInstance not valid for this world");
}
if (!invoke) {
jl_compile_codeinst(codeinst);
invoke = jl_atomic_load_acquire(&codeinst->invoke);
}
if (invoke) {
return invoke(args[0], &args[2], nargs - 2, codeinst);
} else {
if (codeinst->owner != jl_nothing || !jl_is_method(codeinst->def->def.value)) {
jl_error("Failed to invoke or compile external codeinst");
}
return jl_gf_invoke_by_method(codeinst->def->def.method, args[0], &args[2], nargs - 1);
}
}
if (!jl_is_tuple_type(jl_unwrap_unionall(argtypes)))
jl_type_error("invoke", (jl_value_t*)jl_anytuple_type_type, argtypes);
Expand Down
24 changes: 22 additions & 2 deletions src/interpreter.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,28 @@ static jl_value_t *do_invoke(jl_value_t **args, size_t nargs, interpreter_state
argv[i-1] = eval_value(args[i], s);
jl_value_t *c = args[0];
assert(jl_is_code_instance(c) || jl_is_method_instance(c));
jl_method_instance_t *meth = jl_is_method_instance(c) ? (jl_method_instance_t*)c : ((jl_code_instance_t*)c)->def;
jl_value_t *result = jl_invoke(argv[0], nargs == 2 ? NULL : &argv[1], nargs - 2, meth);
jl_value_t *result = NULL;
if (jl_is_code_instance(c)) {
jl_code_instance_t *codeinst = (jl_code_instance_t*)c;
assert(jl_atomic_load_relaxed(&codeinst->min_world) <= jl_current_task->world_age &&
jl_current_task->world_age <= jl_atomic_load_relaxed(&codeinst->max_world));
jl_callptr_t invoke = jl_atomic_load_acquire(&codeinst->invoke);
if (!invoke) {
jl_compile_codeinst(codeinst);
invoke = jl_atomic_load_acquire(&codeinst->invoke);
}
if (invoke) {
result = invoke(argv[0], nargs == 2 ? NULL : &argv[1], nargs - 2, codeinst);

} else {
if (codeinst->owner != jl_nothing) {
jl_error("Failed to invoke or compile external codeinst");
}
result = jl_invoke(argv[0], nargs == 2 ? NULL : &argv[1], nargs - 2, codeinst->def);
}
} else {
result = jl_invoke(argv[0], nargs == 2 ? NULL : &argv[1], nargs - 2, (jl_method_instance_t*)c);
}
JL_GC_POP();
return result;
}
Expand Down
14 changes: 14 additions & 0 deletions test/core.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8353,9 +8353,23 @@ end
@test eval(Expr(:toplevel, :(@define_call(f_macro_defined1)))) == 1
@test @define_call(f_macro_defined2) == 1

# `invoke` of `Method`
let m = which(+, (Int, Int))
@eval f56692(i) = invoke(+, $m, i, 4)
global g56692() = f56692(5) == 9 ? "true" : false
end
@test @inferred(f56692(3)) == 7
@test @inferred(g56692()) == "true"

# `invoke` of `CodeInstance`
f_invalidate_me() = return 1
f_invoke_me() = return f_invalidate_me()
@test f_invoke_me() == 1
const f_invoke_me_ci = Base.specialize_method(Base._which(Tuple{typeof(f_invoke_me)})).cache
f_call_me() = invoke(f_invoke_me, f_invoke_me_ci)
@test invoke(f_invoke_me, f_invoke_me_ci) == 1
@test f_call_me() == 1
@test_throws TypeError invoke(f_invoke_me, f_invoke_me_ci, 1)
f_invalidate_me() = 2
@test_throws ErrorException invoke(f_invoke_me, f_invoke_me_ci)
@test_throws ErrorException f_call_me()