Releases: byteink/bit
Release list
Bit 0.38.0
Bit 0.38.0
Breaking changes
- A module's startup-initializer failure message names the module-relative file:
error: module <path> failed to start: <message> (<path>/<file>:<line>), with.as the path of the root module. It named the absolute host path before, so the shipped compiler binary no longer embeds the build machine's stdlib path, and the three release binaries rebuild byte for byte from the tag.
Highlights
umulHi(a: u64, b: u64): u64is the high 64 bits of the 128-bit product: one instruction (UMULHon arm64, one-operandMULon x86-64), no call, no allocation, legal in@nosplit.std/mathgainsmul64(a, b): (u64, u64), the full(hi, lo)product, which compiles to onemulon x86-64 besidea * bon the same operands.std/crypto: an RSA-2048 PKCS#1 v1.5 signature allocates 21.1 KB, from 18.4 MB. Ed25519 sign allocates 12769 B and verify 14353 B per call, from 6.04 MB and 6.30 MB. Modular exponentiation is a 4-bit fixed-window constant-time Montgomery loop of about 1.25 multiplies per exponent bit.std/smtp: delivery status notifications (RFC 3461) throughDsn,NotifyandRetonMessage.dsnandEnvelope.dsn, sent only when the server advertisedDSN;Client.authMechanisms()lists the server's AUTH mechanisms.std/net: IDNA status, mapping, Bidi and joining data are one two-stage table of 8-byte records instead of hex tables binary-searched per probe; an ASCII label is checked in place.- x86-64:
x + kandx - kinto another register is onelea. The compiler built for x86-64 Linux goes from 7931mov+addpairs to 0 and has 8080 fewer instructions. - Optimizer: a fallible callee whose error is a return word is inlined; a join's edges are threaded past a compare its arguments already decide;
xs[i] = vinto a narrow[]i8,[]i16,[]i32,[]u16,[]u32or[]boolis inline instead of a runtime call; slice header loads survive element stores (fe25519MulCoreon arm64: 569 to 498 instructions). - Packages:
pkg/authhas the Have I Been Pwned range check asPwnedPasswords;pkg/websessions carry an index andSessionStore.destroyIndexedrevokes by it;pkg/tomlparsesfixture.tomlat 290.4 objects/KB, from 355.8.
Compiler
- x64: one mul for umulHi(a, b) beside a * b on the same operands (652c1f9)
- optinline: admit a fallible callee whose error is a return word (62849a9)
- opt: thread a join's edges past a compare its arguments already decide (e624f1b)
- codegen: branch past argument-free jump-only blocks (48a568e)
- x64: add of a constant into another register is one lea (75b972a)
- Inline xs[i] = v for word-strided narrow Int elements (cff7e63)
- CSE slice header loads across element stores; skip the null guard behind a bounds test (ba48e3b)
- x64: one mul for umulHi(a, b) beside a * b on the same operands (4e43ee5)
- x64: add of a constant into another register is one lea (047f3b8)
- x64: a spilled param read right after the entry binding uses its incoming register (95b0d44)
- x64: selfcheck the entry-binding register forwarding and its refusals (940616e)
- jumpchain: forward through a block whose params are bound on the edge into it (910f80b)
- codegen: branch past forwarders whose jump arguments are already in place (cd9ff82)
- x64: sub of a constant into another register is one lea (a2307cc)
- x64: refuse the argument-register forward at a safepoint or asm position (ce07c71)
Standard library
- crypto: Ed25519 sign and verify on preallocated field elements (f811601)
- std/crypto: RSA private op and modexp on a fixed-width Montgomery workspace (6c422f2)
- std/crypto: R^2 in five squarings after ~k doublings; skip the reduce for an in-range public base (982dd97)
- std/crypto: 4-bit fixed-window constant-time Montgomery exponentiation (874cb70)
- crypto: Ed25519 sign and verify on preallocated field elements (1592f31)
- std/net gen_idna: one two-stage table of 8-byte records instead of hex tables searched per probe (100479a)
- std/net idna: check an ASCII label in place and decode a label's runes in one allocation (b5ddd17)
- std/smtp: delivery status notifications (RFC 3461): Envelope.dsn with NOTIFY, RET, ENVID, ORCPT (d3e7728)
- std/smtp: Dsn.notify is a list of Notify, and Message carries a dsn (3152b4f)
Tests
- Add umulHi builtin and std/math mul64; field25519 multiply on 128-bit products (51c9c4d)
- Add umulHi builtin and std/math mul64; field25519 multiply on 128-bit products (a160d71)
- optstrbox: follow call words through block params and passthrough args (35edd86)
- gcretention: re-derive the builder_min512 pin after the 0.37.0 stage0 repin (3076646)
- golden census: dRun 645, re-derived off disk after merging into (47c32d5)
- golden census: 644 run cases after merging main into task-7182 (8ae0297)
- optstrbox: reuse a box whose word 2 is a box of the same words (5867a63)
- optstrbox: ask every method a call_iface can land on before refusing its re-box (868faaa)
- optstrbox, optinlinecost: price the return reuse diamond as the ret it is (786e6c8)
- Startup-initializer failure message names the module-relative file, not the host path (1bc39fd)
- optstrbox: move the call half of the reuse question into optstrboxcall.bit; golden census 645 (a4a7fbe)
- golden census: dRun 646, re-derived off disk after merging and (43c22d1)
- constimmfold: re-derive the x86-64 twoFolds pin for the lea form selects (e5f54ce)
Documentation
- auth: Have I Been Pwned range check as the built-in BreachCheck (7d5eed1)
- pkg/web: SessionStore index, destroyIndexed and Session.index (eb8d60f)
- pkg/toml: no KeyPath for an undotted key, no WTable or Option box per frame (5850498)
- authz: register
@tableclasses as resources by class name, the all marker, resourceRef, resourceByName, fieldType (38cf146) - pkg/mail: open(url, Options) with the SMTP transport: smtps://, smtp:// with required STARTTLS, ?tls=off (e203d0b)
Build and tooling
- Repin stage0 to v0.37.0 (5941c46)
- scripts: retire every declared oracle-lag signature at the 0.37.0 pin (295ab6c)
- tools/genunicode idnaemit: assert the out-of-range record is record 0 instead of discarding its index (c7e81bd)
Benchmarks
Artifacts
Published for aarch64-linux, aarch64-macos, x86_64-linux and x86_64-windows.
See dist/README.md for the full target table, the archive layout,
the required BIT_STDLIB/BIT_LIBBITRT environment, and the
SHA256SUMS format.
Verify a download before running it:
sha256sum --check --ignore-missing SHA256SUMS # shasum -a 256 on macOSFull commit log: v0.37.0..HEAD
Bit 0.37.0
Bit 0.37.0
Breaking changes
- A fallible function returns its error as its last return word on aarch64-macos, aarch64-linux and x86_64-linux (
runtime/ABI.mdsection 13). On the arm64 probe a!call costs 53.2 instructions and 7.8 cycles, from 134.3 and 19.2. std/smtp:Client.authPlainandClient.authLoginare removed; callClient.auth(Auth.Plain(user, pass))orAuth.Login. Every fallible call fails with a typedSmtpErrorthat carries the reply code, the enhanced status andtransient().Client.sendtakes aSendableand returns aDelivery, and a partly refused recipient list still delivers to the accepted ones.std/jwt:signtakes optionaltypandkid.std/http:requestWithStreamingBodytakes a typedStreamBody.std/xml:XmlErrorKindgainsNameTooLongandBadEncoding.- The checker refuses
catchon a non-fallible operand (E0188). - An import of a
std/or package module no longer loads that module's.test.bitfiles; they load for the module under test and its./imports.
Highlights
- Interfaces may require fields, satisfied by a class's own field.
string(rune),string([]rune)and[]rune(s)convert between UTF-8 text and runes.- Payload-free enums get
__variantName(),__variants()and__variantAt(i). - A
Where<T>literal is checked againstT: operators,and/or/notandrelated(...).std/whereholdsOp,JoinandClause. - A slice, map or
[]T(n)literal of constants is a legal class field default. std/cbor: an RFC 8949 decoder and a deterministic encoder.std/crypto: COSE_Key parsing and verification (ES256, ES384, EdDSA, RS256, PS256) and PKCS#8 Ed25519 private keys.std/xml: an element tree with namespaces, Exclusive XML Canonicalization 1.0 and XML-DSig verification.std/strings:normalizeandisNormalizedfor NFC, NFD, NFKC and NFKD (20034 of 20034 UCD 17.0.0 NormalizationTest rows pass) and Punycode.std/net:idnaToAscii,idnaToUnicodeandlookupTxt.std/hash:xxhash64,xxh3,xxh3x128and their streaming hashers; CRC-32C and CRC-32 by CPU instruction on arm64 and CRC-32C on x86-64.std/smtp: typedAuthwith XOAUTH2 and OAUTHBEARER, inline and alternative parts, RFC 2231 and RFC 2047 encoding,Options.timeout, and the RFC 9422LIMITSextension.std/http: package-level calls share one process-wide connection pool;Server.shutdowncloses idle keep-alive connections.- A spawn reuses a retired task block and its stack: 0.005 memory syscalls per spawn on aarch64-linux, from 7.0.
- Interface calls carry a per-site inline cache.
Compiler
- Return a fallible enum ok value in words so for x of it? does not box next()'s Option (de352fa)
- compiler: move lowerArgs, methodParamTypes, lowerArgsRest, lowerArgsFor from lower.bit to lowercall.bit (5ec7d3c)
- compiler: BIT_ERR_REG, plain free fallible functions return the error as the last ret word (d2158ed)
- compiler: split the trampoline's result words out of fnValueTrampoline; lint the errword case (ed49822)
- compiler: a ret-less body is unknown to the result-word check; a fall-off ret carries zero ok words (a251abe)
- x64: bind an Op.CallValue's CallWord run in one parallel move (xEmitCallValueWords) (5f160da)
- x64: move the CallValue dispatch decision into xEmitCallValueInst (keeps xEmitInstOps6 at complexity 10) (63324e0)
- compiler: BIT_ERR_REG, startup init bodies, the fallible main wrapper and the fn-value trampoline take the error word (c6c2736)
- compiler: BIT_ERR_REG, every declared fallible function (methods, generic instances) returns the error word and the static, generic and interface call producers bind it (4275045)
- codegen: write a multi-word ret's constant words straight into their return registers (3b0fc7c)
- regalloc: a constant every use folds takes no register (6f412a1)
- x64: zero a multi-word ret word with xor r32 instead of mov r64, 0 (ec5efab)
- compiler: BIT_ERR_REG, closures, Op.CallValue and both func-value trampolines carry the error word (cf261eb)
- BIT_ERR_REG: drop the dual publish and the err_get fallback, forward the flag through x64gate.sh (8b21bb3)
- project: load a std/ or package import without its .test.bit files; test files stay only for the module under test and its ./ imports (f618622)
- Flip BIT_ERR_REG on by default, pin it off for the IR differentials, document the error word in ABI.md section 13 (eb2e934)
- bit test: keep the keepalive edges on test declaration bodies (9e5a404)
- compiler: a fallible function's error path returns nil for a boxed-enum or array ok value instead of allocating its zero (ceadec7)
- compiler: emit __variantName/__variants only when a call reaches them (fad39ec)
- compiler: hide __-prefixed synthesized members from bit doc and member completion (a2361a7)
- lsp: member completion skips __-prefixed synthesized members (6452b9a)
- lsp: replay the loader's own file stage when judging a cached project fresh (b701729)
- compiler: build every IrFunc through irFuncFromBuilder/irFuncRebuilt/irFuncRenamed so keepAlive cannot be dropped (534191c)
- compiler: check Where literal operator objects, and/or/not keys and related(...) values (caa4735)
- compiler: interfaces may require fields, satisfied structurally by a class's own field (4af3d0c)
- enumvariants: type the __variantAt result with the enum name, keep synthesized calls out of --dump-types (4a6a19e)
- compiler: split lowerConvert's value-changing arms into lowerConvertValue (complexity 11 -> under 10 after ) (e5e0dd2)
- WIP: LICM refuses a wide const only inside an inner loop range, not the whole nest (f654533)
- arm64 hoists a nest's outer-body wide constant; a spilled threaded-constant parameter is recomputed, not reloaded (1305be3)
- x64: encode group-1 ALU immediates as 83 /digit ib when they fit a signed byte (15a7bba)
- Implement the UTF-8 rune conversions string(rune), string([]rune), []rune(s) (879105c)
- arm64: move compileFunction's remat marking into markArm64Remat (94fce18)
- LICM: licmPlanFor takes the LicmCtx, built by licmCtxFor (d6c88a0)
- regalloc: split widenRoot out of mergeAliases (6e6c62d)
- call_iface: per-site monomorphic inline cache (cc4a3b8)
- Split call_iface emission into arm64calliface.bit; fix a drifted ABI.md citation (b12a0a2)
- call_iface emitters take the IrInstr, not its four fields (d3d5323)
- x64callcheck: pin the cell loads' disp32 form (3a1411c)
- compiler: thread a fallible enum's ok words through
?andcatch(19bbaa6) - compiler: return a generic instance's result in words (1f56346)
- Synthesize __field(name): Option for interface-demanded by-name field reads; pkg/authz attributeOf uses it (1363944)
- x64: encode rsp add/sub as 83 /digit ib when the immediate fits a signed byte (7184ee0)
- Renumber blocks into emission order under --no-optimize; gate bench/cases with it (222cb86)
- LICM: keep a constant divisor in the loop body on every target (a0e60d2)
- call_iface: a bound cell's miss calls bit_rt_iface_lookup from the site (bd4d308)
- compiler: move cachedModuleTree out of project.bit into projectparsecache.bit (9e019e8)
- lsp: reuse the parsed tree of a module synthesis rewrote (6f07936)
- Order std/json ahead of __field class modules by renumbering after one load, not a second project load (b8b74ea)
Runtime
- std/hash: CRC-32C and CRC-32 by CPU instruction on arm64, CRC-32C on x86-64 SSE4.2 (3d59a87)
- runtime/sched: retake a worker blocked in a syscall bracket via the monitor thread (23af4e0)
- runtime: reuse retired task blocks and their guarded stacks (ace55ee)
- runtime: refuse out-of-range BIT_* env knobs at boot instead of clamping or looping (d0cf087)
- runtime/darwin: move guarded-stack mapping and the task-block cache to taskstack.bit; split trimStackSlop out of mapGuardedStack (dc2f3a8)
- runtime/gc: keep the alloc-cache home hit at the length; walk past a held home out of line (2b12d1b)
- runtime/gc: emit the alloc-cache walk last in its module so it moves no gc function (7bd8d64)
- std/net: lookupTxt(name) through the runtime resolver (11bcdbe)
Standard library
- std/http: parse [v6]:port hosts in URLs and write the brackets in Host (6dc5474)
- std/hash: add xxHash64 one-shot and streaming Xxhash64 (9b93628)
- std/hash: add xxh3_64 for inputs up to 240 bytes (1fea054)
- std/os homeDir, std/net isIpv4Literal/isIpv6Literal (632e423)
- std/hash: xxh3 long-input path and streaming Xxh3 (f14fa96)
- std/http: package-level calls share one process-wide pool, keyed by TLS config (daa05b4)
- std/http tests: refuse the over-budget post on its own connection (aa7fa11)
- std/http: format tlsScope (d2e2ea8)
- std/hash: xxh3x128 and streaming Xxh3x128, sharing the XXH3-64 long path (7cc0fe8)
- std/http: tlsScope hashes the client TlsConfig fields that exist after ; streamed requests key the pool with their extras (4691b0f)
- std/xml: name length limit, UTF-8 and Char validation (52ea4a2)
- std/hash: read 8-byte lanes with loadU64 in xxhash64, crc64nvme and XXH3 (0a90b91)
- std/xml: element tree (parse, Element, Node, child/children/text/attr) with namespaces (5993f5c)
- http: Server.shutdown closes keep-alive connections idling between requests (51eddd8)
- std/hash: crc64nvme lookups from eight [256]u64 tables, no bounds checks (3eade62)
- std/hash: xxhash64 tail reads its 8-byte lanes off one checked base pointer (4e0dd33)
- std/hash: XXH3 stripe kernel takes the core, five parameters (11d3640)
- net test: bound deadline-armed exchanges by a same-run no-deadline control, not 250 ms of wall clock (b1350a1)
- std/hash: slicing-by-8 with one 8-byte load per block for CRC-32C and CRC-32 (f786a8b)
- std/hash, runtime/cryptohw: bit fmt the CRC files (f012102)
- std/http: find the header terminator with a Horspool skip loop (7369e84)
- std/hash: three interleaved CRC strea...
Bit 0.36.0
Bit 0.36.0
Breaking changes
- The standard library's
newXfactory functions are gone. Construct by the class name:Sha256(),Mutex(),Builder(),Sampler(ratio),Tracer(...). std/crypto:hmac,hkdf,pbkdf2and the signers take aHashAlgvalue.std/tls:TlsConfigis the client config;listentakes aTlsServerConfig.- The checker refuses an unhandled fallible call, a non-bool condition, and
deferorspawnof a fallible call (E0190). std/httprefuses HTTP/1 header lines with whitespace before the colon, obs-fold, an empty name or a bare control byte, and refuses h2 and h3 requests whose fields would inject header lines.- Packages released with this version use constructors in place of their
newXfactories: web 0.9, auth 0.4, orm 0.3, jobs 0.3, redis 0.3, s3 0.2, yaml 0.2.
Highlights
for x of it? { }iterates anext(): Option<T>!iterable and returns a failednext()from the enclosing function.spawn { ... }anddefer { ... }take a block.- A
Tis accepted where anOption<T>is expected. - Module-level
letcells hold objects, filled at startup. std/hash: CRC-32 and CRC-64/NVME.std/time: RFC 3339, epoch seconds and HTTP-date.std/xml: a bounded pull tokenizer and a validating writer.std/http: streamed request and response bodies.fibruns in 985.6M cycles, from 1021.1M on 0.35.0 (bench/RESULTS.md).- An idle program no longer spins the scheduler: 6,000 trace events in place of 400,000 to 610,000 for 1,000 timer waits.
Compiler
- compiler: package workspace, pkg/bit.work resolves member deps from the tree (21df84e)
- Collector: scan traced module let cells as roots through a per-program table (d03f54a)
- Startup initializers run on rooted cells: drop the traced-cell refusals (ffd40c9)
- Lower module-level decimal cells at their real 16-byte size (9dcc035)
- Startup initializers fill array-typed module cells by element copy (336b660)
- Delete BIT_CONST_STRING_FOLD, BIT_MAP_PRESENCE and BIT_STRBOX_JOIN (23267cd)
- codegenlive: hold every call-word interval to the end of its run (f2c4645)
- regalloc: a plain call's last-use argument may take a caller-saved register (ba4b8a3)
- Make decimal a real slice, array and map element (37d5f7b)
- codegen: fold x == nil / x != nil as a compare against 0 (cbz/cbnz, testq) (994ead6)
- spawn and defer take a block or a closure call:
spawn { ... },defer { ... }(ae1a4dc) - for x of it? over a next(): Option! iterable (4362a50)
- arm64: bind an Op.CallValue's Op.CallWord run in one parallel move (84fa9e7)
- Install executables by write-temp-plus-rename, never in place (7883e39)
- fmt: keep parens on a spawn/defer operand that would open with '{', format check_forof_try_infallible (f1b3aa7)
- arm64: restore callee-saved GPRs one ldr each, never an ldp (ea04577)
- selfcheck: check the unpaired epilogue restore in its own function (2954f12)
Runtime
- Remove private tool, workspace-path and owner-hostname tokens from tracked files; scan them repo-wide (4aff3af)
- gcmarkpar: count a late wake from the notify completing, not from gcMkDone (5a673a0)
- runtime/sched: take the poller token before an idle drain (7e7526e)
Standard library
- stdlib/crypto: replace the newX factories with constructors called by the class name (2a43171)
- stdlib sync/time/strings/rand/metrics/sql: replace the 13 newX factories with constructors (89ce8e5)
- stdlib: call sites of the removed sync/time/strings/rand/metrics/sql newX factories use the constructors (7f68a61)
- std/crypto: hmac, hkdf, pbkdf2 and the signers take a HashAlg value (3ccbf0f)
- std/tls, std/quic: the key schedule takes the suite's HashAlg (16bf39d)
- std/tls: TlsConfig is the client config, listen takes a TlsServerConfig (d4502e2)
- std/trace: Sampler(ratio), Tracer(...), TraceId.random() and SpanId.random() replace the newX factories (17ebd5b)
- std/trace: export TraceId.hi, TraceId.lo and SpanId.value so callers can read the id (15ae906)
- Add CRC-32 (IEEE 802.3, reflected 0xEDB88320) to std/hash (4add5f8)
- std/time: parseHttpDate and formatHttpDate, RFC 9110 HTTP-date (123cd8a)
- stdlib/xml: pull tokenizer core, DOCTYPE refused, bounded depth, attributes and input (0b7ba12)
- stdlib/xml: Writer with escaping, name and character validation, and namespace checks (83adaa2)
- std/http: BodyReader and Client.send(req, stream = true) with the status before the body (7e9d555)
- std/http: refuse differing Content-Length fields and Content-Length with Transfer-Encoding in every reader (c3a5947)
- std/http: a streamed response's connection returns to the pool only after a full read (e8aa3fe)
- std/http: reject whitespace before the colon, obs-fold, empty field names and bare controls in every HTTP/1 header parser (4319eb4)
- std/http: refuse h2 and h3 requests whose fields would inject header lines (ed8db37)
- quic: acceptStream hands out streams the peer already opened before reporting closed (6309bf8)
- std/http: check h2/h3 peer request fields while copying them into the block (f969b71)
- Add CRC-64/NVME to std/hash (crc64nvme, crc64nvmeUpdate), slicing-by-8 (1cb396a)
- std/time: parseRfc3339 and parseEpochSeconds (ae38eaf)
Tests
- checker: a const fixes the binding, not the object it holds (b0f211c)
- docs: neutralize private repo and host names; test-docs rejects them (05160ba)
- stdlib tls/quic: replace the 8 newX factories with constructors (50bdaac)
- Neutralize private names in tracked text and scan every tracked text file for them (d67ca2d)
- stwcollect: add phase K, the ROOT CLASS 11 case for traced module let cells (9c67672)
- Refuse a module cell with no zero value and no initializer (af8504f)
- Lower compound assignment on a decimal through the two-word arithmetic (0c6ce9e)
- tests, examples, bench, tools, scripts: use the constructors in place of the removed std newX factories (f5e5b2d)
- releasesurface: allowlist the HashAlg signature changes in std/crypto, std/tls, std/quic (0c3f0a8)
- releasesurface: reword the allowlist comment (de7d89e)
- checker: seed an arrow argument's expected type from a class init's parameters (e77abce)
- Accept T where Option is expected and lower it as Some(v) (ba1425e)
- golden and checkerdiag census: re-derive after the merges (run 612, checker cases 288) (51e9624)
- lower: scope a body's checker rebinds to that body (b3ca015)
- Checker: refuse an unhandled fallible call and a non-bool condition (67410fc)
- Re-point the SPEC.md line citations the §13.1 and §18.3 additions shifted (c8b7f25)
- Refuse a function-local const with no initializer (7f5722a)
- Copy a long startup array cell with a counted loop (1eaac7d)
- tests/imports/quictls: split quicE2E so it fits the 80-line limit (19da53c)
- tests/cases/run_option_lift_arg: bit fmt (d09212f)
- checker: refuse defer/spawn of a fallible call with E0190 (43807e2)
- benchgate: move the CPU verdict (wasDescheduled, checkCpu, cpuReport) to benchhost.bit (c04e1c2)
- Move the three decimal checker-refusal fixtures to tests/bit/checkercases (c5cfcf1)
- Add test-oraclelag and move six run fixtures the pinned oracle cannot build out of tests/cases (cfc8206)
- stripMine: rebind the header's ids to OUTER's after OLATCH; verify SSA dominance (4f10008)
- benchgate: judge user CPU against a host-speed reference workload (6f03eca)
- Repoint the match-binder-arity citations to spec/SPEC.md:4633 after grew the spec (3ff2b62)
- Move run_strip_exit_header_{const,param} to tests/bit/oraclelag: pinned 0.35.0 lacks the fix (ebc1191)
- pkg/s3: SigV4 signer signs every header except the unsignable set, S3 path encoding, header normalisation (e314af2)
- stress: chantimerwake and chantimerresetwake confirm a timing-only overshoot with one fresh pass (17ae7fb)
- pollfree: list schedPollerDrain as a reviewed exception (5903425)
Documentation
- docs/stdlib/crypto: restore the blake2b one-shot section, which is 64 bytes (4cf2327)
- pkg: call sites of the removed std newX factories use the constructors (e65fb2b)
- docs: stdlib sync/time/strings/rand/metrics/sql pages and book examples document the constructors (6389285)
- pkg/auth, pkg/postgres, pkg/s3, pkg/web: call hmac/pbkdf2 with HashAlg (7ec7d2a)
- pkg/yaml: AnchorTable() replaces newAnchorTable; install line names 0.2.0 (f08548a)
- pkg/redis: Batch() replaces newBatch; install line names 0.3.0 (4fff255)
- pkg/s3: Client(cfg) replaces newClient; install line names 0.2.0 (3ca94c2)
- pkg/orm: Logger(sink, options) replaces newLogger and newLoggerWithOptions (c0fa5b1)
- pkg/jobs: PostgresStore(db) and PostgresLocker(db, keep) replace the newX factories (63ef4d6)
- pkg/web: Ctx(...), Stream(...), SSE(c) constructors and randomSessionId() replace newCtx, newStream, newSSE, newSessionId (317ede0)
- pkg/auth: PasswordStrategy(lookup), OidcStrategy(OidcSource, ...), JwksCache(uri, tls, JwksSource) replace the newX factories (d8d9550)
- pkg/web: README install line names 0.9.0 (3360030)
- Keep auth's web requirement at ^0.8.0 until web 0.9.0 is tagged; docs/stdlib/trace.md examples are not main (ffdca8a)
- Inkwell and the Bit Book: BearerStrategy(secret), randomToken() and randomId() replace newBearerStrategy, newOpaqueToken and newId (73ae007)
- docs/stdlib: handle the write errors the io and os examples dropped (b95889c)
- docs/stdlib/xml: wrap the Writer examples to canonical width (a7bcef3)
- pkg/orm schema.test: the live tsvector proof calls the fallible Rows.next() with ? (5034009)
- Document for x of it? and the next() iterator protocol (d120428)
- pkg/orm sync live test: one scratch program, not three cold compiles (a66c551)
- pkg: auth requires web ^0.9.0, orm pins postgres 0.1.3 and mysql 0.2.2; install lines name the 0.36 package releases (5be03fa)
- web guide 10: the auth install line names auth 0.4...
Bit 0.35.0
Bit 0.35.0
Breaking
- std/http, std/http2, std/http3 and std/smtp construct through constructors, not
newXfunctions:Client(),Client(tls = cfg),Encoder(...),Decoder(...),Transport(...),Request(...),Response(...),Message(...),Attachment(...),Options(...),ByteStream(...). The 18newXfunctions are removed. - std/http2
Conn.roundTripandroundTripStreamtake an optionaldeadlineNsper request. - Spec §11.11: a module-level
letorconstmay run a non-constant initializer at startup, beforemain, in import order. A failing initializer exits with code 3. Assigning a moduleconstis E0185;x++,x--and tuple-pattern writes to a localconstare E0062.
Highlights
- std/http
Clientkeeps a keep-alive pool per origin, shares one HTTP/2 connection per origin with multiplexed streams, and caps connections per host (PoolLimits.maxConnsPerHost). 10000 sequential requests: 1 connection instead of 10000, about 3x the requests per second. - The scheduler's monitor parks while no task runs: an idle server goes from 465 wakeups per second to 0. Windows now starts the monitor, so CPU-bound tasks are preempted on Windows too.
- pkg/toml indexes wide tables: config.toml parses with 21.8% fewer cycles, a 1024-key table with 82% fewer.
- The garbage collector runs up to 3 helper threads during a collection on heaps of 8 MiB and up (toml, yaml and json parses about 13-15% faster in wall time), and helpers no longer pay a stack check per marked object.
- x86-64: a float live across an
asmblock that calls is preserved; it was overwritten. - A stop-the-world that times out on one thread retries as soon as that thread responds.
Compiler
- asm clobber: a named caller-saved register is a clobber point at the block, not a whole-function exclusion (0e62bfe)
- checker: judge argument types of a method's own-type-parameter calls (0488ffc)
- x64 asm clobbers: exclusion and point sets are convention-independent (0e3be22)
- checker: a generic method's own type parameter that nothing binds is E0068 (352e456)
- compiler: prologues zero every frame word not written before the first scan point (346c3fd)
- arm64 prologue: pair the first zero word with the last saved GPR (3fec0fd)
- bit fmt: keep the parens a catch operand, a loop iterable, an arrow body and a < operand need; add test-fmt-prec-matrix (16faa5b)
- bit fmt: wrap a for-of iterable only when it ends in 'catch IDENT'; format fmtwrap.bit (efd6c30)
- Make a write through a stale kidsOf view impossible (7b88844)
- Track a variadic parameter's rows through the relation proof (89f90f6)
- parser: move the import-declaration parsers out of parsertype.bit into parserimport.bit (bf6dd0e)
- x64: rematerialize spilled integer constants, sharing arm64's remat predicate (c38a7ef)
- optloopcand: cite isRematConst in regallocremat.bit, where moved it (b889561)
- x64compile: cite the loop-weighted rank, the rule on main, where the remat mark's comment named the (8ce49fd)
- Resolve a member call on a type parameter against every bound of its & list (0856aa7)
- Judge a generic class's type-parameter bounds at a written instantiation (E0051); infer a bare class literal's arguments from its fields and sibling bounds (6b73fdf)
- Type every bare generic class literal in checkCompositeLitType: a declared target pins it, else its fields and sibling bounds infer it, else E0068 (b2bc231)
- opt: fold len and the null guard of a string literal threaded through a loop (7f13bae)
- x64align: align every loop header to 32 bytes (085eb5f)
- opt: hoist the data pointer of a string literal out of a loop (c29d5c3)
- opt: BIT_CONST_STRING_FOLD pins the fold off for the post-opt IR differential (ebdbfc0)
- opt: BIT_CONST_STRING_FOLD also gates the literal-pointer hoist (dc9007a)
- Win64: save the nonvolatile XMMs a function can write, all 128 bits, including xmm14/xmm15 (c952e0f)
- x64align: pad jumps with CS prefixes on the preceding instructions before NOPs (db569bc)
- x64align: bind xPadJump's unused result in xPadJumpCx (772c413)
- Split constStringSources under complexity 10; size the stress module bound for growth (3f90daf)
- x64: store an imm32 constant to a frame word with one C7 /0 instead of mov r11 + store (120fd6e)
- x64: zero the Win64 home area at each call; pair prologue zero stores into movups (6dd06ff)
- x64align: prefix setcc/movzx/SSE forms and take a poll-only back edge on the poll's je (191eca2)
- optstrbox: admit a literal's const_int len word as its own handle (2df66f7)
- optstrbox: gate the join-param box reuse behind BIT_STRBOX_JOIN (f882821)
Runtime
- schedSwitch: arm64 keeps its original clobber list; document why x64 names r8/r9 (37a0d30)
- sched: clear the resumed context in one block, from the resumer's
new(2f7d137) - sched: x64 clears the words its switch saves; P5 fills every saved register (af90976)
- sched: schedSwitchAway's comment states what the *new == sp check cannot see (c7cf1f5)
- sched: schedSwitchAway traps a resume from a copy of the task's block (5f12231)
- runtime/stw: bit_rt_safepoint zeroes every SafepointFrame word it does not store (eb903ea)
- runtime/sched: count a timer producer that did not claim an armed worker 0 (d4b4b38)
- Bound the world-stop retry by wall time, name the stuck slot once, hold the next attempt off (2427963)
- runtime/sched: trace a channel timer's wake and attribute a late one to the OS (8bf2978)
- runtime/sched/linux: rundelay picks openat by onX64() and stores the fd plus one, so fd 0 is not reopened per call (faf2694)
- runtime/sched/linux: open the schedstat descriptor O_CLOEXEC (9f990f0)
- runtime/gc: sweep a bitmap word in registers, no call per slot (61be377)
- runtime/sched: the poller cell is a token, schedPollerArm is a CAS take that reports whether it won (70f680e)
- runtime/root: drop the wkId import bootworker no longer uses (ce9bf19)
- runtime/windows: any idle worker takes the poller token and blocks in the completion port (2939223)
- gc: GC-only mark/sweep helper threads for a pool that has none (03774b6)
- gc: cap GC-only helpers at three (f4839ed)
- gc: end the STW retry hold-off when the stuck slot answers; bracket parkdarwin's kernel waits (d2dfa78)
- runtime/sched: park sysmon while no task is in flight (7fabf95)
- gc: an idle mark member sleeps on a work word after a bounded spin (1afaa23)
- stwhelper: rename the stwHelpersWanted local 'cap' to 'gang' (E0048) (b19de68)
- gc: probe the stack once per mark join, not once per marked object (3f4197c)
- windows: start a sysmon thread so compute-bound green tasks are preempted (8fb2e65)
- gc: count mark sleeps that time out after termination, report latewakes= and fail the stress gate on it (3829844)
Standard library
- stdlib/http: headerBlockScan agrees with a plain byte loop at every length, position and address alignment (a17b5ae)
- stdlib/http: the real-header-blocks agreement test asserts every address residue was exercised, instead of discarding it (E0215) (5ae9ef4)
- std/http: follow redirects safely by default, one typed Redirects policy (dc6b54f)
- std/http client: HTTP/1.1 keep-alive idle pool per Client (31b79a8)
- std/http: one shared h2 connection per origin, requests multiplexed as streams (f85a541)
- http: PoolLimits.maxConnsPerHost caps HTTP/1.1 connections open per origin (bc12d7e)
- stdlib http/http2/http3/smtp: replace the 18 newX factories with constructors (daa9c32)
Tests
- sched stress: P6 probe, nothing lives in a caller-saved register across schedSwitch (f55c276)
- checker, lowerer: support a static call through a namespace-qualified class (99bdc60)
- test-no-warnings: check the dependency-resolving units in generated scratch projects, not exempt (b4028b8)
- checker: judge T.name when T is a type name, and a namespace-qualified type used as a value (e001f83)
- re-point SPEC.md:4358 to 4379; delete the paid E0203 compiler/check.bit lint-debt entry (fdbb172)
- checker: E0058 for static-method type arguments, trait member types, a bare generic interface bound and an imported alias (befef0f)
- Add test-call-shapes: receiver x callee x argument shape matrix, bit check and bit build must agree (b8230c4)
- callshapes: rename mainText so test-no-warnings does not read cells.bit as a second program (1608834)
- callshapes: re-derive known.bit on main 22a1781: fixed 234 cells and all 54, 108 still disagree (0c7f8e1)
- gates: test-relation-shapes, a generated matrix of every way a row reaches a relation read (09ec16f)
- stress/sched: bind main's unused dqPushBottom result to _ (lint unused-binding, found under ) (ce6c432)
- lowerIf: lower && / (| conditions as a branch chain behind BIT_IF_BRANCHCHAIN, default off (#5926)|82e44a2ae)
- chantimerwake/chantimerresetwake judge the timer against a plain OS sleep of the same run (762f21f)
- fix: the auto-load splice wrote the new receiver through a stale kidsOf view (3e80017)
- golden census: dRun 596, and each added one run case against 594 and merged to the same 595 (d86cac2)
- Thread the live locals through the && / (| and ?: joins and the if-chain exits when a catch in the rhs/arm reassigns one (#6415)|676f252cc)
- gcretention: stale_min512 pins that a dead frame's spills root nothing (b70a47a)
- golden census: dRun 597, the run case merged onto the 596 as a clean 596 (5744318)
- T(...) through a type parameter is E0184, and lowering refuses it (3d35e07)
- netdnsfallback: bracket the stub's kernel waits and print the cause on failure (69f7521)
- Relations: the proof walks test blocks and parameter defaults like function bodies (9b78a90)
- checkercases: test_block keeps the bound catch variable the first test uses (11e8b1d)
- checkercases: re-point the two SPEC.md:4413 citations after the 3-line section 10.5 addition (0bb6dd4)
- Generic interface bounds: fn f<S: ...
Bit 0.34.0
Bit 0.34.0
Breaking changes
- The compiler rejects programs it used to accept:
- E0058: a wrong number of type arguments at any type position (
let x: Pair<i64>,Plain<i64>{...}), and an explicit type-argument list on a call whose length does not match the function. - E0050, E0041, E0063: wrong positional arguments to a static method call.
- E0300: reading a relation field the compiler cannot prove was loaded. The error names where to add
.with("rel").
- E0058: a wrong number of type arguments at any type position (
fromis a contextual keyword. It can be used as an ordinary name everywhere except inimport ... from.pkg/orm0.2.0:db.table<T>()repositories;- Laravel-style migrations (
Migration,Schema, batchmigrate/rollback); orderBy(column, Dir.Desc);- relations that load themselves.
pkg/kv0.2.0:open(path)andstore.collection<T>().pkg/jobs0.2.0: theLockerinterface has two new methods,window()andserverNowNs().
Highlights
- Named arguments work in every call shape, including generic functions, generic methods, static methods called through a written instantiation, and generic interface values.
- Generic class constructors:
Pair<i64, string>(7, "s")builds the instantiation, andPair(7, "s")infers the type arguments.- Static methods work through the bare class name (
Pair.make(7, "s")).
pkg/jobscron scheduling (q.schedule("0 2 * * *", Job{}, missed = Missed.RunOnce, tz = "America/New_York"),q.every(15 * Minute, Job{})):- a tick is missed only when it is over a minute late, and every dropped tick is logged;
- daylight-saving transitions follow Vixie cron's rules;
- catch-up work is bounded however far behind the schedule is;
- a wall clock stepped backwards re-anchors the schedule;
- an instance whose clock disagrees with the database clock fires nothing;
- bad options and
RunAllcaps fail at registration.
std/timeapplies each zone's TZif footer rule after the last listed transition, so daylight saving continues past 2037.zone()rejects a footer that contradicts the zone's last transition.- Runtime: a resumed task's saved registers are cleared, so the GC no longer keeps garbage alive through them.
std/http:readMessageallocates 4 objects per request instead of 6.pkg/yaml:- duplicate detection for collection keys takes amortised constant time (20,000 keys: 56.6G to 1.14G instructions);
- alias-repeated bytes count against
maxDocumentBytes.
- Package commands:
bit <words>runs a package'scmd/<words>/main.bit.
Fixes
- fix: honor a defaulted parameter on a generic class's method (b0c35b4)
Compiler
- Delete BIT_GENERIC_EXPLODE, BIT_DCE_PARAMS and BIT_DCE_METHODS (b1b8f04)
- optappendfield: a call_iface is calm when every method its id reaches is; pow joins the local runtime calls (ea2c060)
- optappendown: the first store of a rule 2 chain on an owned field is no escape; extendKeyPath's second path.rest append runs in place under BIT_APPEND_FRESH (c090a29)
@jsonclass needs no import from std/json (E0142 default-retired) (4c205d2)- Integrate with: table-row errors are E0178/E0179 (E0174/E0175 belong to
@collection) (f899ef9) - compiler: lower a synthesized static (__collectionName/__tableName/__fromRow/__columns/__values) only when reached (63aa1eb)
- compiler/lower*.bit: a deferred synth static reserves no FuncId (cd6286e)
- pm: resolve a local-path dependency's own local dependencies transitively (635ac87)
- lowermethodtable.bit: follow moduleReservedCount and emitStaticMethodCall to their files (7b096d4)
- jsonDecode resolves when T is a generic class's own type parameter (e53646e)
- orm: fix relation synthesis to survive isolated
@tablefixtures (b51ee48) - Prune __tableAttrs and __loadRelation like the other synthesized statics; checkerdiag count note shortened under the file limit (dfd16e8)
- Fix catch binder mistyped as generic error on a this-rooted method call (f78822c)
- R1: auto .with() for same-function relation reads (e2e4cae)
- Add internal lockRoot to loadProjectCached/buildIr (5abee72)
- Bundle buildIr's option flags into BuildOpts (bd22020)
- bundle vStmt's (result, brk, loop, fallibleTy) into VCtx, drop validatestmt.bit's E0202 debt (87f4aa8)
- R2: relation auto-loading follows rows across function parameters and return values (04498a9)
- M1b: package-command dispatch, cmd//main.bit is
bit <words>(d17f472) - Fix the pre-push reds: format pkgcmd files, inline clicmd's 7-param helper, drop a private path and an em dash from orm's migrate doc, declare 6045-closure-tuple-oracle-declines (fe3f158)
- relation auto-loading follows rows across module boundaries and named arguments (R2b) (c590cd3)
- drop .claude/ path citations from two R1 header comments (440f67e)
- orm: create
@manyToManyjoin tables via synchronize (f03a9a1) - fix: register JoinDesc synth words, tolerate a class with no __manyToManyJoins, format+doc it (3180cc5)
- listBitFiles: skip a directory whose name ends in .bit (7d1bbb8)
- fix: trace a match arm's payload binder back to its scrutinee (E0300) (9b607ef)
- relationautoerr.bit: cite SPEC §10.5, not a private note (34be7c5)
- retire E0218 relation-unloaded-read, superseded by E0300 (8fae6f8)
- Repoint comments from the deleted lintrelation.bit to relationfieldread.bit (e7602b8)
- pmfetch: vanity deadline = connect+TLS+HTTP budget + std/net resolveBudgetMs (4ab1a0c)
- compiler: split relationauto.bit, relationautoholder.bit, relationautoerr.bit by responsibility (pure move, ) (4397eb0)
- E0058 at every type position and on explicit call type arguments (1629584)
Runtime
- runtime/net: close the DNS socket fd directly, not through pdOpen-tracked netClose (49e3712)
- runtime/net: parse IPv6 nameservers and walk every resolv.conf entry (2913c3b)
- runtime/net: dial IPv6 nameservers and try every one in order (aacdf52)
- runtime/net: repoint DNS comments at the files that declare the symbols (f999dda)
- net: reset a resolv.conf fd's poll-descriptor state before netReadSock reads it (532d572)
- Rename locals, params and import aliases that shadow predeclared names (E0048) in compiler, runtime, pkg/mysql, pkg/orm (01f5dd2)
- zero a task's saved callee-saved words once it resumes, so class 7 stops rooting a stale context (40086b2)
Standard library
- quic: broadcast loop exit so a stream cmd sent after teardown fails fast (4e7998d)
- std/http: bound the response write with a deadline (b459593)
- fix: pin the migrate/rollback lock's whole locked region to one connection (fedafe7)
- Reword stdlib/sql/desc.bit's plan citation and drop its temporary no-private-path allowlist entry (2a8ef5a)
- std/time: apply the TZif footer rule after the last transition (758dfc8)
- readMessage stores common method/version tokens as literals; optstrbox admits a callee's parameter-passthrough ret (ed931fc)
- time: footer must agree with the last transition; n-form all-year DST (86e2c60)
Tests
- Delete BIT_MAPLIT and BIT_STATIC_METHODS (0b74df6)
- benchgate: follow BIT_GC_MIN_KB's default to runtime/ABI.md:1957 (489f861)
- Fix: close method tables over instantiations minted during lowering (53acd3b)
- declare the 6244-json-attr-implicit-insert oracle-lag signature, add a golden fixture, run test-web-guides-app (3cda774)
- golden census: dRun 560 after and each added a run case (8455e68)
- Format run_generic_iface_late_inst.bit; no em dash in docs/stdlib/json.md (d6a4152)
- Add
@collection("name") class attribute, synthesizing __collectionName (468fb1b) - sqlValue - a plain value as a std/sql Value (7fec04c)
- compiler:
@tablegets static __tableName/__fromRow/__columns + instance __values (4ee362d) - Make
froma contextual keyword (a5c9ac4) - orm: default
idprimary key, compile-time Repo key check, no panics in repo.bit (1234a9e) - fix spec/SPEC.md line-citation drift from the own insertions (test-fmt-citations) (d8fce6e)
- one orm orderBy(column, dir: Dir = Dir.Asc), enum-variant param defaults, Repo column check (97a6c0e)
- compiler: bind Self to the type param, not the interface, in a T.m() static call (ad1f5dd)
- pkg/orm: Repo soft delete and bulk writes,
@timestampsfilled (7f61ea0) - a Value-typed parameter coerces any sqlValue-accepted argument (824be36)
@tableclasses need no std/sql import: E0150 retires like the E0142 (2fdfd5b)- Format check_orm_repo_link_bad_relation.bit (f15cb7d)
- orm:
@belongsTo/@hasOnesingular relation fields satisfy Tabled (edc7b8c) - orm: find() eager-loads with(), after() chains without ? (5cbcebd)
- Fix citations drifted by: SPEC.md:4179 -> 4178; lintrelation.bit's anchor API is gone (e986f4e)
- Widen parameter defaults to any expression, not just literals (669f36f)
- Allow a discarded-statement catch block to fall through without a value (bc930a2)
- Fix catch binder mistyped as generic error on this.field.method() inside init (b1df936)
- Synthesize std/sql's __tables() table registry at the IR level (faf2188)
- Validate arity/types of delete/close/panic/assert call sites (1698458)
- Fix: a fallible closure result never reached lowering unwrapped (d4d15a9)
- move the R2b live fixture out of pkg/orm into tests/ (778fc3b)
- O4: pkg/orm/cmd/migrate/gen.bit + bit migrate live e2e (597a900)
- live-gate harnesses: sweepOrphans no longer kills a peer's live containers (3c0a661)
- allow an identical import repeated across a directory module's files (cec5722)
- Fix: reject an empty []/{} literal against a known non-collection type at check time (4711b25)
- census: dRun 585, re-derived off disk after and each added a run case (d8b6c23)
- O5: bit make migration writes migrations/_.bit (f95fd06)
- fixup: bit fmt tests/bit/noemdash.bit (test-fmt-testsbit was red) (27f08fd)
- R...
Bit 0.33.0
Bit 0.33.0
Breaking changes
appendchecks what you add.append(dst, src)with a whole slicesrcis an error: writeappend(dst, ...src)to add its elements. Adding a value of a different number type, such as anintto a[]byte, is an error: convert it first (byte(v)).std/quicand HTTP/3 (https+h3://) verify the server's certificate against the system trust store by default, asstd/tlsandhttps://already did. To trust a private CA, pass aTlsConfig:dialQuicTls,h3DialTls, orgetTls/requestTls/newClientTlswith anhttps+h3://URL.TlsConfig.serverNamenow overrides the name a QUIC dial checks, as it does for TLS over TCP.
Features
- Map literals
{k: v, ...}, static methods, generic argument explosion and dead-parameter/dead-method elimination are on by default. @jsonclasses andfind<T>row mapping no longer needJson,JsonEntryorRowsimported; any import fromstd/jsonorstd/sqlis enough.jsonSchema<T>()describes classes, enums, optionals, nested and generic types as JSON Schema.bit prof <file.prof>renders astd/profprofile from the installed toolchain; samples outside the program show on their own row.pkg/web0.8.0:App.openApi()renders an OpenAPI 3.1 document from the real route table.pkg/jobs0.1.0: background jobs with@job,register<T>andenqueue<T>.- Documentation: The Bit Book (33 chapters building one app), a single Get started page, and a Tools section on bitlang.org.
Notable fixes
- The macOS monotonic clock could divide by zero when two threads read it for the first time at once (seen under
BIT_GC=stress). - x86_64: an
asmblock's pinned or clobbered callee-saved registers are saved and restored. - A method's receiver type parameter no longer stands in for the callee's own, so
Option<T>results substitute correctly.
Fixes
- fix(docs): point the two fresh-append citations at slicesappendfresh.bit (18cd91d)
Performance
- perf(compiler): prove loop-accumulator appends unshared, append in place (51faa09)
Compiler
- compiler:
@jsonaccepts a payload-free enum field, toJson/__jsonAppend only (858d958) - jsonSchema: move E0172 to E0173, main took E0172 for static fn (b3433fc)
- compiler: import wiring for cross-module jsonSchema calls (d288a4b)
- compiler: jsonSchema() gives a cross-module nested class a $defs entry (26a4e77)
- flip generic explode on unconditionally, drop the BIT_STRING_EXPLODE escape (5a3203a)
- Flip BIT_DCE_PARAMS and BIT_DCE_METHODS on unconditionally (a181118)
- Regenerate 2 selfcheck IR pins for unconditional block-param pruning (2b88e37)
- Revert ": flip generic explode on unconditionally, drop the BIT_STRING_EXPLODE escape" (d1db577)
- Scope correction: default BIT_DCE_PARAMS/BIT_DCE_METHODS ON, keep escape hatch (c84eabb)
- BIT_GENERIC_EXPLODE default ON (=0 escape until the 0.33.0 repin) (a994be3)
- Default BIT_MAPLIT and BIT_STATIC_METHODS ON, forced ON for the stage0 diff family (c949c0e)
- MUTATION (not for merge): revert the savedGpr fix to prove the golden case catches it (12dc13f)
- Revert "MUTATION (not for merge): revert the savedGpr fix to prove the golden case catches it" (6e0a796)
- classjsonschemageneric.bit collects jsonSchema generic forwarding, mirroring (8334280)
- optappendfield: prove field-held append accumulators unshared module-wide (6dca325)
- classjsonschemagenericretarget.bit validates + retargets jsonSchema generic-forwarding ledger entries, mirroring the classjsondecodegenericretarget.bit (dbb9f8c)
- wire jsonSchema generic-need collection into classjsonschemacall.bit and synthtext.bit's SynthPlan (92ee109)
- optappendfield: own fields past pops, literal inits and guarded RMW reads (9183661)
- optappendborrow: a call that only borrows a local accumulator is not an escape (707b910)
- optappendfield: an owned field's one escape takes a header copy (2528b04)
- optappendfield: calls to calm functions and polls stop separating a field read (d79c794)
- Re-point doc paths the site restructure moved (tools/packages, development/iterator-trait, development/lint-*) (e6572d0)
- compiler: ship
bit prof <file.prof>for the release binary (d02be75) - compiler/prof: a sample outside every function's code is its own row, not the last symbol's (c5780f8)
Runtime
- runtime/park/darwin: parkMonoNs divides only by a timebase pair it checked, so a half-published cache cannot divide by zero (6758169)
Standard library
- stdlib/quic: reply CONNECTION_CLOSE(CONNECTION_REFUSED) instead of dropping a refused Initial (6484664)
- stdlib/http/h3shutdown.test.bit: fix stale comment about the mid-drain dial (7447e56)
- quic: verify server certificates by default (db86647)
- quic/http: fix h3 SNI override and requestTls's missed h3 route (dd9dc35)
Tests
- fix 6 spec/SPEC.md line-number citations shifted by the insertion (73c3925)
- compiler: jsonDecode support for payload-free enum fields (39ffa2b)
- compiler: jsonSchema schema-builder, call-site rewrite and stdlib declaration (d7bf78d)
- fix fmtcitationsmdsection.bit citation shifted +1 by the rebase onto main (1e5bbe9)
- compiler: transitive $defs/$ref closure for jsonSchema (55e89fa)
- jsonSchema: close the epic, SPEC accuracy fix, byte-identical proof (026e6c4)
- std/json: jsonSchema field validation attributes as x-bit-attrs (6edaf55)
- reword three historical BIT_STRING_EXPLODE mentions after the flag's deletion (5b5a620)
- Regenerate 4 golden IR fixtures for unconditional block-param pruning (f8f937d)
- flip BIT_TABLEDESC_KNOWNATTR/BIT_STATIC_CONST on, migrate the enum type-assert test into the corpus (5aa7520)
- Revert ": reword three historical BIT_STRING_EXPLODE mentions after the flag's deletion" (777cf2c)
- checkercases: re-point two SPEC.md citations that the rollout-paragraph removal shifted (3f0b32b)
- x64: save callee-saved GPRs an asm block pins or clobbers (7383f48)
- Fix foreignTypeDeclParam to scan every module, not just the caller's own (46b6d13)
- golden census: dRun 552, and each added one run case against the same 550 base (eb99d42)
- rollout-flip fallout - DCE masking on two probes, re-derived benchgate/gcretention baselines, split diffdump under 800 lines (5b8e501)
- fmtcitationsmd: re-point the match-binder-arity citation to the sentence's current line (6d46043)
- close remaining
@jobcoverage - checkercases, golden case, docs, SPEC accuracy (b3e1745) - fmtcitationsmd: follow the match-binder-arity sentence to SPEC.md:3953 after the §10.5 edit (d6c5d0b)
- golden + checkercases fixtures for jsonSchema generic-forwarding (7302b01)
- SPEC.md documents jsonSchema's generic-forwarding path (2ac95ef)
- Fix: port append's element-type assignability, closing the []u8-slice miscompile (7ac50d8)
- test-docs: resolve a page's against pkg/ (268c724)
- test: lint_append_param_selfowned appends a byte, not an int, now that append checks the element type (74ebe66)
- Sweep now-unneeded Json/JsonEntry/Rows imports across stdlib/pkg/docs/tests (cc45ad7)
Documentation
- web: add Route.docs, requestBody()/responds() and App.openApi() forward (23bdc2d)
- web: render an OpenAPI 3.1 document from an App's real routes (5a7f0d4)
- web: sort openApi() route rows in place, not through std/sort (baede43)
- web: split statusDescription() to fit complexity 10, apply bit fmt (c6b62c7)
- web: fix openapi.md's doctest blocks (f47b6a2)
- web: target OpenAPI 3.1.0 for maximum tool compatibility (835da7c)
- pkg/jobs: register/enqueue, worker pool, retries with backoff, dead-letter (20c2bdf)
- pkg/jobs: STYLE.md docs, migration as a statement list, unexport internals (d08352b)
- pkg/auth: export the OIDC fetch-injection seam for downstream tests (52654f7)
- pkg/auth/docs/testing.md: canonically format the doc's bit fence (c35d305)
- pkg/auth: move the OIDC test seam onto OidcStrategy, not a *Fetch route call (ce9918a)
- spec: document jsonSchema, JSON Schema 2020-12 keywords (1333e2b)
- docs: document jsonDecEnumKey/jsonDecEnumIndex (a0dd803)
- pkg/auth requires web ^0.7.0; package READMEs install the current release (ca05caa)
- Course: install web
@v0.7.0 and auth by tag; drop web@v0.1.0/v0.6.5 stubs (000bc05) - Course: install postgres and orm by tag now that bitlang.org serves them (aae252f)
- Course part 10: the real bit add transcript for auth
@v0.2.0 (af2b842) - pkg/jobs docs: real, typechecking examples now static methods are ON (87f244e)
- pkg/auth and Inkwell drop explicit session.save(), autosave does it (d7fc947)
- declare jsonSchema() oracle-lag signatures, fix 2 em dashes, fmt run_json_schema_attrs.bit (6bb34e7)
- web: land after merging - .requestBody()/.responds(status) now compile (f9bfdc0)
- docs/stdlib: strip internal citation shorthand from second-half stdlib pages (a243a83)
- docs: Get started page, Tools section, docs index, STYLE.md rules (d875982)
- docs/stdlib: first-half cleanup - group README by task, drop internal spec/RFC section citations and jargon (580b830)
- docs/book: add the ink companion app's core (6abadd2)
- Rewrite Language reference pages short and exact in the Inkwell domain (c94ae41)
- Rewrite Language reference page bodies short and exact, Inkwell domain (94e03da)
- docs/stdlib: rewrite json.md and sql.md for plain language, drop jargon and history (5d35e4a)
- docs/stdlib: drop remaining SPEC citations and "primitive"/"sum type" wording (54ffe89)
- docs/stdlib: rewrite std/time as a task-shaped guide (b4cf595)
- docs: rewrite std/crypto as a task-shaped user guide (a41c378)
- docs/stdlib: rewrite std/http as a task-shaped guide (c20e3ac)
- pkg docs: remove spec citations, compiler internals and dev history from public docs (bcc2bbf)
- docs: rewrite std/tls as a task-s...
Bit 0.32.0
Bit 0.32.0
Breaking changes
std/sql:Valuehas a newBoolvariant for databases with a native boolean wire type. AmatchoverValuethat lists every variant needs aBoolarm (#6154).std/tls:TrustStoremoved tostd/crypto. Import it fromstd/crypto;std/tlsno longer exports one (#6155).std/websocket:Conn.ncis nowstd/http's byte stream instead of aNetConn, so a WebSocket runs over TLS as well as plain TCP, and theConn.useDeadlinefield is gone (#6172).
Features
- feat(compiler,runtime): gate the append fix behind BIT_APPEND_FRESH (epic ) (16663d1)
- feat(sql): add Value.Bool for Postgres' native boolean wire type (4f90ea3)
Fixes
- fix(opt): root keepalive bases across block-param edges under BIT_DCE_PARAMS (53ee669)
- fix(pkg/auth): requireAuth double-regenerates and never saves the session (9fdf82d)
- fix(runtime): append on a non-null slice no longer aliases the caller's header (fc935f2)
- fix: pkg/orm live-proof fixtures use the pre-'=' colon field-init spelling (7c21fce)
Performance
- perf(compiler): recover the single-use append fast path, safely (95b3c0b)
Compiler
- Repin stage0 to 0.31.0; delete BIT_IFACE_SIG/BIT_BCE_JOIN/BIT_JSON_APPEND; flip BIT_STATIC_CONST on (e26a926)
- Add the bare map literal
{k: v, ...}(SPEC §12.3/§15.2, ) (cf4ae15) - lower e.(EnumType) for a boxed enum target (E0092) (d8f2e32)
- check zero-value existence after satisfiability, not before (2b2dc87)
- Gate the bare map literal behind BIT_MAPLIT and check every entry (eb711e2)
- identify a boxed-enum assert target by TypeId, not by name (d0659e9)
- Fix: a bare slice literal only checked its first element (cb86998)
- ELF dead-strip must close over force-kept .data/.bss/.tls relocs (a18c289)
- Fix batch-gate reds: one TypeInfo writer for all three emitters, split vTypeAssert, bundle runRejected's expectation, Pool doc headings (1c41bab)
- Point the vSweepContainerLits citations at validateexpr.bit, where it is declared (8071915)
- compiler:
@job("name") class attribute (06e9fec) - compiler: explode a generic instance's arguments from its substituted types (648692e)
- compiler: hold lowerexplode.bit and lowerFuncNamed under their line limits (3d8bff8)
- compiler: emit only the method-table slots some site dispatches to (23b9603)
- compiler: BIT_DCE_METHODS gates method-table slot pruning, default off (331f05f)
- compiler: parse
static fnclass methods behind BIT_STATIC_METHODS (4c7ee39) - compiler: ClassName.m()/T.m() call resolution, lowering, interface static requirements (662c86e)
- compiler: reject an interface with a static requirement as a value type (E0170, ) (3825081)
- compiler: pin a class member's merged-generics span to its own site (82c494a)
- compiler/parsertype.bit: trim the new comments under the 800-line ceiling (2d26aaa)
- Fix the reds the merges left on main (7c51494)
- Drop
fnfrom static class methods, rejectstatic fnwith a hint (798ec32) - Fix bit fmt silently dropping static from an interface requirement (842cf0e)
- compiler/parserstatic.bit: bit fmt the rejection predicate (test-fmt-strict) (df32203)
- pe linker must close over force-kept .data relocs (311b1f2)
- seed the PE dead-strip walk with the force-kept data atoms instead of a second pass (14207f5)
- fix undeclared mi left by the force-keep loop removal, ratchet down debt (5baf145)
Runtime
- runtime/gc: keep gcHeapAlloc's cache hit free of frame spills (25d7bd9)
- runtime/gc: allocObject calls gcHeapAllocUncached directly when unarmed (d63eef9)
- std/os: waitForSignal(sigs) delivers SIGTERM/SIGINT to Bit code (a1738e2)
- Windows console-control handler, docs and gate wiring for std/signal (8f6fa54)
- Fix pollfree/docs gate findings; document an unresolved x86_64 race (5278374)
- Fix the real x86_64 crash: non-naked sigReturnTrampoline + missing SA_ONSTACK (a259883)
Standard library
- stdlib/sync: hoist a generic Pool out of stdlib/sql/pool.bit (5dd4c94)
- stdlib/http: bounded-memory streaming request/response bodies (e5dabe6)
- Move waitForSignal to std/signal; add Windows and an automated gate (ecf356c)
- std/http: reason() names every RFC 9110 status, plus 429/431 (311e8c4)
- stdlib/http3 drain-capable server so TlsServer.shutdown() finishes HTTP/3 too (f63aac4)
- genericize std/websocket's Conn to std/http's byteStream (TLS support) (52676ee)
Tests
- Fix SPEC.md:3676 citation drift in check_match_arity fixtures (95daf2e)
- Fix citation drift from the BIT_MAPLIT SPEC.md edit (d539969)
- checker-diag cases for the slice-literal join hole (ef2a8dc)
- (integrator review): judge every container literal once, not per consumer (57dd9c7)
- test-package-docs: scan pkg//guides/*.md and honour doctest deps directive (55e787d)
- compiler: SPEC.md §10.5 for
@job, fix citation drift and checker-diag fixtures (5d786a5) - spec: SPEC.md 10.4.1 Static Methods, interface static requirements (2dac01d)
- docs: SPEC §10.6 names E0170, docs/reference/static-methods.md (1429504)
- clicmd: bit fmt the nested-project check added by fixmain-6062 (ead338a)
- Fill any unfilled defaulted parameter in a named-argument call (45f8bd1)
- pkgdocsgate: port docs.bit's marker (56ff6cf)
- Fix fallout from: JSX props diagnostic + SPEC.md citation drift (cdd22c4)
- record a compiler-known field attribute even when its name resolves (6b6bc81)
- test(gc): re-pin gc-retention baselines for the extra header allocation (7d0d42e)
- Fix gate fallout from the SPEC.md edit and parsertype.bit growth (53c0b54)
- releasesurface: name every symbol by its first token, so an enum that gains a variant reads as changed (bf622b0)
Documentation
- pkg/redis: add RedisError, a typed error enum (07c2702)
- pkg/redis: RESP3 decoder alongside RESP2 (fa45b7a)
- docs/stdlib/sync.md: document Pool (3df79b7)
- pkg/redis: connection core (URL parsing, HELLO/AUTH handshake, pooled Client) (f563527)
- pkg/redis: uri.test.bit for parseUrl (1a71bf3)
- pkg/redis: fix 4 bugs the live gate caught, fmt, and split shapeName (99dcf25)
- pkg/redis: update docs to open()/connect(Options), RedisError (9a5fc25)
- pkg/redis: Cmd command architecture, typed handle scaffold (d989f83)
- pkg/redis: typed transaction results, one shared Batch for Pipeline+Tx (59300a3)
- pkg/redis: tx.read runner abstraction + counter.bit reference family (e1321ab)
- pkg/toml/bench: Rust toml/toml_edit, toml++ and tomlc17 peers, a service-config fixture, a sub-ms timer (3b923e2)
- pkg/yaml/bench: widen the peers to libyaml, rapidyaml, saphyr and yaml-rust2, add a features fixture (06185de)
- Inkwell: config.bit and db.bit (pool + migration registry) (a70d4e0)
- Inkwell: users.bit (User entity, GET /users/:id) (84f0673)
- Inkwell: auth.bit (register/login/logout, authorization helpers) (bc1da79)
- Inkwell: tags.bit (Tag entity, list/create), auth.bit requireAdmin (e157f3e)
- Inkwell: articles.bit (CRUD, relations, pagination/filter/sort, transactional create) (a04a68d)
- Inkwell: comments.bit (list/create/delete, nested under an article) (1d46fec)
- Inkwell: main.bit (middleware, boot, health/ready); fix db.bit revert type (66deb9c)
- Inkwell: app.test.bit integration tests over app.handle() against real PostgreSQL (617f4d3)
- pkg/yaml/bench: time each run with a microsecond clock, not time -l's 10 ms real (50e5be7)
- pkg/web: App.serve() graceful shutdown, App.listenTls()/serveTls() for TLS+HTTP/2+HTTP/3 (d7a5834)
- pkg/auth: TOTP (RFC 6238) over HOTP (RFC 4226) for two-factor auth (dcc4cd0)
- pkg/s3: SigV4 request signing, checked against AWS's own test suite (06d9c32)
- pkg/web/docs: document App.serve()/shutdown() and listenTls()/serveTls() (7dcac0f)
- pkg/yaml/bench: name the zigbuild image knob BENCH_ZB_IMAGE, as pkg/toml/bench does; describe the timer (ba9bc78)
- Inkwell: work around 3 confirmed pkg/orm/pkg/auth/compiler bugs, all 9 integration tests green against real Postgres (b9d85b7)
- Inkwell: bit fmt canonical reflow; drop an unused (uv, ok) binding in auth.bit (249fb7f)
- pkg/s3: Config/Client and put/get/head/delete over SigV4 (486fd20)
- pkg/s3: ListObjectsV2 as a paginated iterator (b83c3f0)
- pkg/web: hijack path for WebSockets, SSE and streaming (63bdc1c)
- pkg/web: add idempotency-key middleware (9e29d18)
- pkg/s3: presigned GET/PUT URLs (a560889)
- pkg/redis hash.bit: every hash command, including field expiry, through the Cmd pattern (20ae8c8)
- pkg/s3: multipart upload, the three-call shape (b243ee4)
- pkg/redis hash.bit: rename scan's match param to pattern, a reserved word (742c753)
- pkg/redis zset.bit: sorted-set commands through the Cmd pattern (a194b95)
- pkg/s3: README, docs guide, and field-export fixes (d27f6c9)
- pkg/redis zset.live.test.bit: live acceptance for every sorted-set command (209cce5)
- pkg/web: static() and fileRes() support HTTP Range requests (53f4797)
- pkg/web: one serving path for hijack, chosen at freeze() (8e14dc1)
- pkg/redis zsetcmd.bit: decode RESP3's nested [member,score] pairs for WITHSCORES (e9a2df1)
- pkg/redis hash.bit: fix HSETEX wire syntax, interpolation, fmt and E0214 (e979866)
- pkg/s3: listPaged (max-keys) and putStream/getStream (641561f)
- pkg/orm: fix save()/upsert() vs Postgres GENERATED ALWAYS AS IDENTITY, with() skipped by one()/oneOrFail() (c5e5543)
- pkg/redis docs/sorted-sets.md: the sorted-set guide page (36039f4)
- pkg/orm/write.test.bit: add a live-Postgres integration test for (5ae1967)
- pkg/web/bench: fold the pinned, quiet-checked method into run.sh and regenerate at 920274f (ab6842f)
- pkg/s3: live gate against SeaweedFS, RSS-proven streaming (975ac89)
- pkg/web: fix E0067 in realtime.bit, finish docs for the single serving path (95a09f4)
- pkg/s3: live tests skip cleanly without a ser...
Bit 0.31.0
Bit 0.31.0
@json classes now get a direct __jsonAppend writer by default, and pkg/web's c.json uses it to encode a value straight to bytes without building a Json tree. Interface assertions v.(I) now check method name and signature by default, and bounds checks are removed through nested if joins by default. The std/http request loop allocates three fewer objects per request, the allocation cache answers its common case without a call, and on macOS a keep-alive connection no longer issues the read that returns EAGAIN after a drained read.
BIT_DCE_PARAMS stays off by default. BIT_STATIC_CONST ships switched off: a bare function value references one static closure cell instead of allocating one.
Compiler
- Repin stage0 to 0.30.0, flip BIT_IFACE_SIG and BIT_BCE_JOIN on by default (e301720)
- Flip BIT_DCE_PARAMS and BIT_JSON_APPEND on by default (063813b)
- Keep BIT_DCE_PARAMS off by default (3c01242)
- A bare function value references one static closure cell, behind BIT_STATIC_CONST, default off (741cb9c)
- The static closure cell goes to the writable data section with a rebased fixup (e95d2e0)
- Data-section fixup loops move to machoDataFixups/peDataFixups (ddcf4f0)
- One fixup helper per writer serves both the rodata and data fixups (02a14ec)
Runtime
- runtime/net/darwin: wait for readiness instead of the EAGAIN read after a short read (d84120d)
- runtime/gc: answer the alloc-cache steady state without a call (57e880e)
Standard library
- std/http: a peer that sends half a request and closes is forgotten (a3bd23e)
- std/http: drop three dead per-request objects (621acc8)
- std/http: keep readMessage's path fix under the 80-line ceiling (2aac714)
pkg/web
- c.json encodes a
@jsonvalue straight to bytes via __jsonAppend (d0dbebb) - jsonRes direct path leaves serialize unset until heldValue (f7e4bdd)
Tests
- Split staticconst main under the complexity limit, trim selfhost-diffdump.sh to 800 lines (eb71528)
Benchmarks
Artifacts
Published for aarch64-linux, aarch64-macos, x86_64-linux and x86_64-windows.
See dist/README.md for the full target table, the archive layout,
the required BIT_STDLIB/BIT_LIBBITRT environment, and the
SHA256SUMS format.
Verify a download before running it:
sha256sum --check --ignore-missing SHA256SUMS # shasum -a 256 on macOSFull commit log: v0.30.0..HEAD
Bit 0.30.0
Bit 0.30.0
On x86-64, loop values now keep 10 of the 11 allocatable registers across the back-edge safepoint poll instead of 4, because the poll shim saves the caller-saved registers. The register allocator ranks spill candidates by loop-weighted reads. The HTTP request and response path does less work per request, which raises pkg/web plaintext throughput at 64 connections by 10.2%. On Linux, a keep-alive connection no longer issues the read that returns EAGAIN after a drained read, which raises pkg/web JSON throughput at 64 connections by 8.8%.
New builtin loadU64(p: *u8): u64 reads 8 bytes from any address. std/json adds jsonAppend* helpers that write JSON into a []byte without building a Json tree.
Three compiler changes ship switched off and turn on in a later release: signature-checked interface assertions (BIT_IFACE_SIG), bounds-check removal through nested if joins (BIT_BCE_JOIN), and dead block-parameter pruning (BIT_DCE_PARAMS). @json classes can generate a direct __jsonAppend writer under BIT_JSON_APPEND, and the name __jsonAppend is now reserved on every class (E0164).
Compiler
- Repin stage0 to 0.29.0, delete the temporary BIT_STR_REUSE flag (89f2f29)
- regalloc: rank spill victims by loop-weighted reads per register time freed (71729e7)
- regalloc: cite markLoopFreqs by its declared name (ff336dc)
- regalloc: take back the spill weight of an edge argument its param shares a location with (849e1bc)
- x86-64: bit_rt_safepoint saves the caller-saved GPRs, so loop values survive the back-edge poll outside rbx/r13/r14/r15 (7f63332)
- Interface assertion
v.(I)checks method name and signature, behind BIT_IFACE_SIG, default off (3c55ca8) - An unresolved method signature key never matches, never falls back to name only (2519ed4)
- optbce: resolve join params through single-source params, behind BIT_BCE_JOIN, default off (25ce241)
- optbce: bound the resolved lookup at 64 visits, pin the join-grown limit panic (96fc1c0)
- deadCodeElim: prune block parameters nothing reads, behind BIT_DCE_PARAMS, default off (2493f4f)
- Add the loadU64(p: *u8): u64 builtin, an unaligned little-endian 8-byte load (1aab888)
@jsongains __jsonAppend(out: []byte): []byte behind BIT_JSON_APPEND; the name is reserved (E0164) (0200319)
Runtime
- gc: grow the parallel mark pool instead of overflowing it (6ce10e6)
- runtime/net/linux: wait for readiness instead of the EAGAIN read after a short read (009f30d)
Standard library
- std/http putBytes: one range check and one bit_rt_bytes_copy instead of a per-byte loop (bb00ddb)
- std/strings firstByteIn: one function, aligned 8-byte word scan, branchless match locate (6d48db0)
- std/http headerBlockBreaks: test c > '\r' first so an ordinary header byte takes one compare (1a76258)
- std/http serializeResponseInto: one piece per status head, CRLF merged into field names (867928e)
- std/http readMessage: find the framing field lines on headerBlockScan's walk, drop framingLines (31d8976)
- std/json: add jsonAppend* helpers for building JSON without a Json tree (b070494)
- std/json appendEscaped: append the string itself when nothing needs escaping (baf02d9)
- docs/stdlib/json: replace two em dashes (9fa1b64)
pkg/web
- A static route's Match is built once at freeze() (12be506)
- Split the staticRoutes tests into routerstatic.test.bit (c4774c7)
Tests
- Fix gate regressions from the loadU64 addition: citation drift and complexity debt (842e4fc)
- Move the loadU64 fixture out of the stage0 differential corpus (fb23c13)
- census: drop a history note; the census carries numbers only (987366f)
- stringexplode: loop_len reads its slice after the join, so the gate-off box survives DCE (4cda0c6)
- pollfree: list netReadSkipClosed as a reviewed exception (e6631a1)
Benchmarks
Artifacts
Published for aarch64-linux, aarch64-macos, x86_64-linux and x86_64-windows.
See dist/README.md for the full target table, the archive layout,
the required BIT_STDLIB/BIT_LIBBITRT environment, and the
SHA256SUMS format.
Verify a download before running it:
sha256sum --check --ignore-missing SHA256SUMS # shasum -a 256 on macOSFull commit log: v0.29.0..HEAD
Bit 0.29.0
Bit 0.29.0
On Linux, clock reads go through the vDSO instead of a clock_gettime system call: about 30 ns per read instead of about 1,020 ns on an x86-64 test box, and about 15 ns instead of 140 ns on aarch64. BIT_VDSO=0 forces the system call.
String reuse is on by default. A function that stores or returns a string it was handed keeps that string's header instead of allocating a copy. BIT_STR_REUSE=0 turns it off.
HTTP responses are written as bytes from one buffer per keep-alive connection. std/net adds Conn.writeBytes, and std/http's Request carries headerLines, the header line count found while the request is validated.
Compiler
- Flip BIT_STR_REUSE on by default, differentials force it on both sides (7a08ac0)
Runtime
- runtime/park/linux: read Linux clocks through the vDSO, not a clock_gettime trap (481baee)
- runtime/net/linux: clamp deadline lazily on first EAGAIN, not on entry (50f5a08)
Standard library
- std/net Conn.writeBytes; std/http writes responses from a reused per-connection buffer (f7da0ba)
- writeBytes takes the same no-deadline path as write (288729b)
pkg/web
- checkHeaderCaps uses std/http's header-line count (74b30b3)
- Constant Content-Type constructors skip re-validation (8b794fb)
Tests
- Reviewed pollfree exceptions for the vDSO lookup walk; gcretention json re-pinned for string reuse (8e85ff9)
Build and tooling
- Repin stage0 to 0.28.0, retire the ptrOf(string) IR signature (1593978)
Benchmarks
Artifacts
Published for aarch64-linux, aarch64-macos, x86_64-linux and x86_64-windows.
See dist/README.md for the full target table, the archive layout,
the required BIT_STDLIB/BIT_LIBBITRT environment, and the
SHA256SUMS format.
Verify a download before running it:
sha256sum --check --ignore-missing SHA256SUMS # shasum -a 256 on macOSFull commit log: v0.28.0..HEAD