# Changelog 1.13 ## [1.13.3] (2024-09-18) [1.13.3]: https://github.com/crystal-lang/crystal/releases/1.13.3 ### Bugfixes #### stdlib - **[regression]** Fix use global paths in macro bodies ([#14965], thanks @straight-shoota) - _(system)_ **[regression]** Fix `Process.exec` stream redirection on Windows ([#14986], thanks @HertzDevil) - _(text)_ **[regression]** Fix `String#index` and `#rindex` for `Char::REPLACEMENT` ([#14937], thanks @HertzDevil) [#14965]: https://github.com/crystal-lang/crystal/pull/14965 [#14986]: https://github.com/crystal-lang/crystal/pull/14986 [#14937]: https://github.com/crystal-lang/crystal/pull/14937 ### Infrastructure - Changelog for 1.13.3 ([#14991], thanks @straight-shoota) - _(ci)_ Enable runners from `runs-on.com` for Aarch64 CI ([#15007], thanks @straight-shoota) [#14991]: https://github.com/crystal-lang/crystal/pull/14991 [#15007]: https://github.com/crystal-lang/crystal/pull/15007 ## [1.13.2] (2024-08-20) [1.13.2]: https://github.com/crystal-lang/crystal/releases/1.13.2 ### Bugfixes #### stdlib - _(collection)_ Fix explicitly clear deleted `Hash::Entry` ([#14862], thanks @HertzDevil) [#14862]: https://github.com/crystal-lang/crystal/pull/14862 #### compiler - _(codegen)_ Fix `ReferenceStorage(T)` atomic if `T` has no inner pointers ([#14845], thanks @HertzDevil) - _(codegen)_ Fix misaligned store in `Bool` to union upcasts ([#14906], thanks @HertzDevil) - _(interpreter)_ Fix misaligned stack access in the interpreter ([#14843], thanks @HertzDevil) [#14845]: https://github.com/crystal-lang/crystal/pull/14845 [#14906]: https://github.com/crystal-lang/crystal/pull/14906 [#14843]: https://github.com/crystal-lang/crystal/pull/14843 ### Infrastructure - Changelog for 1.13.2 ([#14914], thanks @straight-shoota) [#14914]: https://github.com/crystal-lang/crystal/pull/14914 ## [1.13.1] (2024-07-12) [1.13.1]: https://github.com/crystal-lang/crystal/releases/1.13.1 ### Bugfixes #### stdlib - _(serialization)_ **[regression]** Revert "Optimize JSON parsing a bit" ([#14804], thanks @straight-shoota) [#14804]: https://github.com/crystal-lang/crystal/pull/14804 ### Infrastructure - Changelog for 1.13.1 ([#14806], thanks @straight-shoota) [#14806]: https://github.com/crystal-lang/crystal/pull/14806 ## [1.13.0] (2024-07-09) [1.13.0]: https://github.com/crystal-lang/crystal/releases/1.13.0 ### Features #### lang - Allow rescuing exceptions that include a module ([#14553], thanks @Blacksmoke16) - _(macros)_ Allow assignment to `_` inside macro expressions ([#14452], thanks @HertzDevil) [#14553]: https://github.com/crystal-lang/crystal/pull/14553 [#14452]: https://github.com/crystal-lang/crystal/pull/14452 #### stdlib - _(collection)_ Add `Array#insert_all` ([#14486], thanks @summer-alice) - _(collection)_ Improve compile time error for `#sort(&block : T, T -> U)` ([#14693], thanks @beta-ziliani) - _(concurrency)_ Add `WaitGroup` synchronization primitive ([#14167], thanks @ysbaddaden) - _(concurrency)_ Allow `Atomic`s of pointer types ([#14401], thanks @HertzDevil) - _(concurrency)_ Add `Thread.new` yields itself ([#14543], thanks @ysbaddaden) - _(concurrency)_ Add support for `Atomic(Bool)` ([#14532], thanks @ysbaddaden) - _(concurrency)_ Add `Thread.sleep(Time::Span)` ([#14715], thanks @ysbaddaden) - _(files)_ Implement `IO#tty?` in Win32 ([#14421], thanks @HertzDevil) - _(files)_ Implement `File.readable?` and `.writable?` in Win32 ([#14420], thanks @HertzDevil) - _(files)_ Make `File.readable?` and `.writable?` follow symlinks on Windows ([#14514], thanks @HertzDevil) - _(llvm)_ Add some missing `LLVM::Context` bindings ([#14612], thanks @ysbaddaden) - _(llvm)_ Do not strip the macOS target triple ([#14466], thanks @hovsater) - _(log)_ Support `UInt32` and `UInt64` in Log Context ([#14459], thanks @toddsundsted) - _(macros)_ Add AST node methods for macro-related nodes ([#14492], thanks @HertzDevil) - _(macros)_ Support short blocks in `#[]` operator call's macro interpolation ([#14523], thanks @HertzDevil) - _(macros)_ Add macro methods for `Select` ([#14600], thanks @HertzDevil) - _(macros)_ Add `TypeNode#private?`, `#public?` and `#visibility` ([#11696], thanks @Hadeweka) - _(macros)_ Add `StringLiteral#to_utf16` ([#14676], thanks @ysbaddaden) - _(networking)_ Relax type restriction of handlers in `HTTP::Server.new` to `Indexable(HTTP::Handler)` ([#14413], thanks @hugopl) - _(networking)_ **[security]** OpenSSL: don't change default cipher suites ([#14655], thanks @ysbaddaden) - _(networking)_ Allow parsing cookies with space in the value ([#14455], thanks @anton7c3) - _(runtime)_ Add `EventLoop::Socket` module ([#14643], thanks @straight-shoota) - _(runtime)_ Add `EventLoop::FileDescriptor` module ([#14639], thanks @straight-shoota) - _(runtime)_ Add `Crystal::Tracing` for runtime tracing ([#14659], thanks @ysbaddaden) - _(system)_ **[security]** **[breaking]** Disable implicit execution of batch files on Windows ([#14557], thanks @straight-shoota) - _(system)_ Add `EventLoop#run(blocking)` and `EventLoop#interrupt` ([#14568], thanks @ysbaddaden) - _(system)_ Add `Crystal::System::Time.ticks` ([#14620], thanks @ysbaddaden) - _(system)_ Add `Crystal::System::Thread.current_thread?`, `#scheduler?` ([#14660], thanks @ysbaddaden) - _(system)_ Protect fork/exec on targets that don't support atomic CLOEXEC ([#14674], thanks @ysbaddaden) - _(system)_ Add `Crystal::System.panic` ([#14733], thanks @ysbaddaden) - _(text)_ Add `Regex::MatchOptions` overload for `String#index!` ([#14462], thanks @HertzDevil) - _(text)_ Add `StringPool#get?` ([#14508], thanks @HertzDevil) - _(text)_ Add `pkg_config` names for `pcre2` and `pcre` ([#14584], thanks @straight-shoota) - _(text)_ Add UUID v7 ([#14732], thanks @jgaskins) - _(time)_ Add `Time::Error` ([#14743], thanks @Blacksmoke16) [#14486]: https://github.com/crystal-lang/crystal/pull/14486 [#14693]: https://github.com/crystal-lang/crystal/pull/14693 [#14167]: https://github.com/crystal-lang/crystal/pull/14167 [#14401]: https://github.com/crystal-lang/crystal/pull/14401 [#14543]: https://github.com/crystal-lang/crystal/pull/14543 [#14532]: https://github.com/crystal-lang/crystal/pull/14532 [#14715]: https://github.com/crystal-lang/crystal/pull/14715 [#14421]: https://github.com/crystal-lang/crystal/pull/14421 [#14420]: https://github.com/crystal-lang/crystal/pull/14420 [#14514]: https://github.com/crystal-lang/crystal/pull/14514 [#14612]: https://github.com/crystal-lang/crystal/pull/14612 [#14466]: https://github.com/crystal-lang/crystal/pull/14466 [#14459]: https://github.com/crystal-lang/crystal/pull/14459 [#14492]: https://github.com/crystal-lang/crystal/pull/14492 [#14523]: https://github.com/crystal-lang/crystal/pull/14523 [#14600]: https://github.com/crystal-lang/crystal/pull/14600 [#11696]: https://github.com/crystal-lang/crystal/pull/11696 [#14676]: https://github.com/crystal-lang/crystal/pull/14676 [#14413]: https://github.com/crystal-lang/crystal/pull/14413 [#14655]: https://github.com/crystal-lang/crystal/pull/14655 [#14455]: https://github.com/crystal-lang/crystal/pull/14455 [#14643]: https://github.com/crystal-lang/crystal/pull/14643 [#14639]: https://github.com/crystal-lang/crystal/pull/14639 [#14659]: https://github.com/crystal-lang/crystal/pull/14659 [#14557]: https://github.com/crystal-lang/crystal/pull/14557 [#14568]: https://github.com/crystal-lang/crystal/pull/14568 [#14620]: https://github.com/crystal-lang/crystal/pull/14620 [#14660]: https://github.com/crystal-lang/crystal/pull/14660 [#14674]: https://github.com/crystal-lang/crystal/pull/14674 [#14733]: https://github.com/crystal-lang/crystal/pull/14733 [#14462]: https://github.com/crystal-lang/crystal/pull/14462 [#14508]: https://github.com/crystal-lang/crystal/pull/14508 [#14584]: https://github.com/crystal-lang/crystal/pull/14584 [#14732]: https://github.com/crystal-lang/crystal/pull/14732 [#14743]: https://github.com/crystal-lang/crystal/pull/14743 #### compiler - _(codegen)_ Add compiler flags `-Os` and `-Oz` to optimize binary size ([#14463], thanks @ysbaddaden) - _(codegen)_ Add compiler support for AVR architecture (Arduino) ([#14393], thanks @ysbaddaden) [#14463]: https://github.com/crystal-lang/crystal/pull/14463 [#14393]: https://github.com/crystal-lang/crystal/pull/14393 #### tools - _(formatter)_ Allow new formatter styles for trailing comma and whitespace around proc literal ([#14726], thanks @Blacksmoke16) [#14726]: https://github.com/crystal-lang/crystal/pull/14726 ### Bugfixes #### lang - _(macros)_ Fix parsing of non-trailing `if` bodies inside macro expressions ([#14505], thanks @HertzDevil) - _(macros)_ Drop parentheses around `->` inside certain comma-separated lists ([#14506], thanks @HertzDevil) - _(macros)_ Fix indentation of `Select` nodes' macro interpolation ([#14510], thanks @HertzDevil) - _(macros)_ Fix indentation of parenthesized `Expressions#to_s` ([#14511], thanks @HertzDevil) [#14505]: https://github.com/crystal-lang/crystal/pull/14505 [#14506]: https://github.com/crystal-lang/crystal/pull/14506 [#14510]: https://github.com/crystal-lang/crystal/pull/14510 [#14511]: https://github.com/crystal-lang/crystal/pull/14511 #### stdlib - _(collection)_ **[regression]** Ensure `Enumerable#to_a` and `Enumerable#tally` properly retain return type of `T` ([#14447], thanks @Blacksmoke16) - _(collection)_ **[breaking]** Never raise `IndexError` in `#[]?(Range)` ([#14444], thanks @HertzDevil) - _(collection)_ **[breaking]** Fix `Set#to_a(&)` ([#14519], thanks @meatball133) - _(collection)_ Fix `Hash#rehash` to reset `@first` ([#14606], thanks @straight-shoota) - _(collection)_ Fix macro interpolation in `NamedTuple#from` ([#14790], thanks @HertzDevil) - _(collection)_ **[regression]** Fix regression with `NamedTuple.new` when using key with a hyphen ([#14785], thanks @Blacksmoke16) - _(files)_ Allow `#fsync` and `#flock_*` on `IO::FileDescriptor` ([#14432], thanks @HertzDevil) - _(files)_ Make `IO::FileDescriptor#tty?` return false for NUL on Windows ([#14509], thanks @HertzDevil) - _(files)_ Fix blockless `IO::FileDescriptor` echo and raw mode methods ([#14529], thanks @HertzDevil) - _(files)_ Remove target path's forward slashes in `File.symlink` on Windows ([#14522], thanks @HertzDevil) - _(files)_ Fix `IO#same_content?` accepting prefix on second stream ([#14664], thanks @straight-shoota) - _(files)_ Fix overflow in `File#read_at` for large offsets on Windows ([#14708], thanks @HertzDevil) - _(files)_ Fix `IO::FileDescriptor.new` for closed fd ([#14697], thanks @straight-shoota) - _(files)_ Fix `IO::Delimited` reading into limited slice with peek ([#14772], thanks @straight-shoota) - _(files)_ Fix `Compress::Gzip` extra field ([#14550], thanks @kojix2) - _(log)_ delete source from builder cache when finalize ([#14475], thanks @ysbaddaden) - _(networking)_ Fix `Socket#close` error handling on Windows ([#14517], thanks @HertzDevil) - _(networking)_ Set UTF-8 charset on directory listing in `HTTP::StaticFileHandler` ([#14546], thanks @alexkutsan) - _(networking)_ Don't pass socket file descriptors to subprocesses on Unix (`SOCK_CLOEXEC`) ([#14632], thanks @carlhoerberg) - _(networking)_ **[security]** OpenSSL: don't set default ECDH curve ([#14656], thanks @ysbaddaden) - _(networking)_ **[security]** OpenSSL: deprecate Mozilla's TLS Server recommendation ([#14657], thanks @ysbaddaden) - _(networking)_ use `SOCK_CLOEXEC` with `FD_CLOEXEC` fallback ([#14672], thanks @ysbaddaden) - _(networking)_ **[regression]** Fix regression on `Socket#connect` timeout type restriction ([#14755], thanks @straight-shoota) - _(networking)_ Drop default timeout for `Socket#connect` on Windows ([#14756], thanks @straight-shoota) - _(networking)_ don't hardcode alpn protocol byte size (OpenSSL) ([#14769], thanks @ysbaddaden) - _(numeric)_ Fix `BigRational#format` ([#14525], thanks @meatball133) - _(numeric)_ **[regression]** Restore leading zero in exponent for `printf("%e")` and `printf("%g")` ([#14695], thanks @straight-shoota) - _(runtime)_ Fix enable docs for builtin constants ([#14571], thanks @straight-shoota) - _(runtime)_ Fix `GC.malloc` for `gc_none` to clear memory ([#14746], thanks @straight-shoota) - _(serialization)_ Fix JSON discriminator for Bool `false` value ([#14779], thanks @dammer) - _(specs)_ Fix relative file paths in spec output ([#14725], thanks @straight-shoota) - _(system)_ Fix using `System.retry_with_buffer` with stack buffer ([#14615], thanks @straight-shoota) - _(system)_ Harmonize close on exec for `Socket` & `FileDescriptor` on Windows ([#14634], thanks @ysbaddaden) - _(system)_ Use `dup3` and `pipe2` to set `O_CLOEXEC` when available ([#14673], thanks @ysbaddaden) - _(system)_ Fix calls to `retry_with_buffer` when big buffer is necessary ([#14622], thanks @BlobCodes) - _(system)_ Fix `Process.run` with closed IO ([#14698], thanks @straight-shoota) - _(system)_ Prefer `strerror_r` over `strerror` for thread-safe errno ([#14764], thanks @ysbaddaden) - _(text)_ Make `String#sub` raise `IndexError` if index is equal to size ([#14458], thanks @HertzDevil) - _(text)_ Fix `libpcre2` version detection not working for `-RC{N}` versions ([#14478], thanks @Frityet) - _(text)_ Fix `Regex#inspect` with non-literal-compatible options ([#14575], thanks @straight-shoota) - _(text)_ Fix ECR escape sequences containing `-` ([#14739], thanks @HertzDevil) [#14447]: https://github.com/crystal-lang/crystal/pull/14447 [#14444]: https://github.com/crystal-lang/crystal/pull/14444 [#14519]: https://github.com/crystal-lang/crystal/pull/14519 [#14606]: https://github.com/crystal-lang/crystal/pull/14606 [#14790]: https://github.com/crystal-lang/crystal/pull/14790 [#14785]: https://github.com/crystal-lang/crystal/pull/14785 [#14432]: https://github.com/crystal-lang/crystal/pull/14432 [#14509]: https://github.com/crystal-lang/crystal/pull/14509 [#14529]: https://github.com/crystal-lang/crystal/pull/14529 [#14522]: https://github.com/crystal-lang/crystal/pull/14522 [#14664]: https://github.com/crystal-lang/crystal/pull/14664 [#14708]: https://github.com/crystal-lang/crystal/pull/14708 [#14697]: https://github.com/crystal-lang/crystal/pull/14697 [#14772]: https://github.com/crystal-lang/crystal/pull/14772 [#14550]: https://github.com/crystal-lang/crystal/pull/14550 [#14475]: https://github.com/crystal-lang/crystal/pull/14475 [#14517]: https://github.com/crystal-lang/crystal/pull/14517 [#14546]: https://github.com/crystal-lang/crystal/pull/14546 [#14632]: https://github.com/crystal-lang/crystal/pull/14632 [#14656]: https://github.com/crystal-lang/crystal/pull/14656 [#14657]: https://github.com/crystal-lang/crystal/pull/14657 [#14672]: https://github.com/crystal-lang/crystal/pull/14672 [#14755]: https://github.com/crystal-lang/crystal/pull/14755 [#14756]: https://github.com/crystal-lang/crystal/pull/14756 [#14769]: https://github.com/crystal-lang/crystal/pull/14769 [#14525]: https://github.com/crystal-lang/crystal/pull/14525 [#14695]: https://github.com/crystal-lang/crystal/pull/14695 [#14571]: https://github.com/crystal-lang/crystal/pull/14571 [#14746]: https://github.com/crystal-lang/crystal/pull/14746 [#14779]: https://github.com/crystal-lang/crystal/pull/14779 [#14725]: https://github.com/crystal-lang/crystal/pull/14725 [#14615]: https://github.com/crystal-lang/crystal/pull/14615 [#14634]: https://github.com/crystal-lang/crystal/pull/14634 [#14673]: https://github.com/crystal-lang/crystal/pull/14673 [#14622]: https://github.com/crystal-lang/crystal/pull/14622 [#14698]: https://github.com/crystal-lang/crystal/pull/14698 [#14764]: https://github.com/crystal-lang/crystal/pull/14764 [#14458]: https://github.com/crystal-lang/crystal/pull/14458 [#14478]: https://github.com/crystal-lang/crystal/pull/14478 [#14575]: https://github.com/crystal-lang/crystal/pull/14575 [#14739]: https://github.com/crystal-lang/crystal/pull/14739 #### compiler - _(codegen)_ Fix create new `target_machine` for every program ([#14694], thanks @straight-shoota) - _(codegen)_ Make `ReferenceStorage(T)` non-atomic if `T` is non-atomic ([#14730], thanks @HertzDevil) - _(codegen)_ Detect and error on failed codegen process ([#14762], thanks @ysbaddaden) - _(codegen)_ Fix stats and progress issues in codegen ([#14763], thanks @ysbaddaden) - _(debugger)_ Fix LLDB `crystal_formatters.py` for Python 3 ([#14665], thanks @zw963) - _(parser)_ Disallow assignments to calls with parentheses ([#14527], thanks @HertzDevil) - _(parser)_ Fix parser validate UTF-8 on first input byte ([#14750], thanks @straight-shoota) - _(semantic)_ Fix type def reopening type from parent namespace ([#11208], thanks @straight-shoota) - _(semantic)_ Fix `Crystal::Path#to_macro_id` for global path ([#14490], thanks @straight-shoota) - _(semantic)_ Fix `Class#===` on metaclass ([#11162], thanks @makenowjust) [#14694]: https://github.com/crystal-lang/crystal/pull/14694 [#14730]: https://github.com/crystal-lang/crystal/pull/14730 [#14762]: https://github.com/crystal-lang/crystal/pull/14762 [#14763]: https://github.com/crystal-lang/crystal/pull/14763 [#14665]: https://github.com/crystal-lang/crystal/pull/14665 [#14527]: https://github.com/crystal-lang/crystal/pull/14527 [#14750]: https://github.com/crystal-lang/crystal/pull/14750 [#11208]: https://github.com/crystal-lang/crystal/pull/11208 [#14490]: https://github.com/crystal-lang/crystal/pull/14490 [#11162]: https://github.com/crystal-lang/crystal/pull/11162 #### tools - _(docs-generator)_ Fix generate docs for builtins `HOST_TRIPLE` and `TARGET_TRIPLE` ([#14570], thanks @straight-shoota) - _(docs-generator)_ Decode URI component for search functionality in docs ([#14645], thanks @nobodywasishere) - _(formatter)_ Fix formatting for short block inside `#[]` operator call ([#14526], thanks @HertzDevil) - _(formatter)_ Fix formatter to skip trailing comma for single-line parameters ([#14713], thanks @Blacksmoke16) [#14570]: https://github.com/crystal-lang/crystal/pull/14570 [#14645]: https://github.com/crystal-lang/crystal/pull/14645 [#14526]: https://github.com/crystal-lang/crystal/pull/14526 [#14713]: https://github.com/crystal-lang/crystal/pull/14713 ### Chores #### stdlib - _(collection)_ Drop obsolete workaround in `Range#reverse_each` ([#14709], thanks @yxhuvud) - _(concurrency)_ Add `WaitGroup` to `docs_main.cr` ([#14624], thanks @straight-shoota) - _(files)_ **[deprecation]** Move `File.readable?`, `.writable?`, `.executable?` to `File::Info` ([#14484], thanks @straight-shoota) - _(networking)_ Drop `Crystal::System::Socket#system_send` ([#14637], thanks @straight-shoota) - _(networking)_ Add type restriction `host : String` in `TCPSocket` and `Addrinfo` ([#14703], thanks @straight-shoota) - _(runtime)_ Fix abstract def parameter name in `LibEvent::EventLoop#send_to` ([#14658], thanks @straight-shoota) - _(runtime)_ **[breaking]** Drop unused methods in `IO::Evented` ([#14666], thanks @straight-shoota) - _(runtime)_ Drop `IO::Overlapped` ([#14704], thanks @straight-shoota) [#14709]: https://github.com/crystal-lang/crystal/pull/14709 [#14624]: https://github.com/crystal-lang/crystal/pull/14624 [#14484]: https://github.com/crystal-lang/crystal/pull/14484 [#14637]: https://github.com/crystal-lang/crystal/pull/14637 [#14703]: https://github.com/crystal-lang/crystal/pull/14703 [#14658]: https://github.com/crystal-lang/crystal/pull/14658 [#14666]: https://github.com/crystal-lang/crystal/pull/14666 [#14704]: https://github.com/crystal-lang/crystal/pull/14704 #### compiler - _(codegen)_ **[breaking]** Remove `CRYSTAL_LIBRARY_RPATH` and delay-load helper ([#14598], thanks @HertzDevil) [#14598]: https://github.com/crystal-lang/crystal/pull/14598 ### Performance #### stdlib - _(collection)_ Optimize `Hash` for repeated removals and insertions ([#14539], thanks @HertzDevil) - _(runtime)_ Remove unnecessary explicit memory barriers on ARM ([#14567], thanks @ysbaddaden) - _(serialization)_ Optimize JSON parsing a bit ([#14366], thanks @asterite) - _(text)_ Use wrapping arithmetic for `Int::Primitive#unsafe_chr` ([#14443], thanks @HertzDevil) - _(text)_ Optimize `String#index(Char)` and `#rindex(Char)` for invalid UTF-8 ([#14461], thanks @HertzDevil) - _(text)_ Optimize `String#to_utf16` ([#14671], thanks @straight-shoota) [#14539]: https://github.com/crystal-lang/crystal/pull/14539 [#14567]: https://github.com/crystal-lang/crystal/pull/14567 [#14366]: https://github.com/crystal-lang/crystal/pull/14366 [#14443]: https://github.com/crystal-lang/crystal/pull/14443 [#14461]: https://github.com/crystal-lang/crystal/pull/14461 [#14671]: https://github.com/crystal-lang/crystal/pull/14671 ### Refactor #### stdlib - Remove unnecessary calls to `#unsafe_as(UInt64)` etc. ([#14686], thanks @straight-shoota) - _(crypto)_ Replace calls to `StaticArray(UInt8, 1)#unsafe_as(UInt8)` ([#14685], thanks @straight-shoota) - _(files)_ Remove calls to `LibC._setmode` ([#14419], thanks @HertzDevil) - _(files)_ Use file handles directly instead of C file descriptors on Win32 ([#14501], thanks @HertzDevil) - _(files)_ Refactor win32 `System::FileDescriptor#unbuffered_{read,write}` ([#14607], thanks @straight-shoota) - _(files)_ Extract `#system_read` and `#system_write` for `FileDescriptor` and `Socket` ([#14626], thanks @straight-shoota) - _(files)_ Drop unused slice parameters of `#evented_*` methods ([#14627], thanks @straight-shoota) - _(networking)_ Refactor use `IO#read_byte` instead of `#read_char` in `HTTP::ChunkedContent` ([#14548], thanks @straight-shoota) - _(runtime)_ `Thread` owns its current fiber (instead of `Crystal::Scheduler`) ([#14554], thanks @ysbaddaden) - _(runtime)_ Use `Fiber#enqueue` ([#14561], thanks @ysbaddaden) - _(runtime)_ Add `Crystal::EventLoop.current` ([#14559], thanks @ysbaddaden) - _(runtime)_ Add `Fiber.suspend` ([#14560], thanks @ysbaddaden) - _(runtime)_ Remove `OverlappedOperation#synchronous` ([#14663], thanks @straight-shoota) - _(runtime)_ Rename `Crystal::Iocp` to `Crystal::IOCP` ([#14662], thanks @straight-shoota) - _(runtime)_ Unify `EventLoop.create` ([#14661], thanks @straight-shoota) - _(serialization)_ Replace `type` declarations for void pointers with `alias` in `libxml2` ([#14494], thanks @straight-shoota) - _(serialization)_ Refactor `JSON::Any#size` to use two branches instead of three ([#14533], thanks @meatball133) - _(specs)_ Move `Spec` context state into `Spec::CLI` ([#14259], thanks @HertzDevil) - _(system)_ Update `WinError#to_errno` ([#14515], thanks @HertzDevil) - _(system)_ Rename `Crystal::System.print_error(fmt, *args, &)` to `printf` ([#14617], thanks @ysbaddaden) - _(system)_ Refactor `Crystal::System.retry_with_buffer` calling `#to_slice` ([#14614], thanks @straight-shoota) - _(system)_ Extract system implementation of `UNIXSocket.pair` as `Crystal::System::Socket.socketpair` ([#14675], thanks @ysbaddaden) - _(system)_ Remove calls to `Pointer.new(Int)` ([#14683], thanks @straight-shoota) - _(system)_ Cleanup for `IOCP::OverlappedOperation` ([#14723], thanks @straight-shoota) - _(system)_ Refactor `IOCP::OverlappedOperation` internalize `handle` and `wait_for_completion` ([#14724], thanks @straight-shoota) [#14686]: https://github.com/crystal-lang/crystal/pull/14686 [#14685]: https://github.com/crystal-lang/crystal/pull/14685 [#14419]: https://github.com/crystal-lang/crystal/pull/14419 [#14501]: https://github.com/crystal-lang/crystal/pull/14501 [#14607]: https://github.com/crystal-lang/crystal/pull/14607 [#14626]: https://github.com/crystal-lang/crystal/pull/14626 [#14627]: https://github.com/crystal-lang/crystal/pull/14627 [#14548]: https://github.com/crystal-lang/crystal/pull/14548 [#14554]: https://github.com/crystal-lang/crystal/pull/14554 [#14561]: https://github.com/crystal-lang/crystal/pull/14561 [#14559]: https://github.com/crystal-lang/crystal/pull/14559 [#14560]: https://github.com/crystal-lang/crystal/pull/14560 [#14663]: https://github.com/crystal-lang/crystal/pull/14663 [#14662]: https://github.com/crystal-lang/crystal/pull/14662 [#14661]: https://github.com/crystal-lang/crystal/pull/14661 [#14494]: https://github.com/crystal-lang/crystal/pull/14494 [#14533]: https://github.com/crystal-lang/crystal/pull/14533 [#14259]: https://github.com/crystal-lang/crystal/pull/14259 [#14515]: https://github.com/crystal-lang/crystal/pull/14515 [#14617]: https://github.com/crystal-lang/crystal/pull/14617 [#14614]: https://github.com/crystal-lang/crystal/pull/14614 [#14675]: https://github.com/crystal-lang/crystal/pull/14675 [#14683]: https://github.com/crystal-lang/crystal/pull/14683 [#14723]: https://github.com/crystal-lang/crystal/pull/14723 [#14724]: https://github.com/crystal-lang/crystal/pull/14724 #### compiler - _(codegen)_ Add `Program#size_t` and `Target#size_bit_width` ([#14442], thanks @ysbaddaden) - _(parser)_ Replace `Crystal::Select::When` with `Crystal::When` ([#14497], thanks @HertzDevil) [#14442]: https://github.com/crystal-lang/crystal/pull/14442 [#14497]: https://github.com/crystal-lang/crystal/pull/14497 ### Documentation #### stdlib - _(collection)_ Fix doc for `Set#proper_superset_of?` ([#14516], thanks @meatball133) - _(collection)_ Fix result formatting in code example for `Indexable#[]?` ([#14721], thanks @meatball133) - _(concurrency)_ Fix example for `WeakRef` by removing `ref.value` call ([#10846], thanks @hugopl) - _(networking)_ Improve API docs for `Socket#send` ([#14638], thanks @straight-shoota) - _(networking)_ Add documentation for `HTTP::WebSocket#stream` ([#14537], thanks @meatball133) - _(numeric)_ Add documentation for complex methods inside Number ([#14538], thanks @meatball133) - _(runtime)_ Add documentation for standard streams blocking behaviour ([#14577], thanks @straight-shoota) - _(serialization)_ Fix docs for `CSV::Builder#row(&)` ([#14736], thanks @philipp-classen) - _(system)_ **[breaking]** Undocument `IO::Evented` ([#14749], thanks @straight-shoota) - _(system)_ Fix code example for `Process.on_terminate` ([#14798], thanks @philipp-classen) - _(text)_ Fix docs for `Char#ascii_number?` stating wrong minimum base ([#14521], thanks @meatball133) - _(text)_ Enhance documentation for regex options `NO_UTF_CHECK` ([#14542], thanks @straight-shoota) [#14516]: https://github.com/crystal-lang/crystal/pull/14516 [#14721]: https://github.com/crystal-lang/crystal/pull/14721 [#10846]: https://github.com/crystal-lang/crystal/pull/10846 [#14638]: https://github.com/crystal-lang/crystal/pull/14638 [#14537]: https://github.com/crystal-lang/crystal/pull/14537 [#14538]: https://github.com/crystal-lang/crystal/pull/14538 [#14577]: https://github.com/crystal-lang/crystal/pull/14577 [#14736]: https://github.com/crystal-lang/crystal/pull/14736 [#14749]: https://github.com/crystal-lang/crystal/pull/14749 [#14798]: https://github.com/crystal-lang/crystal/pull/14798 [#14521]: https://github.com/crystal-lang/crystal/pull/14521 [#14542]: https://github.com/crystal-lang/crystal/pull/14542 ### Specs #### stdlib - Remove incorrect uses of `describe` ([#14757], thanks @HertzDevil) - _(files)_ Add spec for `Compress::Gzip::Writer` with `extra` ([#14788], thanks @straight-shoota) - _(runtime)_ Add specs for `Pointer::Appender` ([#14719], thanks @straight-shoota) - _(text)_ Add test helper for `normalize/regex_spec` ([#14545], thanks @straight-shoota) [#14757]: https://github.com/crystal-lang/crystal/pull/14757 [#14788]: https://github.com/crystal-lang/crystal/pull/14788 [#14719]: https://github.com/crystal-lang/crystal/pull/14719 [#14545]: https://github.com/crystal-lang/crystal/pull/14545 ### Infrastructure - Changelog for 1.13.0 ([#14712], thanks @straight-shoota) - Update previous Crystal release 1.12.1 ([#14480], thanks @straight-shoota) - Highlight regression bugfixes in changelog ([#14474], thanks @straight-shoota) - Write release version to `src/VERSION` in `update-changelog` and `release-update` ([#14547], thanks @straight-shoota) - Fix `shell.nix` use `llvmPackages.bintools` with wrapper for rpath config ([#14583], thanks @straight-shoota) - Add `src/SOURCE_DATE_EPOCH` to release tree ([#14574], thanks @straight-shoota) - Update distribution-scripts ([#14562], thanks @straight-shoota) - Update distribution-scripts ([#14594], thanks @straight-shoota) - Use `boehmgc` package from nixpkgs in `shell.nix` ([#14591], thanks @straight-shoota) - Simplify LLVM dependency in `shell.nix` ([#14590], thanks @straight-shoota) - Fix nixpkgs `pkg-config` name in `shell.nix` ([#14593], thanks @straight-shoota) - Update previous Crystal release 1.12.2 ([#14647], thanks @straight-shoota) - Update distribution-scripts ([#14648], thanks @straight-shoota) - Update distribution-scripts ([#14714], thanks @straight-shoota) - Update distribution-scripts ([#14776], thanks @straight-shoota) - Fix changelog generator increase topic priority for `infrastructure` ([#14781], thanks @straight-shoota) - Remove `SetShouldExit` in Powershell wrapper ([#13769], thanks @straight-shoota) - _(ci)_ Run `primitives_spec` with the interpreter on CI ([#14438], thanks @HertzDevil) - _(ci)_ Add LLVM 18 to LLVM CI ([#14565], thanks @HertzDevil) - _(ci)_ Update to Ruby 3 in macOS circleCI runner ([#14777], thanks @straight-shoota) - _(ci)_ Distribute `shards.pdb` on Windows ([#14415], thanks @HertzDevil) - _(ci)_ Drop Windows CI workaround for 1.12.0-dev ([#14483], thanks @HertzDevil) [#14712]: https://github.com/crystal-lang/crystal/pull/14712 [#14480]: https://github.com/crystal-lang/crystal/pull/14480 [#14474]: https://github.com/crystal-lang/crystal/pull/14474 [#14547]: https://github.com/crystal-lang/crystal/pull/14547 [#14583]: https://github.com/crystal-lang/crystal/pull/14583 [#14574]: https://github.com/crystal-lang/crystal/pull/14574 [#14562]: https://github.com/crystal-lang/crystal/pull/14562 [#14594]: https://github.com/crystal-lang/crystal/pull/14594 [#14591]: https://github.com/crystal-lang/crystal/pull/14591 [#14590]: https://github.com/crystal-lang/crystal/pull/14590 [#14593]: https://github.com/crystal-lang/crystal/pull/14593 [#14647]: https://github.com/crystal-lang/crystal/pull/14647 [#14648]: https://github.com/crystal-lang/crystal/pull/14648 [#14714]: https://github.com/crystal-lang/crystal/pull/14714 [#14776]: https://github.com/crystal-lang/crystal/pull/14776 [#14781]: https://github.com/crystal-lang/crystal/pull/14781 [#13769]: https://github.com/crystal-lang/crystal/pull/13769 [#14438]: https://github.com/crystal-lang/crystal/pull/14438 [#14565]: https://github.com/crystal-lang/crystal/pull/14565 [#14777]: https://github.com/crystal-lang/crystal/pull/14777 [#14415]: https://github.com/crystal-lang/crystal/pull/14415 [#14483]: https://github.com/crystal-lang/crystal/pull/14483