Download Latest Version crystal-1.17.1-windows-x86_64-gnu-unsupported.zip (59.5 MB)
Email in envelope

Get an email when there's a new version of Crystal

Home / 1.17.0
Name Modified Size InfoDownloads / 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 per IO.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 stringifying MacroIf 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 from XML::Node (#15920, thanks @ysbaddaden)
  • (text) [experimental] Add Crystal::System.wstr_literal on Windows (#15747, thanks @HertzDevil)
  • (text) Add String#ensure_suffix and String#ensure_prefix (#15782, thanks @MatheusRich)
  • (text) Add truncate_at_null parameter to String.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 stringifying If 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 in Benchmark::IPS (#15780, thanks @syeopite)
  • (collection) Fix Array#| for different item types (#15756, thanks @straight-shoota)
  • (concurrency) Fix calling Fiber::ExecutionContext#enqueue from bare Thread (#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 or BigFloat to sprintf %i (#15808, thanks @HertzDevil)
  • (numeric) Fix Float32#abs for signed zeros (#15814, thanks @HertzDevil)
  • (numeric) Ensure unary Float32#- and Float64#- flip sign bit (#15857, thanks @HertzDevil)
  • (runtime) reopen async File passed to Process.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, not Fiber::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, and Select (#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 only MacroLiteral bodies (#15938, thanks @Blacksmoke16)

Chores

stdlib

  • [breaking] Make Enum.from_value raise ArgumentError instead of Exception (#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 and be_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 in Indexable#find (#15671, thanks @straight-shoota)
  • (crypto) Add extra Digest.update overloads for Bytes (#15736, thanks @straight-shoota)
  • (crypto) [experimental] Use Slice literals in Crypto::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 for fast_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 IOs in Spec::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 and CHAR_TO_DIGIT62 (#15745, thanks @HertzDevil)
  • (text) Replace some uses of String#% with justification methods (#15821, thanks @HertzDevil)
  • (text) Avoid calling chars.size on Strings (#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 and IO::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 with Slice (#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 inside Makefile (#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)
Source: README.md, updated 2025-07-16