Crystal

Languages & Runtimes

A programming language with Ruby-like syntax and compile-time type checking.

Latest 1.21.0 · by Crystal LanguageWebsitecrystal-lang/crystal

Release activity

Release activity — 10 releases across 10 days since Oct 17, 2025. Each cell is one day; darker means more releases that day. Nothing is recorded before Oct 17, 2025. Older weeks are hidden at this screen width.
MayJunJulAug
SundayNo releases on May 3, 2026No releases on May 10, 2026No releases on May 17, 2026No releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026No releases on Aug 16, 2026
MondayNo releases on May 4, 2026No releases on May 11, 2026No releases on May 18, 2026No releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 2026No releases on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 2026No releases on Jul 6, 2026No releases on Jul 13, 2026No releases on Jul 20, 2026No releases on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026
TuesdayNo releases on May 5, 2026No releases on May 12, 2026No releases on May 19, 2026No releases on May 26, 2026No releases on Jun 2, 2026No releases on Jun 9, 2026No releases on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 2026No releases on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 2026No releases on Aug 4, 2026No releases on Aug 11, 2026
WednesdayNo releases on May 6, 2026No releases on May 13, 2026No releases on May 20, 2026No releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 2026No releases on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 2026No releases on Jul 29, 2026No releases on Aug 5, 2026No releases on Aug 12, 2026
ThursdayNo releases on May 7, 2026No releases on May 14, 2026No releases on May 21, 2026No releases on May 28, 2026No releases on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 20261 release on Jul 2, 2026No releases on Jul 9, 20261 release on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 2026No releases on Aug 6, 2026No releases on Aug 13, 2026
FridayNo releases on May 8, 20261 release on May 15, 2026No releases on May 22, 2026No releases on May 29, 2026No releases on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 2026No releases on Jul 10, 2026No releases on Jul 17, 2026No releases on Jul 24, 2026No releases on Jul 31, 2026No releases on Aug 7, 2026No releases on Aug 14, 2026
SaturdayNo releases on May 9, 2026No releases on May 16, 2026No releases on May 23, 2026No releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 2026No releases on Aug 1, 2026No releases on Aug 8, 2026No releases on Aug 15, 2026

10 releases since Oct 17, 2025

Changelog

1.21.0

Latest
Added 18
  • Add %W percent string array literals with interpolation
  • Add TypeNode#all_methods that includes the type's ancestor's methods
  • Align long-only options in OptionParser help
  • Make Channel(T) an Iterator(T)
  • Add support for OpenSSL 4.0
  • Support OpenSSL 4.x DLLs on Windows MSVC
Changed 2
  • Release Execution Contexts
  • OpenBSD: use kqueue event loop by default
Removed 1
  • Disable automatic fallback to legacy PCRE
Breaking changes
stdlib
  • (runtime) Release: Execution Contexts (#17100, #17104, thanks @ysbaddaden)
  • (text) Disable automatic fallback to legacy PCRE (#16924, thanks @straight-shoota)
Features
lang
  • Add %W percent string array literals with interpolation (#16919, thanks @straight-shoota)
  • (macros) Add TypeNode#all_methods that includes the type's ancestor's methods (#16902, thanks @Blacksmoke16)
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
  • (cli) Classify compiler exit reasons (#17028, thanks @straight-shoota)
  • (debugger) Improve proc debug metadata (#16830, thanks @skuznetsov)
  • (debugger) Emit debug metadata for constants and class vars (#16831, thanks @skuznetsov)
  • (debugger) Improve LLDB collection formatters (#16832, thanks @skuznetsov)
  • (parser) Add ASTNode#inspect (#16699, thanks @straight-shoota)
  • (parser) Parse MacroVar with empty expressions: %var{} (#16772, thanks @straight-shoota)
  • (semantic) Split branches on when Bar, Baz (#17072, thanks @straight-shoota)
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
  • (formatter) Fix format empty then with trailing comment (#16878, thanks @straight-shoota)
  • (formatter) Fix formatting whitespace in ternary if with trailing comments (#16880, thanks @straight-shoota)
  • (formatter) Fix formatter on empty string literal continuation (#16817, thanks @straight-shoota)
  • (formatter) Fix format annotations of splat parameter (#16987, thanks @straight-shoota)
  • (formatter) Fix formatter strip empty lines in heredoc (#17034, thanks @straight-shoota)
Chores
stdlib
  • (cli) [deprecation] Deprecate Colorize.on_tty_only! (#16859, thanks @straight-shoota)
  • (concurrency) [deprecation] Deprecate spawn(same_thread:) (#17097, thanks @ysbaddaden)
  • (files) [deprecation] Rename parameter to writable in IO::Memory.new (#16858, #16883, thanks @straight-shoota)
  • (system) [deprecation] Hide platform-specific Process::Status constructor (#16997, thanks @straight-shoota)
Performance
stdlib
  • (collection) Preallocate correct size for hash in Hash.zip (#17054, thanks @carlhoerberg)
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
  • Replace backticks with Process.capture (#17012, #17122, thanks @straight-shoota, @ysbaddaden)
  • (codegen) Set optsize and minsize fun attributes for the -Os and -Oz optimization modes (#16983, thanks @ysbaddaden)
  • (parser) Parse parens in type grammar into Union#parens (#16744, #16908, thanks @straight-shoota)
  • (parser) Refactor whitespace branch in Lexer#next_macro_token [follow-up #16771] (#16776, thanks @straight-shoota)
  • (parser) Refactor formatter, remove internal delimited_pair(advance) (#17023, thanks @straight-shoota)
tools
  • (formatter) [breaking] Standardize parsing of symbol and string array literals (#16748, thanks @straight-shoota)
  • (formatter) Drop format_binary parameter alternative (#16912, thanks @straight-shoota)
other
  • Fix violations reported by ameba 1.7 (#17021, thanks @straight-shoota)
Documentation
stdlib
  • (cli) Add missing_option to OptionParser example (#17112, thanks @LaskaIDK)
  • (macros) Improve docs for ::delegate (#16854, thanks @straight-shoota)
  • (text) Document null-termination on String#to_unsafe (#16869, thanks @mvanhorn)
  • (text) Document String is not inheritable (#17000, thanks @LaskaIDK)
other
  • Fix typo writable in documentation (#16848, thanks @straight-shoota)
  • Format asciidoc (#16992, thanks @straight-shoota)
  • rumdl: Fix MD077: Continuation line over-indented (#17085, thanks @straight-shoota)
Specs
stdlib
  • (cli) Refactor run_git spec helper to use Process.capture_result? (#17079, thanks @straight-shoota)
  • (collection) Add specs for Iterator.empty (#17014, thanks @straight-shoota)
  • (concurrency) Fix: Crystal 1.0.0 is confused by file private types (#17067, thanks @ysbaddaden)
  • (networking) Extract spec helpers close_connection and client_for for HTTP client specs (#16968, thanks @straight-shoota)
  • (text) Add specs for range accessor with open ended exclusive range (#16849, thanks @straight-shoota)
compiler
  • (cli) Add compiler-cli test suite (#17033, thanks @straight-shoota)
  • (debugger) Fix lldb-check expectations in debug tests for compatibility with modern LLDB (#16860, thanks @straight-shoota)
other
  • Remove unnecessary not_nil! in spec suite (#16865, thanks @straight-shoota)
  • Replace not_nil! with should_not(be_nil) in spec suite (#16906, thanks @straight-shoota)
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)
View originalPermalink
How 1.21.0 went

1.20.3

Changed 1
  • memoize anchor name in YAML::PullParser
Security 2
  • add max_nesting to YAML::PullParser
  • add alias vs anchor ratio check to YAML::PullParser
Bugfixes
stdlib
  • (serialization) [security] add max_nesting to YAML::PullParser (#17107, thanks @ysbaddaden)
  • (serialization) [security] add alias vs anchor ratio check to YAML::PullParser (#17109, thanks @ysbaddaden)
Refactor
stdlib
  • (serialization) YAML::PullParser: memoize anchor name (#17108, thanks @ysbaddaden)
Infrastructure
  • Add changelog for 1.20.3 (#17110, thanks @ysbaddaden)
View originalPermalink
How 1.20.3 went

1.20.2

Fixed 2
  • Simplify Sync::Mutex#synchronize proc type constraints
  • Range#sample eventually loses randomness
Bugfixes
stdlib
  • (concurrency) [regression] Simplify Sync::Mutex#synchronize proc type constraints (#16904, #16937, thanks @ysbaddaden)
  • (runtime) Range#sample eventually loses randomness (#16909, thanks @ysbaddaden)
Infrastructure
  • Changelog for 1.20.2 (#16945, thanks @straight-shoota)
View originalPermalink
How 1.20.2 went

1.20.1

Added 1
  • Add HTTP::Headers#to_json and #to_yaml
Changed 1
  • OpenSSL Kernel TLS support should be opt-in
Fixed 5
  • Fix issues in OpenSSL Kernel TLS
  • Range#sample eventually loses randomness
  • Don't parse debug sections from bare threads
  • Fix lexing macro delimiter state inside literals
  • Revert "Refactor Formatter code for simplification"
Bugfixes
stdlib
  • (crypto) Fix issues in OpenSSL Kernel TLS (#16888, thanks @ysbaddaden)
  • (crypto) OpenSSL Kernel TLS support should be opt-in (#16897, thanks @ysbaddaden)
  • (networking) [regression] Add HTTP::Headers#to_json and #to_yaml (#16890, thanks @straight-shoota)
  • (runtime) [regression] Range#sample eventually loses randomness (#16853, thanks @ysbaddaden)
  • (runtime) don't parse debug sections from bare threads (#16877, thanks @ysbaddaden)
compiler
  • (parser) [regression] Fix lexing macro delimiter state inside literals (#16892, thanks @straight-shoota)
tools
  • (formatter) [regression] Revert "Refactor Formatter code for simplification" (#16885, thanks @straight-shoota)
Refactor
stdlib
  • (runtime) Refactor Exception::CallStack for better boundaries (#16896, thanks @straight-shoota)
Infrastructure
  • Changelog for 1.20.1 (#16898, thanks @straight-shoota)
View originalPermalink
How 1.20.1 went

1.19.2

Fixed 1
  • Range#sample eventually loses randomness
Security 1
  • HTTP::Server is no longer vulnerable to request smuggling
Security
stdlib
  • (networking) HTTP::Server is no longer vulnerable to request smuggling (#16862, thanks @ysbaddaden)
Bugfixes
stdlib
  • [regression] Range#sample eventually loses randomness (#16866, thanks @straight-shoota, @ysbaddaden)
Infrastructure
  • Changelog for 1.19.2 (#16893, thanks @ysbaddaden)
  • (ci) Drop update: true from msys2/setup-msys (#16868, thanks @straight-shoota)
View originalPermalink
How 1.19.2 went

1.20.0

Added 25
  • Add #select and #reject to HashLiteral and NamedTupleLiteral in macros
  • Add short option bundling for OptionParser
  • Add Kernel TLS support to custom OpenSSL::BIO
  • Add IO#read_greedy
  • Add FileUtils#rm_f
  • Add IO::PrefixSuffixBuffer for capturing truncated streams
Changed 7
  • Refine error message for unsupported named arguments in macros
  • Support LLVM 22.1 and 23.0
  • Detach execution context scheduler from running thread during blocking syscall
  • Use FdLock on all targets
  • Improve cursor window format in StringScanner#inspect
  • Prefer modern linker (mold or lld)
  • OpenSSL sockets shouldn't flush on read
Fixed 3
  • Fix decode gzip MTIME as UInt32
  • Fix typo in digest.cr
  • Fix MIME.parse_media_type invalid character check
Security 1
  • Fix HTTP::Server is no longer vulnerable to request smuggling
Security
stdlib
  • (networking) Fix HTTP::Server is no longer vulnerable to request smuggling (GHSA-wqh5-7w63-pm68)
Features
lang
  • (macros) Add #select and #reject to HashLiteral and NamedTupleLiteral (#16558, thanks @Blacksmoke16)
  • (macros) Refine error message for unsupported named arguments in macros (#16576, thanks @hahwul)
stdlib
  • (cli) Add short option bundling for OptionParser (#16770, thanks @Qard)
  • (crypto) Add Kernel TLS support to custom OpenSSL::BIO (#16646, thanks @ysbaddaden)
  • (files) Add IO#read_greedy (#16535, thanks @BlobCodes)
  • (files) Add FileUtils#rm_f (#12832, thanks @zw963)
  • (files) Add IO::PrefixSuffixBuffer for capturing truncated streams (#16774, thanks @straight-shoota)
  • (llvm) Support LLVM 22.1 and 23.0 (#16631, thanks @HertzDevil)
  • (networking) Add Sec-WebSocket-Protocol checks to HTTP::WebSocket::Protocol (#16600, #16671, thanks @antondalgren, @straight-shoota)
  • (networking) Add support for Sec-WebSocket-Protocol to HTTP::WebSocketHandler (#16574, thanks @antondalgren)
  • (networking) Add HTTP::Response#content_type and #content_length as convenient accessors (#16712, thanks @CTC97)
  • (networking) Detect OAuth error in payload (#16634, #16828, thanks @jgaskins, @Sija)
  • (runtime) Add Fiber::ExecutionContext::ThreadPool (#15885, #16750, thanks @ysbaddaden)
  • (runtime) Add Pointer#align_up and #align_down (#16585, thanks @BlobCodes)
  • (runtime) Detach execution context scheduler from running thread during blocking syscall (#15871, #16679, thanks @ysbaddaden)
  • (runtime) Forward API docs for properties in record macro (#16172, #16834, thanks @Vici37, @ysbaddaden)
  • (runtime) Add Crystal::Lock (#16768, thanks @ysbaddaden)
  • (runtime) Add io_uring event loop (linux) (#16264, thanks @ysbaddaden)
  • (system) Use FdLock on all targets (#16569, thanks @ysbaddaden)
  • (system) Add Process.new with args instead of command, args (#16681, thanks @straight-shoota)
  • (system) Add Process.run(args) without command (#16739, thanks @straight-shoota)
  • (system) Add Process.run? (#16738, thanks @straight-shoota)
  • (system) Add Process.capture (#16773, thanks @straight-shoota)
  • (text) Add StringScanner#scan, #check, and #skip overloads for Int (#16557, thanks @jneen)
  • (text) Add StringScanner#peek_behind (#16593, thanks @jneen)
  • (text) Add convenience methods to StringScanner (#16595, thanks @jneen)
  • (text) Improve cursor window format in StringScanner#inspect (#16594, thanks @jneen)
compiler
  • (cli) Prefer modern linker (mold or lld) (#16696, thanks @straight-shoota)
  • (codegen) Add @[TargetFeature] annotation (#16717, #16835, thanks @stakach, @ysbaddaden)
  • (parser) Parse ProcNotation with empty arg parenthesis: () -> (#16741, thanks @straight-shoota)
tools
  • (docs-generator) Add --base-path for crystal docs (#16091, thanks @matiasgarciaisaia)
Bugfixes
stdlib
  • (compress) Fix decode gzip MTIME as UInt32 (#16730, thanks @kojix2)
  • (crypto) [breaking] OpenSSL sockets shouldn't flush on read (#16650, thanks @ysbaddaden)
  • (crypto) Fix typo in digest.cr (#16808, thanks @kojix2)
  • (files) Fix MIME.parse_media_type invalid character check (#16793, thanks @cuiweixie)
  • (networking) [regression] Fix HTTP::Headers#merge! to not wrap key (#16624, thanks @straight-shoota)
  • (networking) Fix forward_missing_to in HTTP::Headers (#16637, thanks @straight-shoota)
  • (networking) Fix Socket::IPAddress IPv4 address in IPv6 with zone identifier (#16813, thanks @straight-shoota)
  • (numeric) Fix Indexable#range_to_index_and_count with unsigned integers (#16597, thanks @jneen)
  • (numeric) [regression] Fix Float32#abs to return Float32 (#16655, thanks @straight-shoota)
  • (numeric) Fix signedness in GMP FFI bindings (#16799, thanks @kojix2)
  • (runtime) Rename filename to path in WASI EventLoop#open (#16636, thanks @kojix2)
  • (runtime) Thread.sleep is invalid when duration >= 1 minute (#16629, thanks @ysbaddaden)
  • (runtime) Fix typos in ELF reader (#16668, thanks @kojix2)
  • (runtime) don't terminate thread on Windows/IOCP (#16680, thanks @ysbaddaden)
  • (runtime) Sync::ConditionVariable can hang forever (#16677, thanks @ysbaddaden)
  • (runtime) Fix Pointer#to_s with lib typedefs (#16687, thanks @straight-shoota)
  • (runtime) Fix race condition in Process#wait on Windows (#16766, thanks @ysbaddaden)
  • (serialization) call xmlFree for string pointer from xmlNodeGetContent (#16688, thanks @toddsundsted)
  • (serialization) Fix sequence_end_event_initialize return type (#16803, thanks @kojix2)
  • (system) Fix Dir.glob matching wildcard with dot directory (#16604, thanks @straight-shoota)
  • (system) Lenient Fiber.current access on segfault handler (#16612, thanks @bcardiff)
  • (system) [breaking] Fix Process#wait to not close @input before waiting (#16620, #16638, thanks @straight-shoota, @ysbaddaden)
  • (system) Fix System.cpu_count returns Int32 (#16648, thanks @straight-shoota)
  • (system) Fix Process.new(args) etc. support Enumerable(String) args (#16784, thanks @straight-shoota)
  • (text) Fix String#scan zero-width matches with multibyte characters (#16684, thanks @error256)
  • (text) Fix PCRE2 FFI type declarations (#16804, thanks @kojix2)
  • (text) Fix blink_fast reset code (#16806, thanks @kojix2)
compiler
  • (codegen) Emit unreachable for inlined NoReturn returns (#16690, thanks @kojix2)
  • (codegen) Fix alignment for fields in packed structs for x86_64 ABI (#16667, thanks @kojix2)
  • (codegen) Fix declare_fun attribute copy (#16708, thanks @kojix2)
  • (parser) [breaking] Ensure that heredoc lexing allows only valid identifiers (#16548, thanks @Sija)
  • (parser) [regression] Fix lexing percent literals with | delimiter in macro context (#16672, #16716, thanks @toddsundsted, @straight-shoota)
  • (parser) Escape quotes in the filename within the location pragmas (#16549, thanks @Sija)
  • (semantic) Fix constant lookup in ivar initializer blocks (#16678, thanks @nobodywasishere)
  • (semantic) Fix ICE on alias generic instance namespace lookup (#16700, thanks @nobodywasishere)
  • (semantic) Fix tuple splat validation (#16787, thanks @kojix2)
  • (semantic) Add arithmetic error reporting for MathInterpreter (#16809, thanks @kojix2)
tools
  • (formatter) Fix formatter ProcNotation with parens around argument type (#16753, thanks @straight-shoota)
  • (formatter) Fix track line increment when formatting macro literal only (#16761, thanks @straight-shoota)
  • (formatter) Fix formatter indent and newlines between expression items (#16769, thanks @straight-shoota)
  • (formatter) Fix formatter increment @line only on write (#16762, thanks @straight-shoota)
Chores
stdlib
  • (system) Add @[Experimental] annotation to new Process API (#16816, thanks @straight-shoota)
Performance
stdlib
  • (time) Improve performance of System::Time.monotonic on Windows (#16555, thanks @straight-shoota)
Refactor
stdlib
  • (crypto) dust off OpenSSL::BIO (#16640, thanks @ysbaddaden)
  • (crypto) Refactor initialization of custom OpenSSL BIO (#16651, thanks @ysbaddaden)
  • (numeric) [experimental] Use Slice.literal for fast_float when supported, part 2 (#16261, thanks @HertzDevil)
  • (runtime) [deprecation] Soft deprecate Mutex in favor to Sync::Mutex (#16737, #16759, #16802, thanks @ysbaddaden)
  • (runtime) Protect Crystal::System::Env with Sync::RWLock (UNIX) (#16591, thanks @ysbaddaden)
  • (runtime) Refactor System::Process.make_env_block into System::Env (win32) (#16605, thanks @ysbaddaden)
  • (runtime) Use System.wstr_literal for env names on Win32 (#16669, thanks @kojix2)
  • (runtime) Add adaptive scaling to ExecutionContext::Parallel (#16719, thanks @ysbaddaden)
  • (runtime) Handle events in EventLoop::IOCP instead of System::IOCP (#16765, thanks @ysbaddaden)
  • (runtime) Add internal state to Fiber::ExecutionContext::Parallel::Scheduler (#16732, thanks @ysbaddaden)
  • (runtime) Replace Mutex use cases with Sync::Mutex (#16783, thanks @ysbaddaden)
  • (specs) Prefer with_env helper over mutating ENV in specs (#16608, thanks @ysbaddaden)
  • (specs) Remove unnecessary shell: true from Process.run calls (#16781, thanks @ysbaddaden)
  • (system) Avoid deprecated Pointer.new(Int) in dlfcn (#16691, thanks @kojix2)
  • (system) Refactor code duplication in Process.new overloads (#16782, thanks @straight-shoota)
compiler
  • (parser) Refactor parsing interpolation (#16693, thanks @straight-shoota)
  • (parser) Standardize DelimiterState#open_count to initialize with 0 (#16771, thanks @straight-shoota)
tools
  • (formatter) Extract helper methods for formatter string interpolation (#16720, #16747, thanks @straight-shoota)
  • (formatter) Refactor Formatter code for simplification (#16745, thanks @straight-shoota)
Documentation
stdlib
  • (llvm) Fix typo (#16694, thanks @straight-shoota)
  • (runtime) Add Safety section to ENV documentation (#16592, #16599, thanks @ysbaddaden)
  • (runtime) Fix: thread_local macro exposes Thread class in stdlib docs (#16714, thanks @ysbaddaden)
  • (runtime) Improve docs for Fiber::ExecutionContext (#16602, thanks @ysbaddaden)
  • (runtime) Remove invalid Pointer.new constructor from API docs (#16734, thanks @ysbaddaden)
  • (runtime) Document that reentrant read lock can deadlock (#16833, thanks @ysbaddaden)
  • (system) Improve documentation for Process.run & co (#16618, thanks @straight-shoota)
Specs
stdlib
  • (concurrency) Fix: modernize channel specs to avoid parallelism issues (#16704, thanks @ysbaddaden)
  • (runtime) Fix: increase timeout of execution context stress test helper (#16639, thanks @ysbaddaden)
  • (runtime) Fix: Fiber#resumable? spec must run in concurrent context (#16731, thanks @ysbaddaden)
  • (system) Add specs for Process.run(shell: true) with PATH (#16617, thanks @straight-shoota)
compiler
  • Add Crystal::Config.path= for spec helper (#16613, thanks @straight-shoota)
  • (codegen) Rename duplicated "between 64 and 128 bits" case (#16683, thanks @kojix2)
  • (codegen) Add "compile" spec helper (#16735, thanks @ysbaddaden)
  • (parser) Add parser specs for escaping in delimited literals (#16703, #16709, thanks @straight-shoota)
  • (parser) Refactor assert_syntax_error to use expect_raises (#16711, thanks @straight-shoota)
  • (parser) Enhance parser specs for escaping delimiters [follow-up #16703] (#16721, thanks @straight-shoota)
  • (parser) Add formatter specs for ProcNotation (#16742, thanks @straight-shoota)
  • (parser) Add spec/syntax_spec.cr (#16749, thanks @straight-shoota)
  • (parser) Add specs for parsing MacroVar syntax inside literals (#16778, thanks @straight-shoota)
  • (semantic) Fix typo in Link annotation spec (#16710, thanks @kojix2)
tools
  • (formatter) Improve formatter spec helper to show trailing whitespace (#16760, thanks @straight-shoota)
Infrastructure
  • Changelog for 1.20.0 (#16751, thanks @straight-shoota)
  • Update previous Crystal release 1.19.0 (#16572, thanks @ysbaddaden)
  • Update devenv.lock (#16426, #16588, #16658, #16673, #16775, #16586, #16623, thanks @github-actions)
  • Update previous Crystal release 1.19.1 (#16598, thanks @ysbaddaden)
  • Drop ENV.[]= in generate_windows_zone_names (#16606, thanks @straight-shoota)
  • Update devenv 2.0 (#16705, thanks @straight-shoota)
  • Add changelogs for older releases (#16698, #16791, thanks @straight-shoota)
  • Disable buggy ameba rule Lint/SpecFocus (#16740, thanks @straight-shoota)
  • scripts/github-changelog.cr: Group PRs with same name (#16788, thanks @straight-shoota)
  • scripts/github-changelog.cr: Sort link ref labels by PR number (#16789, thanks @straight-shoota)
  • scripts/update-changelog.sh: Fix escape output of final command (#16790, thanks @straight-shoota)
  • (ci) Adjust triggers for update-devenv workflow (#16587, thanks @straight-shoota)
  • (ci) Update GH Actions (#16546, #16619, #16660, #16702, #16786, #16654, #16800, thanks @renovate)
  • (ci) Refactor Linux CI workflows (#16615, thanks @ysbaddaden)
  • (ci) Fix lint workflow to use prek instead of pre-commit (#16653, thanks @straight-shoota)
  • (ci) Add fail-fast: false to all matrix strategies (#16656, thanks @straight-shoota)
  • (ci) Drop separate lint workflows for actionlint and shellcheck (#16663, thanks @straight-shoota)
  • (ci) Run lint workflow on all files when devenv.lock was changed (#16682, thanks @straight-shoota)
  • (ci) Pin nixpkgs in lint workflow (#16706, thanks @straight-shoota)
  • (ci) Update cachix/install-nix-action digest to 1ca7d21 (#16727, thanks @renovate)
  • (ci) Test stdlib with execution contexts on Windows and macOS (#16701, thanks @ysbaddaden)
View originalPermalink
How 1.20.0 went

1.19.1

Fixed 2
  • Fix kqueue timer duration calculation in concurrency
  • Fix time calculations in IOCP and Monitor thread in concurrency
Bugfixes
stdlib
  • (concurrency) [regression] Fix kqueue timer duration calculation (#16581, thanks @skuznetsov)
  • (concurrency) [regression] time calculations in IOCP and Monitor thread (#16583, thanks @ysbaddaden)
Infrastructure
  • Changelog for 1.19.1 (#16590, thanks @ysbaddaden)
View originalPermalink
How 1.19.1 went

1.19.0

Added 16
  • Add compiler flag values to macros
  • Add yielding variant of StringLiteral#gsub
  • Support StringLiteral#split(RegexLiteral)
  • Add StringLiteral#match
  • Add NamedTuple#reverse_merge
  • Add Set#map!
Changed 4
  • Make all overloads of ArrayLiteral#[] return nil on out of bounds
  • Pad Hash#inspect, Tuple#inspect before { from first element
  • Enhance error message for Hash#[] when key is wrong type for default block
  • Loosen type restrictions in StaticFileHandler helper methods from File to IO
Removed 1
  • Require OpenSSL 1.1.1+ or LibreSSL 3+
Breaking changes
stdlib
  • (crypto) Require OpenSSL 1.1.1+ or LibreSSL 3+ (#16480, thanks @ysbaddaden)
Features
lang
  • (macros) [breaking] Add compiler flag values (#16310, thanks @straight-shoota)
  • (macros) Add yielding variant of StringLiteral#gsub (#16378, thanks @Blacksmoke16)
  • (macros) Support StringLiteral#split(RegexLiteral) (#16423, thanks @HertzDevil)
  • (macros) Add StringLiteral#match (#16464, thanks @HertzDevil)
  • (macros) Make all overloads of ArrayLiteral#[] return nil on out of bounds (#16453, thanks @HertzDevil)
stdlib
  • (collection) Add NamedTuple#reverse_merge (#16229, thanks @andrykonchin)
  • (collection) Pad Hash#inspect, Tuple#inspect before { from first element (#16245, thanks @andrykonchin)
  • (collection) Add Set#map! (#16271, thanks @andrykonchin)
  • (collection) Add Hash#transform_keys! (#16280, thanks @andrykonchin)
  • (collection) Enhance error message for Hash#[] when key is wrong type for default block (#16442, thanks @Blacksmoke16)
  • (concurrency) Add Sync::Mutex and Sync::RWLock (#16399, thanks @ysbaddaden)
  • (concurrency) Add Sync::ConditionVariable (#16440, thanks @ysbaddaden)
  • (concurrency) Import Sync::Exclusive and Sync::Shared (#16487, thanks @ysbaddaden)
  • (crypto) Add OpenSSL::SSL::Context::Server#on_server_name for SNI (#16452, #16525, thanks @carlhoerberg, @straight-shoota)
  • (networking) Loosen type restrictions in StaticFileHandler helper methods from File to IO (#16238, thanks @andrykonchin)
  • (networking) Add IPSocket#ipv6_only (#16347, thanks @stakach)
  • (networking) Expose flags hint for getaddrinfo (#16528, thanks @stakach)
  • (numeric) Add Int.from_digits as inverse of Int#digits (#16237, #16566, thanks @andrykonchin, @ysbaddaden)
  • (numeric) Add BigInt.from_digits (#16259, thanks @HertzDevil)
  • (numeric) Add Int#tdivmod (#16258, thanks @andrykonchin)
  • (runtime) Add Proc#[] as alias to #call (#16220, thanks @andrykonchin)
  • (runtime) Add #unshift, #pop and #pop? to Crystal::PointerLinkedList (#16287, thanks @ysbaddaden)
  • (runtime) Add Random.next_bool and .next_int (#16297, thanks @ysbaddaden)
  • (runtime) Add Random#split and #split_internal API for splittable PRNGs (#16342, #16495, thanks @ysbaddaden)
  • (runtime) Add Pointer#fill (#16338, thanks @straight-shoota)
  • (runtime) Add Crystal::PointerLinkedList#first? (#16400, thanks @ysbaddaden)
  • (runtime) Ensure single reader and writer to system fd on Unix (#16209, thanks @ysbaddaden)
  • (runtime) Protect Box.unbox from dereferencing null pointer (#16514, thanks @straight-shoota)
  • (runtime) Register execution context schedulers with the event loop (#16519, thanks @ysbaddaden)
  • (runtime) Add Fiber::ExecutionContext::Scheduler.current? (#16521, thanks @ysbaddaden)
  • (runtime) Move execution context event loop lock to each event loop (#16520, thanks @ysbaddaden)
  • (serialization) Support deserialization of YAML anchors of value types (#16186, thanks @HertzDevil)
  • (serialization) Add end locations to scalars and aliases in YAML::Nodes.parse (#16187, thanks @HertzDevil)
  • (serialization) Set JSON::SerializableError#attribute when appropriate (#16158, thanks @spuun)
  • (serialization) Support large JSON files (#16211, thanks @RX14)
  • (serialization) Add YAML::Nodes.parse_all (#16247, thanks @HertzDevil)
  • (specs) Rescale execution context in spec runner with CRYSTAL_WORKERS (#16444, #16471, thanks @straight-shoota, @ysbaddaden)
  • (system) Add Process.debugger_present? for Windows and Linux (#16248, thanks @HertzDevil)
  • (system) Implement execvpe_impl (#16322, #16344, thanks @straight-shoota)
  • (system) Add ::exit(Process::Status) (#16436, thanks @straight-shoota)
  • (system) Standardize system error codes for File::Error (#16024, thanks @straight-shoota)
  • (system) Add Path#relative? (#16473, thanks @Sija)
  • (text) PCRE2: use thread local for jit stack and match data (#16175, thanks @ysbaddaden)
  • (text) Support 0X, 0O, 0B prefixes in string to integer conversion (#16226, thanks @andrykonchin)
  • (text) Add String#each_line parameter remove_empty (#16232, thanks @andrykonchin)
  • (time) Add weeks parameter to Time::Span.new (#16208, thanks @Sija)
  • (time) Treat GMT as a legacy alias of UTC (#16292, thanks @straight-shoota)
  • (time) Add /etc/zoneinfo to zoneinfo lookup paths (#16463, thanks @straight-shoota)
  • (time) Add support for $TZDIR (#16466, thanks @straight-shoota)
  • (time) Add Time::Instant (#16490, thanks @straight-shoota)
  • (time) [breaking] Adjust monotonic clocks to include suspended time with precision (#16516, thanks @straight-shoota)
compiler
  • (codegen) Build compiler with -Dexecution_context (#16447, #16502, thanks @ysbaddaden, @straight-shoota)
  • (interpreter) Support ->LibX.fun_name in the interpreter (#16194, thanks @ysbaddaden)
  • (semantic) Add error message to CrystalPath::NotFoundError (#16365, thanks @willhbr)
  • (semantic) Retain original location for errors in included, extended hooks (#13261, thanks @Blacksmoke16)
tools
  • (docs-generator) Add optional sanitizer to docs generator (#14646, #16251, thanks @nobodywasishere, @straight-shoota)
Bugfixes
lang
  • (macros) Fix nested sigil delimiter parsing inside macros (#16266, thanks @HertzDevil)
stdlib
  • Fix OptionParser subcommand help to respect custom summary_indent (#16334, thanks @kojix2)
  • (collection) Fix Hash methods to retain compare_by_identity flag (#16356, thanks @andrykonchin)
  • (collection) Fix Hash methods and retaining default value (#16374, thanks @andrykonchin)
  • (files) Fix condition for no-op lock_write to work without sockets (#16304, thanks @straight-shoota)
  • (networking) Fix HTTP::Cookie parsing trailing semicolons (#16328, thanks @alexkutsan)
  • (networking) [breaking] Make #flush in WebSocket#stream a no-op to not send wrongly frames (#16539, thanks @spuun)
  • (runtime) [deprecation] Add thread safety to default random (#16174, #16568, thanks @ysbaddaden)
  • (runtime) default execution context is Parallel (#16367, thanks @ysbaddaden)
  • (runtime) Crystal::PointerLinkedList#each stops iterating when deleting head (#16401, thanks @ysbaddaden)
  • (runtime) closing system fd is thread unsafe (#16289, thanks @ysbaddaden)
  • (runtime) Crystal::System::Process#rwlock with Crystal < 1.7 (UNIX) (#16482, thanks @ysbaddaden)
  • (runtime) urandom initialization isn't thread safe + refactor (#16479, thanks @ysbaddaden)
  • (runtime) execution context queue stress tests failures (#16472, thanks @ysbaddaden)
  • (runtime) don't use Time.monotonic in Fiber::ExecutionContext::Monitor (#16500, thanks @ysbaddaden)
  • (runtime) thread safety of Exception::Callstack (#16504, thanks @ysbaddaden)
  • (runtime) actually clear memory using gc_none on unix (#16562, thanks @BlobCodes)
  • (serialization) memory leak in XML.parse and XML.parse_html methods (#16414, thanks @ysbaddaden)
  • (serialization) memory leak in XML::Document#finalize (#16418, thanks @toddsundsted)
  • (serialization) memory leak in XML::Node#content= (#16419, thanks @toddsundsted)
  • (serialization) Fix use after unlink in XML::Node (#16432, thanks @toddsundsted)
  • (specs) Resolve inconsistent use of #inspect in expect_raises (#16265, #16375, thanks @andrykonchin, @straight-shoota)
  • (system) Create argv before fork (#16286, #16321, thanks @straight-shoota)
  • (system) Pass envp to execvpe (#16340, thanks @straight-shoota)
  • (system) Move make_envp before fork (#16351, thanks @straight-shoota)
  • (system) Replace Dir.cd with a non-raising alternative in pre-exec (#16352, #16369, thanks @straight-shoota)
  • (system) Fix reset directory if Process.exec fails (#16383, thanks @straight-shoota)
  • (system) Fix reorder Process.lock_write outside of .block_signals (#16465, thanks @straight-shoota)
  • (system) Disable process cancellation during fork (#16446, thanks @straight-shoota)
compiler
  • (cli) chore: correct progress step count to 14 (#16269, thanks @miry)
  • (codegen) Fix System V ABI for arrays of packed structs with misaligned fields (#16314, thanks @HertzDevil)
  • (debugger) Fix debug info for closured variables (#16393, thanks @HertzDevil)
  • (interpreter) interpreter handles self in inlined method with arguments (#16307, thanks @cyangle)
  • (interpreter) interpreter typeof should return concrete type (#16379, thanks @cyangle)
  • (interpreter) Fix variable shadowing bug in interpreter (#16335, thanks @cyangle)
  • (interpreter) interpreter musn't reuse dead fiber stacks (#16518, thanks @ysbaddaden)
  • (parser) Fix internal error if multi-assign RHS has splats (#16182, thanks @HertzDevil)
  • (parser) Fix regex delimiter detection in syntax highlighter (#16394, thanks @HertzDevil)
  • (parser) Merge adjacent StringLiterals before yielding (#16427, thanks @Blacksmoke16)
  • (parser) Fix Call#end_location w/ named arguments off-by-one error (#16542, thanks @Sija)
  • (parser) Fix incorrect location for parenthesized union AST nodes (#16552, thanks @Sija)
  • (semantic) Fix instantiation of abstract generic structs in virtual type lookup (#16513, thanks @Blacksmoke16)
  • (semantic) Fix variables assigned inside && conditions with method calls incorrectly got Nil added to their type (#16512, thanks @Blacksmoke16)
tools
  • (docs-generator) Fix doc generation when nesting multiple :inherit: directives (#16443, thanks @Blacksmoke16)
  • (docs-generator) Fix some doc inconsistencies for macros (#16561, thanks @Blacksmoke16)
  • (formatter) Fix incorrect formatting of multi-line macro expression with comment as first line (#16429, thanks @Blacksmoke16)
  • (formatter) Add multi-line formatting support to Generic formatter visitor (#16430, thanks @Blacksmoke16)
Chores
lang
  • (macros) [deprecation] Deprecate single-letter macro fresh variables with indices (#16267, thanks @HertzDevil)
  • (macros) [deprecation] Deprecate macro fresh variables with constant names (#16293, thanks @HertzDevil)
stdlib
  • (macros) [deprecation] Deprecate StringLiteral#split(ASTNode) for non-separator arguments (#16439, thanks @HertzDevil)
  • (time) [deprecation] Deprecate Time#inspect(io, *, with_nanoseconds) (#16416, thanks @straight-shoota)
  • (time) [deprecation] Deprecate Time.monotonic (#16545, thanks @straight-shoota)
compiler
  • (cli) Error when trying to build aarch64 with LLVM 12 and below (#15018, thanks @straight-shoota)
other
  • Update copyright year (#16550, thanks @HertzDevil)
  • Remove redundant begin/end blocks (#16554, thanks @straight-shoota)
Performance
stdlib
  • Avoid calling times.map (#16422, thanks @HertzDevil)
  • (runtime) Skip initialization of Pointer.malloc with zero value (#16333, thanks @straight-shoota)
  • (runtime) Call Pointer.malloc(size, value) in Slice.new(size, value) (#16358, thanks @straight-shoota)
compiler
  • Group temporary variables by file name: splats (#16242, thanks @HertzDevil)
  • (codegen) [regression] Only define the type name table in the main LLVM module (#16260, thanks @HertzDevil)
  • (codegen) Allow closures to use atomic allocation (#16360, thanks @HertzDevil)
Refactor
stdlib
  • Refactor flag and value parsing into a separate method (#16300, thanks @straight-shoota)
  • (cli) Refactor OptionParser#parse (#16233, thanks @kojix2)
  • (cli) Simplify OptionParser#handle_flag with guard clauses (#16309, thanks @kojix2)
  • (files) Fix: don't flush twice in File#truncate (UNIX) (#16395, thanks @ysbaddaden)
  • (llvm) simplify target initialization and support more targets (#16437, thanks @ysbaddaden)
  • (log) Log::Metadata should put parent entries first on extend (like Hash#merge) (#16098, thanks @spuun)
  • (networking) Split HTTP::Headers#get(Key) into undocumented overload (#16283, thanks @straight-shoota)
  • (networking) Remove internal type OAuth::Params (#16319, thanks @AnandRaj2224)
  • (runtime) Refactor Crystal::DWARF::LineNumbers::Sequence (#16214, thanks @HertzDevil)
  • (runtime) Extract Crystal::EventLoop#shutdown from #close (#16288, #16366, thanks @ysbaddaden)
  • (runtime) Prefer Random::Secure.random_bytes (#16298, thanks @ysbaddaden)
  • (runtime) Set default random arg to nil instead of Random::DEFAULT (#16299, thanks @ysbaddaden)
  • (runtime) Drop EventLoop#after_fork_before_exec (#16332, thanks @straight-shoota)
  • (runtime) Cleanup node on Crystal::PointerLinkedList#delete (#16398, thanks @ysbaddaden)
  • (runtime) Add Fiber::Stack#size (#16420, thanks @ysbaddaden)
  • (runtime) Fix: new_thread spec helper must return isolated context (not thread) (#16421, thanks @ysbaddaden)
  • (runtime) Fix: always use getrandom on Linux and Android >= 28 (#16478, thanks @ysbaddaden)
  • (system) Extract Crystal::System::Env.each_pointer on Unix (#16200, thanks @straight-shoota)
  • (system) Refactor internal Crystal::System::Process#fork on UNIX (#16191, #16373, thanks @ysbaddaden, @straight-shoota)
  • (system) Use execvpe when available (#16294, #16311, thanks @straight-shoota)
  • (system) Add Env.make_envp (#16320, #16384, thanks @straight-shoota)
  • (system) Fix pre-exec for closed file descriptor (#16359, thanks @straight-shoota)
  • (system) Move prepare_args into system implementation internals (#16362, thanks @straight-shoota)
  • (system) Extract unix/spawn.cr as a separate file (#16388, thanks @straight-shoota)
  • (system) Extract internal Process.block_signals helper (#16402, thanks @straight-shoota)
  • (system) Rename target aarch64-android to aarch64-linux-android (#16409, thanks @straight-shoota)
  • (text) Simplify String#byte_slice(Int) and String#byte_slice?(Int) (#16235, thanks @andrykonchin)
  • (time) Use clock_gettime on darwin (#16492, thanks @straight-shoota)
  • (time) Add Crystal::System::Time.instant (#16506, thanks @straight-shoota)
  • (time) Replace Time.monotonic with Time.instant [follow-up #16490] (#16498, thanks @straight-shoota)
  • (time) remove extraneous method definition for Time::Span#sign (#16553, thanks @plambert)
Documentation
lang
  • (annotations) Fix @[Deprecated] doc comment (#16302, thanks @jgaskins)
stdlib
  • (collection) Clarify Set's enumeration order (#16274, thanks @HertzDevil)
  • (concurrency) Add docs for Sync namespace (#16565, thanks @ysbaddaden)
  • (crypto) Remove outdated performance hint in Bcrypt docs (#16536, thanks @BlobCodes)
  • (macros) Fix invalid runtime types in macro docs (#16534, thanks @BlobCodes)
  • (networking) Add type restrictions to OAuth::Consumer#get_authorize_uri (#16285, thanks @straight-shoota)
  • (numeric) Improve docs for Int to mention Int128 and UInt128 (#16529, thanks @HCLarsen)
  • (runtime) Use to_slice for presentation in Pointer doc examples (#16345, thanks @straight-shoota)
  • (system) Add type restrictions to process (#16065, thanks @Vici37)
  • (text) Document String#split(Regex)'s capture group behavior (#16207, thanks @HertzDevil)
  • (text) Add type restrictions to regex directory (#16066, thanks @Vici37)
Specs
lang
  • (macros) Enhance specs for flag? macro (#16336, thanks @straight-shoota)
stdlib
  • (collection) Add specs for Slice.new (#16424, thanks @straight-shoota)
  • (concurrency) Fix thread name expectation with parallel execution context (#16517, thanks @straight-shoota)
  • (crypto) Fix: remove 1 second sleep in openssl/ssl/server spec (#16454, thanks @ysbaddaden)
  • (files) Add specs for IO#read_bytes with converter (#16250, thanks @straight-shoota)
  • (networking) Fix TCP specs to accept EAI_NODATA instead of EAI_NONAME for unresolvable hostname (#16496, thanks @straight-shoota)
  • (system) Add specs for Process.run (#16306, #16325, thanks @straight-shoota)
  • (time) Update zoneinfo to TZDB version 2025c (#16501, thanks @straight-shoota)
compiler
  • (semantic) Drop assert_expand_second and assert_expand_third helpers (#16244, thanks @HertzDevil)
Infrastructure
  • Changelog for 1.19.0 (#16510, thanks @ysbaddaden)
  • Update previous Crystal release 1.18.1 (#16212, thanks @matiasgarciaisaia)
  • Fix shellcheck violations (#16221, thanks @straight-shoota)
  • Fix markdownlint violations (#16222, #16252, thanks @straight-shoota)
  • Merge release/1.18@1.18.2 into master (#16246, thanks @straight-shoota)
  • Enable ameba rule Lint/SpecFilename (#16223, thanks @straight-shoota)
  • Encourage +1 reactions on issues and PRs for prioritization (#16241, thanks @straight-shoota)
  • Update previous Crystal release 1.18.2 (#16249, thanks @straight-shoota)
  • Add devenv (#16263, thanks @straight-shoota)
  • Add ameba to git-hooks (#16276, #16295, thanks @straight-shoota)
  • Add devenv profile lint (#16291, thanks @straight-shoota)
  • Update distribution-scripts (#16301, thanks @straight-shoota)
  • Makefile: Extract variable COMPILER_FLAGS (#16349, #16372, thanks @straight-shoota)
  • Fix shell.nix on Linux (#16346, thanks @straight-shoota)
  • Build compiler with -Dpreview_mt (#16380, thanks @straight-shoota)
  • Update devenv.lock (#16386, thanks @github-actions)
  • Update devenv.lock (#16408, thanks @github-actions)
  • Drop committed .envrc (#16462, thanks @straight-shoota)
  • Add git-hook to ensure changing both Makefile and Makefile.win at the same time (#16503, thanks @straight-shoota)
  • Makefile: Use simply expanded variables to avoid costly duplicate evaluation (#16509, thanks @straight-shoota)
  • Fix scripts/update-shards.sh (#16524, thanks @straight-shoota)
  • Update distribution-scripts (#16530, thanks @straight-shoota)
  • Update shards 0.20.0 (#16523, thanks @straight-shoota)
  • Update typos 1.38.1 (#16219, thanks @straight-shoota)
  • Build snap arm64 target + drop publish_snap target (#16491, thanks @ysbaddaden)
  • (ci) Update darwin jobs in circleci to m4pro.medium resource class (#16389, thanks @straight-shoota)
  • (ci) Update xcode to 26.0.1 on circleci (#16201, thanks @straight-shoota)
  • (ci) Update korthout/backport-action action to v3.4.1 (#16215, thanks @renovate)
  • (ci) [security] Pin GitHub action uses to commit hash (#16253, thanks @straight-shoota)
  • (ci) Add lint workflow running pre-commit (#16275, #16296, thanks @straight-shoota)
  • (ci) Fix issues in GHA workflows (#16282, thanks @straight-shoota)
  • (ci) Update GH Actions (#16290, thanks @renovate)
  • (ci) Update crate-ci/typos action to v1.39.0 (#16326, thanks @renovate)
  • (ci) Refactor matrix configuration in Linux workflow (#16331, thanks @straight-shoota)
  • (ci) Reduce smoke tests to building only std_spec (#16337, thanks @straight-shoota)
  • (ci) Merge gnu and musl tests into a single matrix (#16341, thanks @straight-shoota)
  • (ci) Fix pull_request trigger for smoke workflow (#16343, thanks @straight-shoota)
  • (ci) Update GH Actions (#16385, thanks @renovate)
  • (ci) Add workflow update-devenv (#16387, thanks @straight-shoota)
  • (ci) Update GH Actions (#16434, thanks @renovate)
  • (ci) Update distribution-scripts (#16411, thanks @straight-shoota)
  • (ci) Run smoke tests on docker images (#16441, thanks @straight-shoota)
  • (ci) Update actions/checkout digest to 8e8c483 (#16474, thanks @renovate)
  • (ci) Remove test_dist_linux_on_docker job (#16410, thanks @straight-shoota)
  • (ci) Push docker images directly to registry (#16488, thanks @straight-shoota)
  • (ci) Enable multiarch docker builds (#16493, thanks @straight-shoota)
  • (ci) Run multi-threading test job with execution context (#16339, thanks @straight-shoota)
  • (ci) build linux aarch64 tarballs (#16330, thanks @ysbaddaden)
View originalPermalink
How 1.19.0 went

1.18.2

Fixed 2
  • Revert type restriction for IO#read_bytes
  • Fix Fiber::ExecutionContext.default_workers_count to avoid taking into account unsupported values
Bugfixes
stdlib
  • (files) [regression] Revert type restriction for IO#read_bytes (#16231, thanks @straight-shoota)
  • (runtime) Fix Fiber::ExecutionContext.default_workers_count to avoid taking into account unsupported values (#16227, thanks @Sija)
Infrastructure
  • Changelog for 1.18.2 (#16243, thanks @matiasgarciaisaia)
View originalPermalink
How 1.18.2 went

1.18.1

Fixed 2
  • Revert adding type restrictions on HTTP::WebSocket#send etc.
  • Fix allow space after base type in enum def
Bugfixes
stdlib
  • (networking) [regression] Revert adding type restrictions on HTTP::WebSocket#send etc. (#16218, thanks @straight-shoota)
compiler
  • (parser) [regression] Fix allow space after base type in enum def (#16217, thanks @straight-shoota)
Infrastructure
  • Changelog for 1.18.1 (#16224, thanks @matiasgarciaisaia)
View originalPermalink
How 1.18.1 went
View all

Discussion

If you publish Crystal, you can claim this product by proving you administer its repository.