Skip to content

v0.29.0

Choose a tag to compare

@github-actions github-actions released this 10 Jul 11:01
· 112 commits to main since this release
51f901b

This release drastically improves compile times for modules that import very
large modules. The compiler tracks what specific names are used from each
import and selectively loads exactly those names, avoiding reading full
imported modules.

Language

  • Derive Eq, Ord and Hashable for tuples whose components implement
    them: tuples now support ==, the comparison operators and sorted(), and
    work as dictionary and set keys. Equality and ordering are componentwise at
    a single common type, so comparing tuples of different shapes (positional
    vs named, or reordered field names) is a type error. Witness classes are
    registered for serialization with preassigned class ids, shifting all
    dynamically assigned class ids once. [#3009]
  • Add a compiler-synthesized __get_attr__(name: str) -> ?value reflection
    getter on every class, returning boxed instance attributes by their Acton
    names while reserving __get_attr__ against user definitions. This lets
    serializers reflect over attributes without forcing every attribute subtree
    to stay reachable in large generated data models. [#2993]
  • Compute bytes literal lengths correctly when a hex escape is immediately
    followed by another hex digit, matching the generated split C string
    fragments instead of letting the escape consume too much of the following
    text. [#2996]
  • Use tuple truth values safely in if, while, not, and conditional
    expressions, fixing a panic when tuple __bool__ returned an unboxed C
    bool. [#3004]

Compiler & Build

  • Track what specific names are used from each import and selectively load
    exactly those names, avoiding full imported-module reads during type
    checking, back passes, final C compilation, and cached implementation-hash
    refreshes. Deferred back passes are enabled for normal modules, and tested
    large-module cases see 10,000x improvements. [#2930] [#3000] [#3005]
    [#3008]
  • Speed up large generated modules by deduplicating external witnesses within
    each protocol/type bucket instead of scanning every accumulated witness.
    [#2999]
  • Generate direct C calls for statically known builtin protocol methods on
    builtin types, avoiding witness-table dispatch for those calls while keeping
    the existing builtin witness values available to the generated code. [#2935]
  • Continue primitive unboxing with bool, one of the most common value types
    in Acton programs, representing it as an unboxed C bool through generated
    code and builtin/runtime method tables while preserving inherited method
    calls that return bool. [#2976]
  • Preserve loop-carried locals assigned inside for loops in optimized release
    builds, fixing cases such as explicitly provided argparse sub-command
    options being lost under --release=fast. [#2981]
  • Enable link-time optimization for non-debug Linux builds, including generated
    projects, base, std, backend, and bundled runtime dependencies, while keeping
    Debug builds fast. [#2982]
  • Compile local bindings that shadow functions, including assignments inside
    branches, without letting the global function name suppress the generated C
    local variable declaration. [#2988]
  • Preserve boxed values for primitives stored across awaited actor calls, so
    augmented assignments update int and float locals safely after an
    await instead of corrupting the boxed cell slot. [#2998]
  • Compile continuation calls that return proc values through closure
    conversion, fixing ### BAD contArg crashes in actonc --llift and other
    passes that force the generated continuation type annotations. [#3014]
  • Initialize module globals in bounded chunks and assign simple top-level
    globals directly, avoiding startup stack overflows and oversized temporary
    frames in modules with many generated globals. [#3015]
  • Raise the compiler process open-file limit on startup, reducing
    file-descriptor failures during large concurrent builds and cache-heavy
    projects. [#3002]
  • Avoid macOS cached-interface lock exhaustion after interrupted builds by
    building vendored LMDB with process-shared mutexes instead of global named
    semaphores. [#3007]

CLI & Project Workflow

  • Prevent parallel acton test runs from hanging when a worker or output
    reader fails, reporting the runner failure or captured output error instead
    of waiting forever for a missing completion event. [#2972]

Runtime & Standard Library

  • Add UDP support to net, with UDPCap, fixed-remote UDPConnection
    sockets, bound UDPListener sockets, peer address and port reporting, and
    listener replies to arbitrary peers. [#2989]
  • Add serialize(obj) -> bytes and deserialize(data) -> value builtins for
    in-memory object graph round-trips, preserving shared and cyclic references
    and rejecting actors that cannot be serialized without a global reference
    map. [#2997]
  • Report missing or empty process.Process and process.RunProcess commands
    through on_error, and mark failed spawns as not running so follow-up
    process operations are safely ignored. [#2986]
  • Serialize bigint values with their own class id so multi-word integers
    round-trip through Acton serialization instead of being decoded as normal
    int rows. [#2994]
  • Serialize bytes values with their own class id so they round-trip as
    bytes instead of deserializing as str. [#2995]
  • Preserve shared object references during deserialization by using the same
    integer key representation for back-reference registration and lookup,
    fixing repeated references that previously decoded as missing values. [#3011]
  • Fix json.Json actor actions so decode, decode_list, encode, and
    encode_list call the shared JSON implementations instead of recursively
    calling themselves. [#3017]

Packages & Distribution

  • Speed up macOS CI by reducing the PR test matrix to faster macOS 26 runners,
    while release artifacts still target macOS 15 for both the Zig target and
    Haskell binary deployment floor and publication stays gated on macOS 15 smoke
    tests. [#2992]
  • Speed up package CI by building Debian and RPM packages from the same
    prebuilt dist/ tree, avoiding the slow, hard-to-cache Debian package
    rebuild while sharing installed-payload validation and package version checks
    across both package formats. [#2987]
  • Expand ecosystem CI coverage with standalone acton-ssh and acton-grpc
    test jobs, and drop the stale standalone ncurl job now that its source
    lives in StratoWeave. [#2974]
  • Compress RPM payloads with zstd, and check for the zstd tool before
    building RPM packages. [#3001]

Documentation

  • Document the type checker's witness environment invariants, active and closed
    witness lifetimes, enumeration order, and possible exact-lookup split in the
    compiler developer guide. [#2978]