Name | Modified | Size | Downloads / Week |
---|---|---|---|
Parent folder | |||
crystal-1.17.0-windows-x86_64-msvc-unsupported.exe | 2025-07-16 | 35.9 MB | |
crystal-1.17.0-windows-x86_64-msvc-unsupported.zip | 2025-07-16 | 52.3 MB | |
crystal-1.17.0-windows-aarch64-gnu-unsupported.zip | 2025-07-16 | 58.7 MB | |
crystal-1.17.0-windows-x86_64-gnu-unsupported.zip | 2025-07-16 | 59.5 MB | |
crystal-1.17.0-1-darwin-universal.tar.gz | 2025-07-16 | 59.5 MB | |
crystal-1.17.0-1-linux-x86_64-bundled.tar.gz | 2025-07-16 | 52.2 MB | |
crystal-1.17.0-1-linux-x86_64.tar.gz | 2025-07-16 | 51.8 MB | |
crystal-1.17.0-1.universal.pkg | 2025-07-16 | 59.6 MB | |
crystal-1.17.0-docs.tar.gz | 2025-07-16 | 16.4 MB | |
1.17.0 source code.tar.gz | 2025-07-16 | 3.9 MB | |
1.17.0 source code.zip | 2025-07-16 | 4.8 MB | |
README.md | 2025-07-16 | 27.7 kB | |
Totals: 12 Items | 454.9 MB | 0 |
Breaking changes
stdlib
- Make
Colorize.on_tty_only!
the default behavior (#15881, thanks @HertzDevil) - (concurrency) Rename execution contexts + improve their docs (#15936, thanks @ysbaddaden)
- (files) Refactor
IO.pipe
blocking mode (#15823, thanks @ysbaddaden) - (files) Fix: set
IO::Stapled.pipe
blocking args to nil, as perIO.pipe
(#15925, thanks @ysbaddaden) - (networking) Refactor
Socket
blocking mode (#15804, thanks @ysbaddaden) - (runtime) Let the event loop decide the blocking mode of
File
(#15930, thanks @ysbaddaden) - (serialization) Fix: libxml manual memory management (#15906, #15933, thanks @ysbaddaden)
- (system) Turn
SystemError.from_errno
into a macro (#15874, thanks @straight-shoota)
Features
lang
- (macros) Handle properly stringifying single line blocks (#15568, thanks @Blacksmoke16)
- (macros) Handle properly stringifying multiline named tuple literals (#15566, thanks @Blacksmoke16)
- (macros) Handle properly stringifying multiline calls (#15691, thanks @Blacksmoke16)
- (macros) Handle significant whitespace before a blocks body (#15692, thanks @Blacksmoke16)
- (macros) Support
{% if ...; end; ... %}
macro expressions (#15917, thanks @HertzDevil) - (macros) Support
{% elsif %}
when stringifyingMacroIf
nodes (#15928, thanks @HertzDevil)
stdlib
- Add
Colorize.default_enabled?
(#15912, thanks @HertzDevil) - [experimental] Add
Struct.pre_initialize
(#15896, thanks @HertzDevil) - (files) Support Windows local device paths in
Path
(#15590, thanks @HertzDevil) - (llvm) Support LLVM 21.0 (development branch) (#15771, thanks @HertzDevil)
- (networking) Extract
WebSocket#do_ping
,#do_close
helper methods for overrides (#15545, thanks @luislavena) - (networking) Add support for IPv6 scoped addresses (RFC4007) (#15263, thanks @foxxx0)
- (networking) Expose
HTTP::Request#uri
(#15816, thanks @syeopite) - (numeric) Add
BigRational#to_i
(#15809, thanks @HertzDevil) - (numeric) Add
Float::Primitive#sign_bit
(#15830, thanks @HertzDevil) - (runtime) Add explicit
Crystal::EventLoop#reopened(FileDescriptor)
hook (#15640, thanks @ysbaddaden) - (runtime) Add
Crystal::EventLoop::FileDescriptor#open
(#15750, thanks @ysbaddaden) - (runtime) Add
Thread::Local(T)
(#15616, thanks @ysbaddaden) - (serialization) Add
XML.libxml2_version
(#15623, thanks @straight-shoota) - (serialization) Add
YAML::Builder#start_document(*, implicit_start_indicator)
(#15835, thanks @straight-shoota) - (serialization) Support pretty printing of
XML
types (#15833, thanks @HertzDevil) - (serialization) Expose error message from libyaml on emitter errors (#15841, thanks @straight-shoota)
- (serialization) Add
Path.from_json_object_key
(#15877, thanks @jneen) - (serialization) Add
Time::Location#{to,from}_{json,yaml}
(#15939, thanks @Sija) - (serialization) Extract
XML::Document
fromXML::Node
(#15920, thanks @ysbaddaden) - (text) [experimental] Add
Crystal::System.wstr_literal
on Windows (#15747, thanks @HertzDevil) - (text) Add
String#ensure_suffix
andString#ensure_prefix
(#15782, thanks @MatheusRich) - (text) Add
truncate_at_null
parameter toString.new(Bytes)
and.from_utf16
(#15887, thanks @HertzDevil) - (time) Add
Time.month_week_date
(#15620, thanks @HertzDevil) - (time) Improve the TZif database file parser (#15825, thanks @HertzDevil)
- (time) Support POSIX TZ environment variable strings (#15792, thanks @HertzDevil)
- (time) Improve whitespace handling in
Time::Format
(#15890, thanks @HertzDevil) - (time) Support Windows system time zone transitions in all years (#15891, thanks @HertzDevil)
- (time) Support POSIX TZ strings in TZif databases (#15863, thanks @HertzDevil)
compiler
- (cli) Support
--x86-asm-syntax
for emitting Intel style assembly (#15612, thanks @HertzDevil) - (debugger) Support debug info of 128-bit enum members (#15770, thanks @HertzDevil)
- (parser) More robust trailing expressions newline implementation (#15614, thanks @Blacksmoke16)
- (parser) Handle properly stringifying multiline (boolean) expressions (#15709, thanks @Blacksmoke16)
- (parser) Stringify
MacroIf
unless
nodes properly (#15919, thanks @HertzDevil) - (parser) Support
elsif
when stringifyingIf
nodes (#15918, thanks @HertzDevil) - (parser) Add location info to
MacroVar
nodes (#15947, thanks @Blacksmoke16) - (semantic) Improve error message for
pointerof
(#15876, thanks @straight-shoota)
tools
- Macro code coverage tool (#15738, thanks @Blacksmoke16)
- (docs-generator) Limit paragraph
max-width
in API docs (#15672, thanks @straight-shoota)
Bugfixes
lang
- [experimental] Do not use private linkage for slice literal buffers (#15746, thanks @HertzDevil)
stdlib
- Require
NO_COLOR
to be non-empty (#15880, thanks @HertzDevil) - (benchmark) Use
UInt64
to track iteration count during warm-up calculation inBenchmark::IPS
(#15780, thanks @syeopite) - (collection) Fix
Array#|
for different item types (#15756, thanks @straight-shoota) - (concurrency) Fix calling
Fiber::ExecutionContext#enqueue
from bareThread
(#15767, thanks @ysbaddaden) - (concurrency) Simplify
Crystal::System::Fiber::RESERVED_STACK_SIZE
initializer on Windows (#15820, thanks @HertzDevil) - (concurrency) Do not print adjacent nodes in
Thread::LinkedList#inspect
(#15829, thanks @HertzDevil) - (files) Fix async append to file in IOCP (#15681, thanks @ysbaddaden)
- (numeric) [regression] Fix
BigFloat#format
not compiling (#15796, thanks @HertzDevil) - (numeric) Never output exponent in
BigDecimal#format
(#15795, thanks @HertzDevil) - (numeric) Preserve precision when passing
BigDecimal
orBigFloat
tosprintf
%i
(#15808, thanks @HertzDevil) - (numeric) Fix
Float32#abs
for signed zeros (#15814, thanks @HertzDevil) - (numeric) Ensure unary
Float32#-
andFloat64#-
flip sign bit (#15857, thanks @HertzDevil) - (runtime) reopen async
File
passed toProcess.exec
and.run
(win32) (#15703, thanks @ysbaddaden) - (runtime) raise on manual fiber resume from sleep (#15744, thanks @ysbaddaden)
- (runtime) race condition in
Fiber::ExecutionContext::Isolated#wait
(#15872, thanks @ysbaddaden) - (runtime) Prevent leaking memory when
exec_recursive
's block raises (#15893, thanks @straight-shoota) - (runtime) thread specs must test
Thread
, notFiber::ExecutionContext::Isolated
(#15909, thanks @ysbaddaden) - (system) Fix
Path#relative_to
for non-normalized anchor (#15737, thanks @straight-shoota) - (system) [regression] Skip
src/termios.cr
on Windows (#15852, thanks @HertzDevil) - (system) Suspend Windows processes until job objects are set up (#15850, thanks @HertzDevil)
- (time) Fix
Time::Location::InvalidTZDataError
dropping default message (#15824, thanks @HertzDevil) - (time) Fix IANA time zone names for Windows system time zones (#15914, thanks @HertzDevil)
compiler
- (codegen) Add file name to file-private virtual types during codegen (#15897, thanks @HertzDevil)
- (codegen) Clear debug location of top-level implicit return (#15972, thanks @HertzDevil)
- (codegen) Add file name to file-private generic instance metaclass types during codegen (#15974, thanks @HertzDevil)
- (codegen) Add debug locations to metaclass nodes and
typeof
(#15971, thanks @HertzDevil) - (interpreter) Fix interpreter guard clauses for signal handling (#15892, thanks @straight-shoota)
- (parser) Add end locations for
Case
,Asm
, andSelect
(#15452, thanks @FnControlOption) - (parser) [regression] Fix stringification of
Not
as call receiver (#15801, thanks @Blacksmoke16) - (semantic) Fix cleanup of one-to-many assignment with untyped RHS (#15755, thanks @HertzDevil)
- (semantic) Do not consider type in
Crystal::Var#==
(#15884, thanks @HertzDevil)
tools
- (docs-generator) Handle doc locations when file is in parent directory (#15898, thanks @Blacksmoke16)
- (macro-code-coverage) Better handle coverage reporting of
MacroIf
nodes with onlyMacroLiteral
bodies (#15938, thanks @Blacksmoke16)
Chores
stdlib
- [breaking] Make
Enum.from_value
raiseArgumentError
instead ofException
(#15624, thanks @HertzDevil) - Fix duplicate keys in hash literals (#15843, thanks @straight-shoota)
- Remove unused code (#15845, thanks @straight-shoota)
- Remove shadowed method arguments (#15846, thanks @straight-shoota)
- Replace some
not_nil!
calls with bang methods (#15847, thanks @straight-shoota) - Remove useless condition literal (#15859, thanks @straight-shoota)
- Use
be_nil
andbe_true
/be_false
everywhere in specs (#15867, thanks @straight-shoota) - Remove trailing whitespace (#15869, thanks @straight-shoota)
- Add trailing newlines (#15870, thanks @straight-shoota)
- (collection) Replace literal conditions with nilable casts (#15844, thanks @straight-shoota)
- (time) Update Windows zone names (#15728, thanks @straight-shoota)
- (time) Update Windows zone names using local database (#15837, thanks @HertzDevil)
compiler
- Replace
is_a?
calls with convenient alternatives (#15860, thanks @straight-shoota)
other
- Fix typos and add
typos
integration (#15873, thanks @straight-shoota)
Performance
lang
- [experimental] Optimize slice literal codegen on LLVM 21 (#15803, thanks @HertzDevil)
stdlib
- (collection) Optimize
Indexable#find
(#15674, thanks @straight-shoota) - (numeric) Add specialized implementations for
Float#infinite?
and#nan?
(#15813, thanks @HertzDevil)
compiler
- Apply performance improvement suggestions from ameba (#15839, thanks @straight-shoota)
- (codegen) Simplify codegen of mixed-type checked integer addition and subtraction (#15878, thanks @HertzDevil)
Refactor
stdlib
- (collection) Make
offset
a required parameter inIndexable#find
(#15671, thanks @straight-shoota) - (crypto) Add extra
Digest.update
overloads forBytes
(#15736, thanks @straight-shoota) - (crypto) [experimental] Use
Slice
literals inCrypto::Bcrypt
(#15781, thanks @HertzDevil) - (files) Ask system to decide non-blocking
IO::FileDescriptor
(win32) (#15753, thanks @ysbaddaden) - (files)
Crystal::EventLoop::FileDescriptor#open
now sets the non/blocking flag (#15754, thanks @ysbaddaden) - (networking) Use relative requires for
http/
files (#15675, thanks @straight-shoota) - (networking) Split
StaticFileHandler#call
into structured components (#15678, thanks @straight-shoota) - (numeric) [experimental] Use
Slice.literal
forfast_float
when supported (#15667, thanks @HertzDevil) - (numeric) Combine the decimal number printing implementations (#15815, thanks @HertzDevil)
- (runtime) Extract bindings for LibC errno to
src/lib_c/
(#15565, thanks @ysbaddaden) - (runtime) Extract
Exception::CallStack.decode_backtrace_frame
helper (#15615, thanks @ysbaddaden) - (runtime) Let
Crystal::EventLoop#close
do the actual close (not just cleanup) (#15641, thanks @ysbaddaden) - (serialization) Replace deprecated
LibXML.xmlGcMemSetup
with.xmlMemSetup
(#15626, thanks @straight-shoota) - (serialization) XML: modernize API when available & workaround issues with legacy versions (#15899, thanks @ysbaddaden)
- (specs) Support arbitrary
IO
s inSpec::CLI
(#15882, thanks @HertzDevil) - (specs) Replace some lookup hashes in
Spec
with exhaustive cases (#15879, thanks @HertzDevil) - (text) [experimental] Use slice literals for
String::CHAR_TO_DIGIT
andCHAR_TO_DIGIT62
(#15745, thanks @HertzDevil) - (text) Replace some uses of
String#%
with justification methods (#15821, thanks @HertzDevil) - (text) Avoid calling
chars.size
onString
s (#15822, thanks @HertzDevil) - (time) Move most POSIX TZ string functionality to a module (#15866, thanks @HertzDevil)
compiler
- (codegen) Replace type-id function with lookup table (#15904, thanks @BlobCodes)
Documentation
stdlib
- (crypto) Add type restrictions to
Digest
(#15696, thanks @Vici37) - (crypto) Add documentation for
Crypto::Bcrypt::Password#to_s
(#15935, thanks @hugopl) - (crypto) Improve docs for
OpenSSL::Cipher
(#15964, thanks @Fijxu) - (macros) [experimental] Document
Crystal::Macros::StringLiteral#to_utf16
(#15748, thanks @HertzDevil) - (runtime) Document
GC::Stats
properties (#15676, thanks @ysbaddaden) - (runtime) Add links to language specification in docs for pseudo methods (#15864, thanks @straight-shoota)
- (runtime) Fix unclosed codeblock in
__crystal_pseudo_alignof
docs (#15945, thanks @syeopite) - (serialization) Add type restrictions to
CSV
(#15695, thanks @Vici37) - (specs) Clarify docs in regards to what
be_nil
expectation does (#15954, thanks @Blacksmoke16) - (system) Add type restrictions to
Dir
(#15697, thanks @Vici37) - (system) Improve docs for
Socket
andIO::FileDescriptor
handles (#15977, thanks @straight-shoota) - (text) Improve docs for
String#lines
and#each_line
(#15894, thanks @straight-shoota)
compiler
- (parser) Improve examples for the syntax highlighter documentation (#15699, thanks @tamdaz)
Specs
stdlib
- Drop
to_a
in expectations withSlice
(#15735, thanks @straight-shoota) - (crypto) Unroll test data in specs for
crypto/subtle
(#15702, thanks @straight-shoota) - (networking) Add test for
HTTP::Request
with resource string//
(#15546, thanks @miry) - (networking) Pick TCP and UDP local ports differently in socket specs (#15828, thanks @HertzDevil)
- (serialization) Remove forgotten debug
puts
call (#15942, thanks @Sija) - (text) Simplify specs for string comparison (#15868, thanks @straight-shoota)
compiler
- (interpreter) Enable interpreter integration test for XML (#15628, thanks @straight-shoota)
- (parser) Cleanup parser specs (#15446, thanks @FnControlOption)
tools
- (formatter) Fix formatter specs with string interpolation (#15842, thanks @straight-shoota)
Infrastructure
- Changelog for 1.17.0 (#15900, #15983, thanks @straight-shoota)
- Update previous Crystal release 1.16.1 (#15649, thanks @straight-shoota)
- Update
release-update
script: Truncate CHANGELOG (#15679, thanks @straight-shoota) - Merge
release/1.16
into master (#15729, thanks @straight-shoota) - Simplify
docs_main.cr
(#15621, thanks @straight-shoota) - Update previous Crystal release 1.16.2 (#15730, thanks @straight-shoota)
- Fix order of title clean steps in github-changelog helper (#15727, thanks @straight-shoota)
- Fix
scripts/release-update.sh
idempotent previous CHANGELOG entry (#15731, thanks @straight-shoota) - Merge
release/1.16
@1.16.3 into master (#15774, thanks @straight-shoota) - Update previous Crystal release 1.16.3 (#15773, thanks @straight-shoota)
- Makefile: Fix target location for
install_docs
(#15853, thanks @straight-shoota) - Add ameba (#15875, thanks @straight-shoota)
- Allow-list Crystal's funding.json from the project (#15969, thanks @matiasgarciaisaia)
- Allow
LLVM_VERSION
override insideMakefile
(#15765, thanks @HertzDevil) - Add build script for
spec/std/data/zoneinfo.zip
(#15831, thanks @HertzDevil) - (ci) Update GH Actions (#15668, thanks @renovate)
- (ci) Add
XML CI
workflow (#15923, thanks @straight-shoota) - (ci) Update typos 1.34.0 (#15950, thanks @straight-shoota)
- (ci) Update korthout/backport-action action to v3.2.1 (#15949, thanks @renovate)
- (ci) Update cygwin/cygwin-install-action action to v6 (#15965, thanks @renovate)
- (ci) Drop the static LLVM libraries on Windows MSVC CI (#15797, thanks @HertzDevil)
- (ci) Set up Inno Setup explicitly on MSVC CI (#15851, #15861, thanks @HertzDevil)
- (ci) Update library versions for MSVC CI (#15921, thanks @HertzDevil)
- (ci) Add CI workflow for MinGW-w64 ARM64 builds (#15794, thanks @HertzDevil)
- (ci) [regression] Use
CMAKE_MSVC_RUNTIME_LIBRARY
for the MSVC PCRE2 static library (#15802, thanks @HertzDevil)