Releases: grayscale-lang/grayscale
Releases · grayscale-lang/grayscale
Release list
v0.0.2
v0.0.1
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
Features
- Generic type parameters via
<?>syntax (#1797) - Channels:
try_send()andtry_receive()for non-blocking operations (#1721) elseas syntax alias forotherwise(#1974)[K:V]map syntax —mapkeyword now optional (#1961)- Compile-time integer constants as fixed-size array sizes (#1961)
--emit-cwrites 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()andarrays.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()andarrays.insert_at()(#2000) - Catch
channels.send/try_sendtype mismatch and resolve module-qualified types (#2061)
Final Release
This is the final release of the EZ programming language.
v3.8.6
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
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
v3.8.3
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
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
v3.8.0
3.8.0 (2026-06-23)
Features
Bug Fixes
- panic P0090 on range() zero step instead of hanging (#1924) (#1933) (efb9739)
- reject addr() on const variables with E3122 (#1930) (de5f604)
- reject copy() on pointer types with E5037 (#1928) (#1936) (c7a8fac)
- reject duplicate default branches in when statements with E2085 (#1926) (#1935) (1074521)
- reject nil comparison with non-pointer types with E3092 (#1929) (a903d7c)
- reject pointer ordering comparisons with E3120 (#1923) (#1932) (f035594)
- reject struct, array, map, and pointer as when conditions with E3121 (#1925) (#1934) (2ca1702)