Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
639d264
A call through the empty closure is a named panic at the call (#3091)
nicolas-maman Oct 21, 2026
22bea4f
An actor moves only with no message of it in flight, before it runs, …
nicolas-maman Oct 21, 2026
0a41ce0
Every extern agrees with its C definition on each width, checked in C…
nicolas-maman Oct 21, 2026
208d489
An actor state can be named like any of the runtime's actor fields (#…
nicolas-maman Oct 21, 2026
16fc876
A receive timeout fires with two actors or more (#3102)
nicolas-maman Oct 22, 2026
a3c6dac
A function indexing its slice parameters runs a view body for views (…
nicolas-maman Oct 22, 2026
a1bedf1
A write to .len of a slice or an array is a type error (#3104)
nicolas-maman Oct 22, 2026
638c0ed
Shell tests compare files with one helper every leg can run (#3110)
nicolas-maman Oct 22, 2026
127c7b1
Undefined behaviour the UBSan run of the corpus found, fixed at its r…
nicolas-maman Oct 22, 2026
33b97e6
make test-ae passes only on a written tally with no failure (#3111)
nicolas-maman Oct 22, 2026
ccb2582
What a call keeps is read from the callee's declaration, std's stores…
nicolas-maman Oct 21, 2026
5e13959
A program's own function named like a std container store is called a…
nicolas-maman Oct 22, 2026
648a40d
docs/api shows the 64-bit widths #3097 gave arena.used, arena.size an…
nicolas-maman Oct 22, 2026
cd23302
The code generator frees its closure-variable table
nicolas-maman Oct 22, 2026
ed78566
Scheduler threads are counted and placed by the process's CPUs; Linux…
nicolas-maman Oct 22, 2026
a6d457a
A literal clause fits a written result type that holds its value (#3082)
nicolas-maman Oct 22, 2026
a0f6801
The TLS modules, the load balancer and tinyweb's tests call std's pub…
nicolas-maman Oct 22, 2026
2db4029
A module's own import names the file beside it, wherever the compiler…
nicolas-maman Oct 22, 2026
c80c6b0
A scheduler thread gives its overflow buffers back when it leaves
nicolas-maman Oct 22, 2026
fdc4510
An index into a fixed-size array is checked against its length (#3113)
nicolas-maman Oct 22, 2026
62b5155
An array length is an integer constant expression: a named constant, …
nicolas-maman Oct 22, 2026
70de874
In a module that defines its own free, free(xs) of a slice frees the …
nicolas-maman Oct 22, 2026
3509c2a
std.bignum and the cryptography modules hold their buffers as arrays …
nicolas-maman Oct 22, 2026
6e9f219
std and contrib use the containers' public functions; list.at and map…
nicolas-maman Oct 22, 2026
8a81b39
make check-raw-calls: no std or contrib file calls a raw C binding an…
nicolas-maman Oct 22, 2026
7cad26e
std's cryptography modules and the raw-calls fixture in ae fmt's layo…
nicolas-maman Oct 22, 2026
d1db100
A DER length past the input is refused, however large
nicolas-maman Oct 22, 2026
7fdc168
A named function is a function value in an array literal and after re…
nicolas-maman Oct 22, 2026
ac827d1
.len is an array's only member; any other name is a type error naming…
nicolas-maman Oct 22, 2026
c286e39
Any expression whose value is a function can be called (#3099)
nicolas-maman Oct 22, 2026
a7fa440
ae fmt writes a slice of fn tight: make([]fn, 2) (#3081)
nicolas-maman Oct 22, 2026
f289fc7
A call through a null typed function pointer is a named panic (#3098)
nicolas-maman Oct 22, 2026
e8c7e2d
A C-style for loop's bare init assigns a variable already bound (#2734)
nicolas-maman Oct 22, 2026
0082f2f
A local declared without a value starts at its type's zero value (#3114)
nicolas-maman Oct 22, 2026
0d9737f
Tests ask the build which platform they run on, not getenv("OS") (#3119)
nicolas-maman Oct 22, 2026
d2e8aee
A no-threads stdlib built at -O0 links: http_park_resume is threaded …
nicolas-maman Oct 22, 2026
74d9ccc
One Windows thread-type layout with and without AETHER_NO_THREADING (…
nicolas-maman Oct 22, 2026
0e1d826
Hoisting reads each name from one walk of its body, at any number of …
nicolas-maman Oct 22, 2026
e3c7eeb
tcp.write_all, the TLS records and std.http's server send a whole buf…
nicolas-maman Oct 22, 2026
f3f8323
std.http's server clears the receive timeout once a WebSocket is upgr…
nicolas-maman Oct 22, 2026
bed800c
A send is asynchronous whatever the actor count; send batches only wr…
nicolas-maman Oct 22, 2026
7a110b6
tinyweb serves its WebSocket, SSE and chunked endpoints through std.h…
nicolas-maman Oct 22, 2026
6e234d7
amend! std.http's server clears the receive timeout once a WebSocket …
nicolas-maman Oct 22, 2026
87dbe8e
amend! One Windows thread-type layout with and without AETHER_NO_THRE…
nicolas-maman Oct 22, 2026
15055fc
fixup! tinyweb serves its WebSocket, SSE and chunked endpoints throug…
nicolas-maman Oct 22, 2026
e2330bc
fixup! A no-threads stdlib built at -O0 links: http_park_resume is th…
nicolas-maman Oct 22, 2026
7715889
fixup! Hoisting reads each name from one walk of its body, at any num…
nicolas-maman Oct 22, 2026
a6330d1
fixup! .len is an array's only member; any other name is a type error…
nicolas-maman Oct 22, 2026
eabbc51
fixup! A send is asynchronous whatever the actor count; send batches …
nicolas-maman Oct 22, 2026
9bfbd0e
fixup! A no-threads stdlib built at -O0 links: http_park_resume is th…
nicolas-maman Oct 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 4 additions & 4 deletions .github/scripts/contrib_check.sh
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,10 @@ TESTS=(
"templating/liquid/filters|$LQ/test_filters.ae||run|"
"templating/liquid/inheritance|$LQ/test_inheritance.ae||run|"
"tinyweb/spec|$TW/test_spec.ae||run|"
"tinyweb/inventory|$TW/test_inventory.ae|$TW/ws_handshake.c|run|"
"tinyweb/integration|$TW/test_integration.ae|$TW/ws_handshake.c|run|"
"tinyweb/schema_api|$TW/test_schema_api.ae|$TW/ws_handshake.c|run|"
"tinyweb/websocket|$TW/test_websocket.ae|$TW/ws_handshake.c|run|"
"tinyweb/inventory|$TW/test_inventory.ae||run|"
"tinyweb/integration|$TW/test_integration.ae||run|"
"tinyweb/schema_api|$TW/test_schema_api.ae||run|"
"tinyweb/streams|$TW/test_streams.ae||run|"
"i18n/collate|$I18N/collate/test_collate.ae|$I18N/aether_i18n.c std/unicode/utf8proc/utf8proc.c $I18N/ducet/ducet_data.c|leak|"
# png: pure Aether over std.zlib; its test decodes what it encoded.
"png/encode|contrib/png/test_png.ae||leak|"
Expand Down
60 changes: 55 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -1413,6 +1413,7 @@ test-ae: compiler ae stdlib
@# A bad AE_SWEEP_SHARD (#2757) must fail here: inside the pipelines below
@# it would leave the sweep with nothing to run, and nothing reads as a pass.
@sh tests/scripts/sweep_shard.sh < /dev/null
@rm -f $(BUILD_DIR)/test-ae.verdict
@tmpdir=$$(mktemp -d); \
root=$$(pwd); \
script="$$root/tests/scripts/run_ae_test.sh"; \
Expand Down Expand Up @@ -1478,8 +1479,12 @@ test-ae: compiler ae stdlib
fi; \
sh "$$root/tests/scripts/sweep_timings.sh" "$$tmpdir"; \
echo "Aether Tests: $$passed passed, $$failed failed, $$skipped skipped, $$total total"; \
printf '%s %s %s %s\n' "$$passed" "$$failed" "$$skipped" "$$total" > "$$root/$(BUILD_DIR)/test-ae.verdict"; \
rm -rf "$$tmpdir"; \
if [ "$$failed" -gt 0 ]; then exit 1; fi
@# A shell that stopped before its tally can still leave make with status
@# 0: only a written tally with no failure is a pass.
@sh tests/scripts/sweep_verdict.sh $(BUILD_DIR)/test-ae.verdict
endif

# Install smoke test: installs to a temp dir, runs ae init + ae run, cleans up
Expand Down Expand Up @@ -2547,8 +2552,6 @@ install: $(VERSION_HEADER) release-build ae stdlib
# runtime needs the factor-language fork)
# - host/aether (fork+exec sandboxed child via LD_PRELOAD;
# libc + in-tree sandbox runtime only)
# - tinyweb (libc only — SHA-1 + base64 for WebSocket
# handshake; no third-party dep)
# Out of scope for v1: host/{java,go} (separate-process or JNI-style
# bridges, different build shape — javac/jar and cgo c-archive don't fit
# the cc→ar pipeline). The widget toolkit
Expand Down Expand Up @@ -2799,7 +2802,9 @@ help:
@echo " make test-all - Run both C and .ae tests"
@echo " make check-standalone - Compile every standalone C main (benches, demos)"
@echo " make check-docs - Compile the documentation's complete examples"
@echo " make check-tests - The test suite can fail: verdicts reach the exit code, prune list is consistent, every std module has tests, listeners bind loopback, shell tests end background programs through server_jobs.sh, test programs write temp files under names of their own"
@echo " make check-tests - The test suite can fail: verdicts reach the exit code, prune list is consistent, every std module has tests, listeners bind loopback, shell tests end background programs through server_jobs.sh and compare files with same_bytes, test programs write temp files under names of their own and ask the build for the platform"
@echo " make check-extern-widths - Every extern bound to C in this tree agrees with the C definition on each width; no plain C long in a bound signature"
@echo " make check-raw-calls - No std or contrib file calls a raw C binding another module declares"
@echo " make check-contrib-modules - Type-check every non-host contrib module"
@echo " make check-changelog - Validate changelog fragments, catch a release-fold"
@echo " make add-changelog - Write a new_changelogs/ fragment (SECTION=, SLUG=)"
Expand Down Expand Up @@ -2990,6 +2995,8 @@ ci: clean
@$(CI_STAGE) 900 check-standalone $(MAKE) check-standalone
@$(CI_STAGE) 900 check-docs $(MAKE) check-docs
@$(CI_STAGE) 900 check-tests $(MAKE) check-tests
@$(CI_STAGE) 900 check-extern-widths $(MAKE) check-extern-widths
@$(CI_STAGE) 600 check-raw-calls $(MAKE) check-raw-calls
@echo ""
@echo "[5/11] Running .ae integration tests..."
@$(MAKE) test-ae
Expand Down Expand Up @@ -3051,6 +3058,45 @@ ownership-grid ownership-grid-check: compiler ae stdlib
NPROC=$(NPROC) ./$(OWNERSHIP_GRID_RUNNER) \
$(if $(filter ownership-grid-check,$@),--check) $(OWNERSHIP_GRID_ARGS)

# -----------------------------------------------------------------
# Extern widths (#3097): every extern bound to a C function of this tree
# agrees with the C definition on the width of each argument and of the
# result, and no bound C signature uses a plain `long` (32 bits on Windows,
# 64 elsewhere). No C compiler sees an extern's prototype beside the C
# definition, so nothing else catches a disagreement: the call is made with
# the wrong width. The checker is Aether (tests/extern_widths/check.ae). Its
# self-test first: the fixture holds exactly 11 mismatches, one of each
# kind, among definitions that agree.
# -----------------------------------------------------------------
EXTERN_WIDTHS_CHECKER := $(BUILD_DIR)/extern_widths/check$(EXE_EXT)
EXTERN_WIDTHS_DIRS := std contrib runtime tests examples tools lsp benchmarks
.PHONY: check-extern-widths
check-extern-widths: compiler ae stdlib
@mkdir -p $(BUILD_DIR)/extern_widths
@./$(BUILD_DIR)/ae$(EXE_EXT) build tests/extern_widths/check.ae -o $(EXTERN_WIDTHS_CHECKER)
@./$(EXTERN_WIDTHS_CHECKER) --expect 11 tests/extern_widths/fixture \
> $(BUILD_DIR)/extern_widths/self_test.log 2>&1 || \
{ cat $(BUILD_DIR)/extern_widths/self_test.log; exit 1; }
@./$(EXTERN_WIDTHS_CHECKER) --exclude tests/extern_widths/fixture $(EXTERN_WIDTHS_DIRS)

# -----------------------------------------------------------------
# Raw calls (#3107): a std module binds C through `*_raw` externs and
# builds its public functions on them (error results, ownership of what
# is stored, bounds). No std or contrib file calls such a binding that
# another module declares; it calls that module's public function. The
# checker is Aether (tests/raw_calls/check.ae). Its self-test first: the
# fixture holds exactly 4 such calls among uses that are not.
# -----------------------------------------------------------------
RAW_CALLS_CHECKER := $(BUILD_DIR)/raw_calls/check$(EXE_EXT)
.PHONY: check-raw-calls
check-raw-calls: compiler ae stdlib
@mkdir -p $(BUILD_DIR)/raw_calls
@./$(BUILD_DIR)/ae$(EXE_EXT) build tests/raw_calls/check.ae -o $(RAW_CALLS_CHECKER)
@./$(RAW_CALLS_CHECKER) --expect 4 tests/raw_calls/fixture \
> $(BUILD_DIR)/raw_calls/self_test.log 2>&1 || \
{ cat $(BUILD_DIR)/raw_calls/self_test.log; exit 1; }
@./$(RAW_CALLS_CHECKER) std contrib

# The C a program gets when the C compiler is not GCC-compatible
# (AETHER_GCC_COMPAT 0, which is what MSVC compiles): strict C11 under gcc,
# and under cl.exe too when it is on PATH (#2725). CI runs the gcc half on the
Expand Down Expand Up @@ -3274,7 +3320,7 @@ test-optional: compiler ae stdlib

check-tests:
@echo "==================================="
@echo " test suite (verdicts, prune list, loopback listeners, shell kills, temp names)"
@echo " test suite (verdicts, prune list, loopback listeners, shell kills, shell tools, temp names, platform)"
@echo "==================================="
@py=""; \
for cand in python3 python "py -3"; do \
Expand All @@ -3290,10 +3336,14 @@ check-tests:
$$py tests/scripts/check_loopback_listeners.py && \
$$py tests/scripts/test_check_shell_kills.py && \
$$py tests/scripts/check_shell_kills.py && \
$$py tests/scripts/test_check_shell_tools.py && \
$$py tests/scripts/check_shell_tools.py && \
$$py tests/scripts/test_check_shell_tmp.py && \
$$py tests/scripts/check_shell_tmp.py && \
$$py tests/scripts/test_check_ae_tmp.py && \
$$py tests/scripts/check_ae_tmp.py; \
$$py tests/scripts/check_ae_tmp.py && \
$$py tests/scripts/test_check_platform_env.py && \
$$py tests/scripts/check_platform_env.py; \
else \
echo " [SKIP] test suite checks — no working Python found"; \
echo " (checked on the Linux/macOS legs, which run the same target)"; \
Expand Down
2 changes: 1 addition & 1 deletion compiler/aether_aea.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 16 additions & 3 deletions compiler/aether_error.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions compiler/aether_error.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ void aether_error_get_source(const char** out_filename, const char** out_source)
void aether_error_set_source(const char* filename, const char* source);
void aether_error_report(AetherError* error);
void aether_warning_report(AetherError* warning);
// While muted, errors, warnings and codegen notes are neither printed nor
// counted. Codegen mutes the second rendering of one function (#3029).
void aether_diagnostics_set_muted(int muted);
int aether_diagnostics_muted(void);

// Helper functions
void aether_error_simple(const char* message, int line, int column);
Expand Down
75 changes: 51 additions & 24 deletions compiler/aether_module.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions compiler/aether_module.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ typedef struct {
// Source file directory for relative resolution, with its trailing
// slash: a heap copy of any length (#2543), NULL or "" when none.
char* source_dir;
// #3103: 1 while a module's own imports are resolved (source_dir is
// that module's directory), 0 for the entry program's.
int source_is_module;
// Lib-search path: an ordered list of directories (PATH-style),
// searched left-to-right; first hit wins. Issue #413. Default is
// a single entry, `"lib"`, populated at registry init. Each entry
Expand Down
Loading
Loading