Blaise v0.9.0 (alpha) is out free of C code

mariuz1 pts0 comments

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>&middot;<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...

blaise free reload code graemeg search

Related Articles