Blaise v0.9.0 (alpha) is out ๐ โ free of C code! ยท graemeg/blaise ยท Discussion #61 ยท GitHub
//voltron/discussions_fragments/discussion_layout" data-turbo-transient="true" />
Skip to content
Search or jump to...
Search code, repositories, users, issues, pull requests...
-->
Search
Clear
Search syntax tips
Provide feedback
--><br>We read every piece of feedback, and take your input very seriously.
Include my email address so I can be contacted
Cancel
Submit feedback
Saved searches
Use saved searches to filter your results more quickly
-->
Name
Query
To see all available qualifiers, see our documentation.
Cancel
Create saved search
Sign in
//voltron/discussions_fragments/discussion_layout;ref_cta:Sign up;ref_loc:header logged out"}"<br>Sign up
Appearance settings
Resetting focus
You signed in with another tab or window. Reload to refresh your session.<br>You signed out in another tab or window. Reload to refresh your session.<br>You switched accounts on another tab or window. Reload to refresh your session.
Dismiss alert
{{ message }}
graemeg
blaise
Public
Uh oh!
There was an error while loading. Please reload this page.
Notifications<br>You must be signed in to change notification settings
Fork
Star<br>184
Blaise v0.9.0 (alpha) is out ๐ โ free of C code!
#61
graemeg
announced in<br>Announcements
Blaise v0.9.0 (alpha) is out ๐ โ free of C code!
#61
graemeg
Jun 2, 2026<br>·<br>0 comments
Return to top
Discussion options
Uh oh!
There was an error while loading. Please reload this page.
{{title}}
Something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Quote reply
graemeg
Jun 2, 2026
Maintainer
v0.9.0 is a broad release: a fully C-free runtime, solid FFI
interop with C libraries, nested procedures, threads, custom
attributes, and a wave of ARC correctness work that brings
reference counting closer to production-quality. Self-hosting
fixpoint achieved at 166,479 lines of verified QBE IR โ up
from 135,311 in v0.8.0. ๐ช
๐ฆ A fully Pascal runtime โ no C files remaining
The last C files in the runtime have been ported to pure Pascal.
blaise_arc_class, blaise_exc, blaise_float, blaise_weak,
and the entire I/O / process / sys / time cluster now live as
Pascal units with external name bindings to libc where needed.
The only non-Pascal file in the runtime is the tiny hand-written
blaise_setjmp_x86_64.s โ unavoidable for the exception ABI.
This matters because it means the runtime is compiled by Blaise
itself, giving us full ARC coverage and removing a whole class of
maintenance burden. The Grisu1 float-to-string implementation and
the string format engine are now both in Pascal too. ๐ ๏ธ
๐ FFI interop โ finally correct
A cluster of bugs that quietly broke interop with C libraries are
all fixed in this release:
Records passed by value now go through QBE's SysV aggregate
ABI. Previously, a Vector2 or Color record landed in the
callee as an integer holding the address of the struct โ
ClearBackground(red) would clear to whatever colour lived at
that stack address. Now QBE scatters the fields into
INTEGER / SSE registers exactly as the C ABI requires, for both
external calls and Blaise-to-Blaise calls. Win64 comes for free
from QBE. ๐ฏ
Single / float parameters and fields are now handled
correctly end-to-end: Single record fields get 4-byte
alignment (not 8), double literals are narrowed before storing
into a Single field, and double-typed expressions are narrowed
before being passed to a Single FFI parameter.
Narrow integer FFI returns (Byte, Boolean, Word,
SmallInt) are now masked or sign-extended at the call site.
The C ABI leaves the upper bits of the return register
undefined, so if Foo() <> 0 then was firing on garbage bits โ
silently wrong. Fixed with per-type normalisation.
@A[i] on dynamic arrays now works. Taking the address of a
dynamic array element raised "Unsupported L-value form" โ now it
emits the correct offset arithmetic.
โ๏ธ ARC โ closing the correctness gaps
ARC got a sustained round of fixes in this cycle:
Owned temporaries created for function return values and method
calls are now released after their use at every call site โ
no more silent reference leaks from transient objects.
Constructor calls no longer double-AddRef the new object.
Function-return assignments no longer double-AddRef.
[Weak] references on implicit-Self field assignments are now
honoured.
Caught exceptions are retained when bound to a handler variable.
finally blocks now run correctly when a non-local exit
(Exit, Break, Continue) unwinds through a try..finally.
A new [Unretained] attribute marks non-owning class references
(back-pointers in AST nodes, symbol table links) that must not
participate in ARC โ preventing retain cycles without the
overhead of the weak registry.
50+ redundant Free calls were removed from AST and symbol-table
destructors that ARC field cleanup was already handling.
๐งต Threads and...