Releases
1.21.0
Compare
Sorry, something went wrong.
No results found
Breaking changes
stdlib
Features
lang
stdlib
(cli) Align long-only options in OptionParser help (#16914 , thanks @kojix2 )
(collection) Make Channel(T) an Iterator(T) (#16916 , thanks @jgaskins )
(crypto) Add support for OpenSSL 4.0 (#16839 , thanks @straight-shoota )
(crypto) Support OpenSSL 4.x DLLs on Windows MSVC (#17116 , thanks @HertzDevil )
(networking) [experimental] Add Socket#sendfile (and Crystal::EventLoop::Socket#sendfile) (#16665 , #17133 , thanks @ysbaddaden , @straight-shoota )
(networking) Add HTTP::WebSocket#receive as a synchronous call (#16689 , thanks @jgaskins )
(runtime) Add Crystal::EventLoop::FileDescriptor#pread (#17068 , thanks @ysbaddaden )
(runtime) Add without_main flag (#17074 , thanks @kojix2 )
(runtime) OpenBSD: use kqueue event loop by default (#17123 , thanks @ysbaddaden )
(serialization) Support nested root properties in JSON::Field (#17016 , thanks @tcoatswo )
(serialization) Add URI::Params::Field(ignore:), ignore_serialize, ignore_deserialize (#17029 , thanks @trypsynth )
(specs) Allow chaining #should, #should_not expectations (#17020 , thanks @straight-shoota )
(system) Expose Path#kind (#16917 , thanks @Sija )
(system) Add splat overloads for Process.capture, .run and .new (#16975 , thanks @straight-shoota )
(system) Add Process::Status.[] constructor (#17003 , thanks @straight-shoota )
(text) Add String#present? (#16930 , thanks @Sija )
(text) Add UUID.v6 and .v8 generators (#17010 , thanks @trypsynth )
compiler
tools
(docs-generator) Improve wording in warning about doc generator without LibXML2 (#16926 , thanks @kojix2 )
Bugfixes
stdlib
(cli) Fix summary wrapping condition in OptionParser (#16915 , thanks @kojix2 )
(cli) Avoid Process.exec on Windows and explicitly spawn subprocess (#17049 , thanks @straight-shoota )
(collection) Fix Iterator#compact_map with EmptyIterator (#16928 , thanks @straight-shoota )
(collection) Fix Iterator#compact_map with non-nilable compactor proc (#16927 , thanks @straight-shoota )
(concurrency) Fix swapped atomic orderings in Sync::MU fast paths (#17063 , thanks @stevegeek )
(llvm) Fix use line 0 for unknown debug location (#17013 , thanks @straight-shoota )
(networking) Fix HTTP::Request.form_params? to recognize Content-Type and charset (#16934 , #16971 , thanks @swsch , @straight-shoota )
(networking) Fix HTTP::Client to retry for connection recovery only (#16981 , thanks @straight-shoota )
(networking) Disable transport read-ahead for Kernel TLS sockets (#17053 , thanks @jage )
(runtime) Fiber::ExecutionContext::Monitor compat with old Crystal releases (#17007 , thanks @ysbaddaden )
(runtime) EventLoop::IoUring#open musn't set O_NONBLOCK when blocking (#17035 , thanks @ysbaddaden )
(runtime) underperforming unlock conditions in Sync::MU (#17070 , thanks @ysbaddaden )
(runtime) fdlock#try_close? must release ref after yielding to the block (#17089 , thanks @ysbaddaden )
(runtime) Fiber::ExecutionContext.current? (#17092 , thanks @ysbaddaden )
(runtime) Refactor Win32 iocp evloop (#17101 , thanks @ysbaddaden )
(serialization) memory leak in XML::Node#each_namespace (#17038 , thanks @ysbaddaden )
(system) skip Windows registry MIME entries with an invalid Content Type (#17106 , thanks @SAY-5 )
(text) Fix IO::Encoder#write when operating on long strings (#16797 , thanks @jgaskins )
compiler
(cli) Remedy short-flag conflict for crystal spec -p (#17062 , thanks @straight-shoota )
(codegen) Fix codegen treating distinct lib type aliases as the same type (#16961 , thanks @stakach )
(interpreter) Add interpreter upcast_distinct for Pointer to Pointer (#16962 , thanks @stakach )
(interpreter:repl) Fix auto-indentation in the REPL when typing classes. (#16910 , thanks @I3oris )
(interpreter:repl) Fix interpreter multidispatch cache collision (#16958 , thanks @stakach )
(parser) Fix lexing MacroVar syntax in literal (#16779 , thanks @straight-shoota )
(parser) Fix parsing macro var without exps followed by macro expression (#16879 , thanks @straight-shoota )
(parser) Fix parse parenthesized expression in block arg assignment (#16894 , thanks @straight-shoota )
(parser) Do not merge nested Expression and ExceptionHandler (#16852 , thanks @straight-shoota )
(parser) Fix parser silently ignoring &(...), &[...], &{...} in assignment (#16960 , thanks @stakach )
(parser) Fix parser allow / and // immediately after self, nil, true, false (#16942 , thanks @stakach )
(parser) Fix short block setter call end location (#17039 , thanks @Sija )
(semantic) Fix freeze type of variable declared with out (#16870 , thanks @straight-shoota )
(semantic) Fix lookup_matches_in_type to reject partial matches (#16867 , thanks @straight-shoota )
(semantic) Fix location of double splat named tuple typenode entry locations (#16889 , thanks @Blacksmoke16 )
(semantic) Fix sizeof, offsetof as generic type argument in inferred ivar type (#16811 , thanks @kojix2 )
(semantic) Fix macro argument errors for path receiver calls (#16923 , thanks @kojix2 )
(semantic) Detect uninitialized ancestor ivars through macro_def initializers (#16959 , thanks @stakach )
(semantic) Preserve nil_if_read? across while cond filters (#16963 , thanks @stakach )
(semantic) Keep wider subclass observer when call owner narrows (#16947 ) (#16990 , thanks @stakach )
(semantic) Symmetric common_descendent for two generic class types (#10831 ) (#16999 , thanks @stakach )
tools
Chores
stdlib
Performance
stdlib
Refactor
stdlib
(cli) Split error helper for compiler CLI into independent methods (#16984 , thanks @straight-shoota )
(cli) Refactor compiler code to raise CompilerError instead of abort (#16995 , thanks @straight-shoota )
(concurrency) simplify read console (windows) (#17098 , thanks @ysbaddaden )
(concurrency) Process#wait on Windows (#17099 , thanks @ysbaddaden )
(networking) Refactor bubbling exceptions from user code in HTTP::Client#exec(&) (#16969 , thanks @straight-shoota )
(runtime) Internalize IO::Evented into Crystal::EventLoop::Wasi (#17030 , thanks @ysbaddaden )
(runtime) Fix: thread safety of the libevent event loop (#17031 , thanks @ysbaddaden )
(runtime) Drop unused IO::Evented and Crystal::ThreadLocalValue (#17032 , thanks @ysbaddaden )
(runtime) Consolidate #overlapped_connect and #overlapped_accept into EventLoop::IOCP (#17090 , thanks @ysbaddaden )
(runtime) OpenBSD now supports EVFILT_USER (#17121 , thanks @ysbaddaden )
(system) Refactor Dir::Globber to a struct with instance methods (#16899 , thanks @straight-shoota )
(system) Refactor internal Process constructor to receive Crystal::System::Process (#16933 , thanks @straight-shoota )
(system) dont parse but mmap ELF, Mach-O, PE files and some DWARF sections (#16939 , #17134 , thanks @ysbaddaden )
compiler
tools
other
Documentation
stdlib
other
Specs
stdlib
compiler
other
Infrastructure
Changelog for 1.21.0 (#17095 , thanks @straight-shoota )
Update previous Crystal release 1.20.0 (#16844 , thanks @ysbaddaden )
Update previous Crystal release 1.20.1 (#16901 , thanks @straight-shoota )
Merge release/1.19@1.19.2 into master (#16905 , thanks @straight-shoota )
Merge release/1.20@1.20.1 into master (#16900 , thanks @straight-shoota )
Update devenv.lock (#16819 , #16935 , #17006 , #17075 , #17084 , thanks @github-actions, @crysbot )
Update changelog script (#16946 , thanks @straight-shoota )
Extract CRYSTAL_BOOTSTRAP_VERSION in bin/ci (#16966 , thanks @straight-shoota )
Update previous Crystal release 1.20.2 (#16954 , thanks @straight-shoota )
Makefile: Split install target into subcomponents (#16980 , thanks @straight-shoota )
Update release-update script (#16977 , thanks @straight-shoota )
Makefile: Build manpages for install target (#16991 , thanks @straight-shoota )
Apply shfmt (#17015 , thanks @straight-shoota )
Apply mbake formatter for Makefile (#17024 , thanks @straight-shoota )
infra: devenv input for git-hooks follows nixpkgs (#17064 , thanks @straight-shoota )
Replace markdownlint with rumdl (#17069 , thanks @straight-shoota )
Replace .markdownlint.yaml with rumdl.toml (#17078 , thanks @straight-shoota )
(ci) Fix -Devloop=io_uring flag in Linux CI (#16843 , thanks @straight-shoota )
(ci) Use PAT from GHA environments for backport job (#16864 , thanks @straight-shoota )
(ci) Use AWS credentials from GHA environments for deploy_api_docs job (#16863 , thanks @straight-shoota )
(ci) Update GH Actions (#16836 , #16944 , #17011 , #17042 , [#17117 ], thanks @renovate )
(ci) Use Crysbot token in update-devenv workflow to trigger CI (#16938 , thanks @straight-shoota )
(ci) Fix tags for nightly docker images (#16973 , thanks @straight-shoota )
(ci) Drop separate aarch64 workflow (#16965 , thanks @straight-shoota )
(ci) Update crate-ci/typos action to v1.46.2 (#16986 , thanks @renovate )
(ci) Update macos-15 runners to macos-26 (#17022 , thanks @straight-shoota )
(ci) Upgrade library dependencies for Windows CI (#17025 , thanks @straight-shoota )
(ci) Upgrade windows runners to VS 2026 (#17043 , thanks @straight-shoota )
(ci) Upgrade nixpkgs 26.05 in Lint workflow (#17066 , thanks @straight-shoota )
(ci) Update previous Crystal release 1.20.3 (#17114 , thanks @ysbaddaden )
You canβt perform that action at this time.