Skip to content

Releases: grayscale-lang/grayscale

v0.0.2

Choose a tag to compare

@github-actions github-actions released this 19 Jul 07:43
6a51299

0.0.2 (2026-07-18)

Bug Fixes

  • compiler: suppress -Winfinite-recursion warning from leaking to user output (#2102) (69729f5)

v0.0.1

Choose a tag to compare

@SchoolyB SchoolyB released this 18 Jul 21:11

Initial release of the Grayscale programming language.

Bug Fixes

  • cli: propagate errors to main() instead of calling os.Exit directly
  • ci: remove continue-on-error from test steps
  • runtime: use source file paths in panic messages instead of generated C paths

v3.9.0

Choose a tag to compare

@SchoolyB SchoolyB released this 16 Jul 08:43
fac7dd7

Features

  • Generic type parameters via <?> syntax (#1797)
  • Channels: try_send() and try_receive() for non-blocking operations (#1721)
  • else as syntax alias for otherwise (#1974)
  • [K:V] map syntax — map keyword now optional (#1961)
  • Compile-time integer constants as fixed-size array sizes (#1961)
  • --emit-c writes generated C to file instead of stdout (#2049)
  • Custom request headers support in http module (#1994)
  • atomic.spinlock_destroy() to free spinlock memory (#1721)
  • os.unset_env() to remove environment variables (#2002)
  • arrays.any() and arrays.all() higher-order functions (#2000)
  • strings.to_chars(), strings.from_chars(), strings.char_at(), strings.remove_prefix(), strings.remove_suffix(), strings.last_index_of() (#1997, #1998)
  • time.diff() to return the difference between two timestamps (#1997)
  • Helpful hints added to 10 common compiler error messages (#1566)

Bug Fixes

  • Validate Channel type for first arg of all channels functions (#2061)
  • Reject channels.try_receive() single capture with E3040 instead of C error leak (#2060)
  • Materialize rvalue for map field access through explicit ptr deref (#2065)
  • Allow local consts as fixed-size array sizes (#2070)
  • Strip \$ escape in codegen so escaped interpolation emits valid C (#2077)
  • Char/byte array literals use correct elem_size in codegen (#2066)
  • Typecheck index argument in arrays.remove_at() and arrays.insert_at() (#2000)
  • Catch channels.send/try_send type mismatch and resolve module-qualified types (#2061)

Final Release

This is the final release of the EZ programming language.

v3.8.6

Choose a tag to compare

@github-actions github-actions released this 10 Jul 08:21
594895e

3.8.6 (2026-07-10)

Bug Fixes

  • add depth limit to json.is_valid to prevent stack overflow on deeply nested input (#2020) (0914ab7)
  • add optional host parameter to net.listen() and server.listen() to allow interface-specific binding (#2017) (63e84e6)
  • add scope_destroy() to release scope memory at all typechecker call sites (b6a1ac6)
  • add type_pool_reset() to free heap strings from type pool on shutdown (f9ef806)
  • add typechecker_free() and typetable_free() to release typechecker memory (dce12dc)
  • cap HTTP server at 1024 concurrent connections and apply 30s read timeout per connection (#2011) (7d2d30d)
  • cap os.exec stdout/stderr collection at 64 MiB per stream to prevent memory exhaustion (#2010) (ae9b26d)
  • correct element type parsing for nested bracket types in array initializers (2b61fff)
  • free global_init buffer in codegen_destroy() (6b9ea93)
  • heap-allocate builtin struct field arrays to prevent free-of-static crash (60e273b)
  • initialize ns_func_names fields in codegen_create to prevent garbage free (1ab0464)
  • json.encode always quotes map[string:string] values, escape all control chars (#2019) (c490066)
  • reject CORS origins containing CR or LF to prevent HTTP header injection (P0101) (#2009) (3188d1d)
  • reject https:// URLs in http module with explicit error instead of silent plaintext fallback (#2007) (b25c633)
  • repair result-clobbering NULL and dangling stack pointers in typechecker (#2040, #2045) (e74831a)
  • report 'unexpected end of interpolation expression' instead of EOF in ${...} sub-parser (#2018) (ef0369d)
  • resolve rvalue address-of bug in stdlib codegen (#2053, #2052) (2657125)
  • resolve string enum element type in array indexing and iteration (1a0956a)
  • resolve wildcard-returned enums as TK_ENUM instead of TK_STRUCT (#2054) (a90e756)
  • send HTTP request headers and body separately to remove 8KB body size limit (#2013) (8df4f3e)
  • strdup type_array inputs and resolve remaining free-of-non-heap crashes (ca7aa46)
  • track and free struct-namespaced function name strings in codegen (480c807)
  • use arena allocation for named-arg reorder buffer in tc_resolve_named_args() (58cc8b4)
  • use correct C type for integer enum array element access (bb62a4a)
  • use lvalue check in addr-of wrapping to preserve mutation semantics (#2053, #2052) (c8becba)

Performance Improvements

  • add early-out for equal names in tc_same_enum_type and tc_same_struct_type (#2043) (79d9dc3)
  • add parallel index array to find_enum_index to eliminate O(n) scan after bsearch (#2042) (963cbfc)
  • cache tc_lookup_using_constant result to avoid double call (#2040) (180d0d7)
  • eliminate O(n) inner loop in tc_lookup_using_constant via pre-computed import index (#2041) (ce92138)
  • fix several remaining memory leaks in typechecker and codegen (5f513eb)
  • replace 202 unconditional stack diagnostic buffers with arena allocation via tc_fmt helper (#2044) (287ec00)
  • replace strlen+sprintf heap allocs with snprintf into stack buffer in name-mangling paths (#2045) (1ee7731)

v3.8.5

Choose a tag to compare

@github-actions github-actions released this 07 Jul 20:46
4226800

3.8.5 (2026-07-07)

Bug Fixes

  • correct lower bound in uint-to-int cast error message (178bcf3)
  • emit correct HTTP reason phrase and Location header for redirects (611016e)
  • improve compiler parsing, HTTP behavior, and CLI safety (67e1e56)
  • parse fixed-size array of maps type annotation [map[K:V], N] (1b183d1)
  • prompt for confirmation before ez pz --force deletes existing directory (d34a65c)
  • warn when ez doc --output writes outside the current directory (83adb16)

v3.8.4

Choose a tag to compare

@github-actions github-actions released this 06 Jul 11:08
3af8748

3.8.4 (2026-07-06)

Bug Fixes

  • add missing ez_i128_to_u64 and range-check all wide-to-scalar casts (#2029, #2030) (f6a45ae)
  • uint(signed_wide_int) now panics when value is negative #2034 (420e02c)

v3.8.3

Choose a tag to compare

@github-actions github-actions released this 05 Jul 10:18
1ecb61d

3.8.3 (2026-07-05)

Bug Fixes

  • add range checks to cast between int/uint and i64/u64 (#2026) (fab59e3)
  • add runtime panic for invalid bit shift amounts (#2025) (37afcb3)
  • emit E5039 for const expression overflow, suppress C error (#2028) (1c517f1)
  • overflow-check range loop step increment (#2027) (248316f)
  • reject incompatible bigint types in arithmetic and comparison (#2004) (ab27912)
  • reject string index assignment with E3004 instead of leaking C error (#2005) (594dd13)

v3.8.2

Choose a tag to compare

@github-actions github-actions released this 30 Jun 04:51
e286595

3.8.2 (2026-06-30)

Bug Fixes

  • cli: cap update download at 256 MiB to prevent disk exhaustion (#1980) (2b14809)
  • cli: redact home directory from C compiler path in ez report (#1983) (26eeeb0)
  • cli: reject path traversal sequences in ez pz project name (#1979) (badd948)
  • cli: remove unsupported sized integer/float types from ez man docs (#1976) (f660865)
  • cli: restrict update download URLs to trusted GitHub release origin (#1978) (599f8c2)
  • codegen: cast dividend to int64_t in div/mod overflow check to silence Wtautological-constant-out-of-range-compare (2b753be)
  • codegen: cast of negative float to uint/u64 now panics with P0091 (#1964) (37f4d51)
  • codegen: emit T * const for const pointer variables, not const T * (#1937) (381b662)
  • codegen: fixed-size array [T, N] with partial init now has length N (#1965) (9810873)
  • codegen: map compound assignment now reads existing value before applying op (#1971) (c19d6e8)
  • codegen: promote integer literals to double in [float]/[f32]/[f64] array literals (#1963) (c4c39b8)
  • codegen: string(Error) now returns the error message instead of leaking C error (#1977) (72d3f2d)
  • consolidate reserved name lists into shared reserved.h (#1954) (a42a410)
  • leaks: print clear PASS/FAIL summary at end of make leaks output (#1975) (141b947)
  • lexer: catch physical newline in string literal as E1023 (#1959) (683203b)
  • parser: accept complex types in multi-return destructuring positions 2+ (#1962) (a2b0454)
  • parser: emit E2086 when in/not_in/!in has no left-hand value (#1960) (de90608)
  • parser: support blank identifier _ as for loop variable in range iteration (#1972) (3dc99b3)
  • runtime: drain overlong input() lines to prevent stdin contamination (#1981) (0576927)
  • runtime: use pre-addition overflow check in ez_string_concat to eliminate signed UB (#1984) (c1af77d)
  • scripts: handle escaped quotes in error message extraction (790e2cf)
  • typechecker: allow range(n, n) as empty sequence per spec start <= end (#1969) (f4683f9)
  • typechecker: reject == / != on tagged enums with E3124 (#1967) (ce02e3e)
  • typechecker: reject for_each with both positions as _ with E3123 (#1966) (7bda22b)
  • typechecker: reject tagged enum passed to print functions with E5038 (#1968) (d83c720)
  • typechecker: replace misleading 'only structs' phrasing in E3013 messages (b0d1695)

Performance Improvements

  • codegen: collapse buf_append_indent loop into a single buf_appendn call (#1953) (b27f4ed)
  • codegen: eliminate double vsnprintf in emitf for short emissions (#1952) (aaa214d)
  • codegen: replace linear scan in is_c_keyword with bsearch (#1956) (d2ac0a2)
  • error: add cached error/warning counters to DiagnosticList (#1943) (b7ac109)
  • error: build line-offset index in diag_set_source (#1942) (e0c5a5a)
  • error: replace single-file source cache with 4-slot LRU cache (#1947) (48ee72e)
  • imports: limit rewrite_labels outer pass to original main-program nodes (#1946) (22b8643)
  • imports: replace O(n) import-seen scan with FNV-1a open-addressing hash set (#1951) (8f5f9e2)
  • imports: replace while+rescan with a pending import queue (#1945) (b073b80)
  • scan: replace bubble sort in scan_ez_files with qsort (#1944) (1946c88)
  • typechecker: replace O(n) scans in display name and enum helpers with bsearch (#1948) (ea19b7c)
  • typechecker: replace O(n) scans in fallible stdlib lookups with bsearch (#1949) (521246d)
  • typechecker: sort stdlib lookup tables in typechecker_create (#1955) (b54a2f6)
  • typechecker: use stack buffer in levenshtein to avoid malloc on every call (#1950) (75f9ed4)

v3.8.1

Choose a tag to compare

@github-actions github-actions released this 23 Jun 20:01
efc8220

3.8.1 (2026-06-23)

Bug Fixes

  • main: suppress ld warnings from cc link command with -Wl,-w (3ab0df7)

v3.8.0

Choose a tag to compare

@github-actions github-actions released this 23 Jun 05:59
b93a950

3.8.0 (2026-06-23)

Features

  • support for_each over inline array literals (#1931) (cadb6a8)

Bug Fixes