daSQLite: Typed SQLite Query Layer Expansion (#2481, #2485, #2487, #2489, #2492, #2496, #2507, #2509, #2511, #2518, #2524, #2528, #2534, #2551, #2553, #2561, #2563, #2564, #2566, #2568, #2575, #2581, #2592, #2595, #2603)
modules/dasSQLITE now extends daslib/linq with SQL-backed queries, letting familiar linq-style transforms compile down to typed SQLite operations. This release then broadens that foundation with a large tutorial-driven expansion across the rest of the SQLite layer.
- Insert + query macros — typed insert flows, raw
query/try_queryhelpers, much deeper_sql(...)analysis with multi-quantifier (multi-Q) lowering, and a parity audit comparing in-memory linq vs. SQL emission - Read-side operators —
distinct,take,skip, ordering, aggregates, grouping, the full join family (_left_join,_inner_join,_right_join,_full_outer_join,_cross_join), set operations, multi-source queries, and_in/_not_inagainst captured collections via SQLitejson_each - Write-side operations — typed update/delete flows, transaction helpers, UPSERT with schema annotations for foreign keys, indexes, defaults, and computed columns, plus user-defined SQL functions via
[sql_function](auto-registered and visible inside_sqlchains) - Custom storage types — custom adapters plus
@sql_jsonand@sql_blobfield support, JSON-path descent inside_sql, and column metadata introspection - Schema introspection and migrations —
[sql_table(schema_from=...)]+check_schemavalidate live database schema against the daslang struct at compile time;daslib/sqlite_migrateships versioned[sql_migration]blocks with typed ALTER macros (add_column/drop_column/rename_column) and full-table rebuilds via[struct_convert]+convert_and_rename+[sql_table(legacy=true)]for non-trivial schema changes - Operational SQLite features — SQL fragment building,
ATTACH DATABASE, FTS5 ([sql_fts5]+text_match), and pre-migration utilities
Style Lint and Unified Linting (#2386, #2390, #2391, #2417, #2441, #2516, #2517, #2533, #2538, #2612)
New compile-time linting now covers daslang style in addition to the existing correctness and performance passes.
daslib/style_lint— detects non-idiomatic gen2 patterns such as unnecessary block pipes, declaration-then-assignment, array literal construction via repeatedpush, and long comment blocks- Unified lint flow — shared warning collection,
nolintsuppression, comment-hygiene rules, and codebase-wide cleanup to drive warnings back down - Noise reduction — one-line style enforcement was relaxed where it produced more friction than signal
- Nine new perf/style rules (#2612) —
PERF013–PERF017andSTYLE016–STYLE019extend the rule set with additional anti-patterns surfaced during the codebase sweep
Duplicate Detection Pipeline: detect-dupe and find-dupe (#2491, #2493, #2497, #2502, #2508, #2510, #2522)
New utility tooling helps find and triage duplicate daslang functions across large codebases.
utils/detect-dupe— scans files, canonicalizes functions, and clusters exact and fuzzy duplicates with corpus export/import support- Pattern filtering — suppresses boilerplate-heavy false positives and handles generics more cleanly
- AI-assisted triage —
utils/find-dupeconsumes detect-dupe reports and asks Claude to partition clusters into real duplicates vs false positives, with JSON and Markdown output - MCP integration — export, duplicate detection, and judgment workflows are exposed to AI tooling
A new command-line parsing module standardizes how daslang tools read flags.
- Long + short flags — generated
--flagand-faliases, help text, required-flag handling, and array/bool parsing - Execution-mode awareness —
get_user_args()handles both interpreter--invocation and standalone executables correctly - Tool migration — utilities can share one parser instead of hand-rolling
get_command_line_arguments()logic
daslang now has a much clearer leak-debugging story for both language-side and C++-side allocations.
- Leak-tracker mode —
--das-profiler --das-profiler-leaksrecords live allocations with captured daslang call stacks - Cheat-sheet documentation — unified guidance explains GC leaks, heap reports, smart-pointer tracking, jobque leaks, and handle-registry dumps
- Profiler and heap tooling — better reporting and supporting leak-audit work across the runtime
daspkg release produces a redistributable bundle of a daslang project — a directory containing the standalone exe, every transitively-required .shared_module dylib, every asset matching the project's release globs, and every transitive dep package's release assets. The bundle runs on a machine with no daslang installed.
daspkg releasecommand —release()hook in.das_packagedeclaresrelease_main,release_name,release_include/release_excludeglobs, and force-included shared modules- Exe-relative shared-module resolution —
daslang -exeresolves shared modules in three tiers (exe directory →das_root→ absolute path), making relocated bundles portable -list-shared-modules— auxiliary flag walksprogram_for_each_moduleand writes a JSON manifest of every dylib the program touches;daspkg releaseconsumes it for auto-detection- Project-local + relocated-bundle support —
get_this_module_dir, the JIT runtime, and the daspkg resolver all honor project-local layouts, so a moved or copied bundle continues to find its modules - Native shared deps — packages can ship platform-specific dylibs alongside their
.dassources viarelease_include_dll; dasPUGIXML is enabled by default for Info.plist generation on macOS
Strudel Audio Engine: Second Wave (#2403, #2423, #2425, #2426, #2427, #2428, #2429, #2430, #2435, #2440, #2457, #2464, #2519)
The new Strudel engine from 0.6.1 received a broad follow-up pass across synthesis, playback, docs, and memory behavior.
- Better synth and drum voices, more SF2 support, unique per-event HRTF binaural 3D positioning, offline/WAV rendering workflows, and further live/demo polish
- Reduced memory usage and multiple leak fixes in the threaded player, visualizer, and shutdown path
- Expanded documentation and examples for the newer audio stack
Compiler, AOT, and JIT Work (#2396, #2402, #2405, #2406, #2416, #2422, #2433, #2442, #2445, #2458, #2461, #2480, #2499, #2500, #2460, #2554, #2565, #2569, #2585, #2594, #2596, #2601, #2604, #2605)
A substantial runtime/compiler pass improved code generation, packaging flexibility, and test coverage.
- Continued push toward more daslang-authored AOT logic and cleaner AOT/JIT boundaries
- Better standalone-exe behavior, transitive JIT type resolution, prologue sizing, and function registration
- More build configurations (
RelWithDebInfo, static PIC), more daslib AOT coverage, and platform-specific AOT fixes - Tuple-strict typer (#2565) — tuple field names are now part of the type, so
tuple<a:int;b:int>andtuple<x:int;y:int>no longer collide and unnamed tuples remain distinct from named ones Option<T>/Result<T,E>via[template_tuple](#2601) — both types are now structural named-tuples generated through a generic mechanism, replacing bespoke handling- Call-site block arrow body (#2554) —
def f(...) : T => exprshorthand parses alongside the existing block form - Error reporting audit (#2596) — diagnostics retagged for consistency, with
Program::deduplicateErrorssuppressing repeated identical errors from the same site superwalks past empty intermediates (#2594) —supernow skips empty intermediate base classes when looking for a method- Block-form global variable annotations (#2604) —
@fieldannotations now propagate to globals declared insidevariable { ... }blocks cbindprefixes (#2585) — generated bindings can be namespaced with a per-include prefix- Compiler refactor (#2460, #2569, #2605) —
ProgramandContextextracted fromsimulate/astinto their own translation units; serialization unified with eden / daNetGame; large-file split for build-time and editor-friendliness
GC / AST / Ownership Cleanup (#2400, #2404, #2407, #2409, #2410, #2411, #2415, #2420, #2421, #2470, #2506)
Core compiler internals continued the transition away from older smart_ptr-style AST ownership, with the biggest user-facing result being that macros became much easier to write.
TypeDecl,Expression, annotations, and related AST paths were moved deeper intogc_node-style ownership- Macro, visitor, binding, and validator code no longer has to fight as many
smart_ptr-era ownership patterns and pointer conversions - Tracker stability improved when GC is active, reducing false crashes during debugging
Runtime Libraries and Infrastructure (#2393, #2398, #2399, #2412, #2413, #2414, #2431, #2443, #2451, #2455, #2466, #2467, #2474, #2488, #2494, #2495, #2512, #2514, #2536, #2539, #2555, #2572, #2576, #2577)
A broad utility pass landed across libraries, docs, and developer workflow.
- dasPEG — more tests, docs, CI coverage, and standalone/LLVM fixes
- Core libraries — validated numeric conversions in
daslib/strings_convert, continuedOption/Resultwork including non-copyable support, and C API completeness fixes;daslib/clargsnow returnsResultfrom parsing for cleaner error handling - Runtime data structures — new in-tree
das_hash_mapbackend to avoid empty-construction allocations and behave better in thread-local usage - Path-aware glob in
daslib/fio(#2576, #2577) —match_glob,glob,glob_filtered, plusexpand_glob/parse_file_listpromoted from the MCP utility into the stdlib; byte-loops collapsed tofind/replacewith a newskills/strings.mdrollup - Math: common numeric functions (#2555) —
sinh,cosh,tanh,asinh,acosh,atanh,log10,log1p,expm1,cbrt,trunc,hypot,fmod,remainderadded to the math module - das-fmt vendored in-tree —
utils/das-fmt/now holds a local copy of the formatter; CI runs against it instead of an external clone - Tooling/docs — filesystem guidance, handle-registry tutorial work, class-boost coverage, integer-returning
main()for tools, compilation progress reporting, and assorted AST/class-method polish
- Tutorials build in CI (#2578) — every tutorial now compiles in CI as part of the regular check run
- Web target reuses the main
CMakeLists(#2600) —daslang-webpicks up tests and tracks the same build configuration as the native targets, removing the duplicated CMake graph - MCP: parse-aware C++ source-search tools (#2602) —
cpp_find_symbol,cpp_grep_usage,cpp_outline,cpp_goto_definitionjoin the existing daslang-side tools, with a configurable search root and git-signature staleness detection - MCP: auto-retry unqualified module names under
daslib/(#2616) — when a tool call references e.g.fioand the symbol can't be found, the server retries againstdaslib/fiobefore reporting a miss @liveextends to struct fields (#2614) —live_hostnow annotates individual struct fields with@live, with per-fieldinit_hashcombiningf.initandg.initso partial-struct reloads stay coherent
- Build, tooling, and CI fixes (#2385, #2394, #2395, #2424, #2447, #2521, #2537, #2591, #2617) — package
.gitignorehandling, PEG standalone/LLVM issues,requirefixes,dasbindfixes, glob dependency tracking, documentation/error-position corrections, daslang plugin: completion no longer silently bails when an external binding (e.g. OpenGL, GLSL preprocessor) is in scope, andfind_call_macronull-deref fix withmacro_callregression coverage - Runtime/compiler correctness (#2387, #2392, #2486, #2520, #2526, #2531, #2587, #2593) — JIT global-function arguments, handled-type property write propagation, function-lookup cache pointer reuse,
runWithCatchstate cleanup, ASAN/diagnostic follow-up, fix #2583 (standalone-exe shutdown crash), and fix #2582 (top-levellet-init now correctly registers builtins) - Fusion engine — TSan-safe
v_lduviaDAS_LDU_WORKHORSE,call1/call2loadSizestamped fromfnPtr->debugInfo, and a TSan suppression for the over-read in fusion call/return shells - Language/runtime edge cases (#2444, #2446, #2463, #2468) —
finallyloop rework, clearer inference failure on bad calls, GCC reference shadow fixes, and strict-weak-ordering cleanup - Graphics and platform fixes (#2540) — OpenGL/package integration cleanup after the daspkg migration work
- Architecture-specific — skipped
#pragma float_controlon__e2k__to silence warnings on the Elbrus toolchain
- Asteroids (#2552, #2556) — full asteroid-shooter game with waves, audio, and powerups; later migrated to DECS for the entity model with a polish pass on visuals and powerup VFX
- Pacman (#2589) — classic arcade game added to the
examples/lineup - River Run (#2560, #2562, #2567) — top-down river shooter built across three rounds: initial gameplay (river splits, combat, VFX, audio, HUD, collisions), then scenery / bonus / engine sound / tuning, and finally shadows, pickup burst, rich music, 3D HUD, and a juice pass
The daslang VSCode extension now integrates dastest directly into the editor — run tests and benchmarks from inline buttons, see results in the Test Explorer, and get per-test pass/fail feedback without leaving the IDE.
- Inline run buttons — click to run individual tests or benchmarks right from the editor
- Test Explorer integration — test results appear in VS Code's standard Test Explorer panel
- JIT & isolated mode settings —
dascript.jitanddascript.isolatedModetoggles in VS Code Settings, read fresh on each test run (no reload needed) - Live logging — real-time stdout/stderr streaming to a "daslang Tests" output channel (tests were previously silent until completion)
- Cross-platform compiler auto-detection (
daslangon macOS/Linux,daslang.exeon Windows) - Better error messages — distinguishes "compiler not found" vs "dastest not found"
- dastest isolated mode fixes — forward
--benchflag to subprocesses, emit full per-test JSON results
A full-featured package manager for daslang, built entirely in daslang itself. Packages are installed from git repositories or a central index, with dependencies resolved transitively and tracked in a lockfile. Native C/C++ modules are built automatically via CMake.
Core commands:
install— from local path, git URL, or package index name. Supports version pinning (@v1.0), semver constraints (>=1.0,<2.0), and branch pinningupdate/upgrade— re-resolve to latest compatible version with rollback on failureremove— clean removal with dependency cleanupbuild— CMake-based native module compilation withdoctorfor toolchain validationcheck/list— verify integrity, show installed packagesintroduce/withdraw— publish/unpublish packages to the community index (borisbat/daspkg-index)
.das_package manifests — executable daslang scripts (not static JSON) that define package metadata, SDK-aware build logic, version resolution, and dependencies via require_package(). This means packages can have conditional build steps, platform-specific logic, and programmatic version checks — all in daslang.
daslib/daspkg.das API module — provides package_name, download_tag, require_package, cmake_build, and other functions available inside .das_package scripts.
Global module install (#2323) — daspkg install --global installs packages to das_root/modules/, shared across all projects. Local installs auto-use compatible global versions (zero clone, zero build). Version mismatches error with suggestions. C++ runtime shadow detection warns when a module exists both locally and globally — local always wins.
Ecosystem migration — modules previously shipped as git submodules (dasImgui, dasImguiNodeEditor, dasMinfft, dasTelegram) have been extracted into standalone daspkg packages with their own repos and .das_package manifests. The corresponding DAS_*_DISABLED CMake flags have been removed. Install via daspkg install dasImgui etc.
Example packages in examples/daspkg/:
graphics/— ImGui example (depends ondasImgui)node-editor/— imgui-node-editor (transitive dep ondasImgui)minfft/— FFT viadas-minfftindex packagedaspkg-claude/— Telegram bot using Claude API with compile-check sandboxing
Infrastructure:
- Ordered lockfile preserving installation order for sequential upgrades
- Dependency cycle detection with clear error messages
- Logging to
modules/.daspkg.logwith--verbosefor debug output force_rmdir— fixes failure to remove git repos with read-only objects on Windows.daspkg_standalonemarker — prevents auto-discovery of standalone-build modules- 151 unit tests + 70 integration tests
New daslang-live.exe — a thin C++ host with compile → init → update → shutdown lifecycle, automatic GC, pause-on-exception, and hot reload on file changes. The same script runs with both daslang.exe (shipped) and daslang-live.exe (development).
modules/dasLiveHost/— C++ dynamic module providing lifecycle API (request_exit,is_reload,get_dt,get_fps, persistent byte store, etc.)live/module namespace —live/live_commands,live/live_api,live/live_watch,live/decs_live,live/glfw_live,live/opengl_live@livevariable macro — annotate globals with@livefor automatic serialization across live reloads, replacing ~60 lines of manual[before_reload]/[after_reload]boilerplate- REST API —
/status,/error,/reload,/pause,/unpause,/command,/shutdownendpoints. Unknown endpoints return JSON help listing all endpoints with curl examples - Error guard —
/command,/pause,/unpausereturn HTTP 503 with compilation/exception error text - Exception handling — runtime exceptions during
init(),update(),[after_reload], or live commands enter error state, report via/error, and recover on next reload - Single-instance enforcement via named mutex (Windows) / flock (Unix)
- Dependency file watching — all compiled
.dasfiles tracked (not just the main script) -cwdflag — changes working directory to script's folder- 4x MSAA enabled by default in
glfw_livewindow creation - 38 unit tests in
tests/live_host/
New module for pattern matching on compiled AST using the same tag system as qmacro ($e, $v, $i, $t, $c, $f, $b, $a) but in reverse — tags extract values instead of substituting them.
- Three macros:
qmatch(single expression),qmatch_block(block with wildcards),qmatch_function(compiled function) - Wildcards:
_wildcard()(0+),_wildcard1()(1+),_optional()(0–1),_any()(exactly 1) - Strict argument matching with
$a(rest)for flexible tail - Constant constructor matching (folded and unfolded forms)
- Comprehension matching: array
[for...], table{for...}, generator[iterator for...] - Block/lambda/local-function discrimination via
mmFlags - Post-inference local function matching via
qm_convert_local_function - 305 tests across 17 test files, full language reference documentation
All built-in .das wrappers (fio, rtti, network, math helpers, etc.) have been moved out of compileBuiltinModule and into regular daslib/ modules. This is a foundational architectural change with three major consequences:
- Faster compilation — ~10ms faster on static builds (35ms → 25ms for hello world), ~7ms on dynamic. The compiler no longer parses and type-checks built-in
.dascode on every startup. - Standalone executables without the compiler —
libDaScriptcan now be split into a runtime-only library and a compiler library. Standalone executables (AOT-compiled, JIT-compiled, or via LLVM) no longer need to carry the full compiler just because built-in modules had.daswrappers. This enables significantly smaller binaries for deployed applications. - Minimal runtime environments — possible to run a daScript context with only C++-bound modules, no
.dasparsing at all. Opens the door for embedded/constrained targets.
Requires updating bare require fio / require rtti to require daslib/fio / require daslib/rtti_core in user code. The rtti module was renamed to rtti_core to avoid conflicts.
Compile-time AST visitor that detects common performance anti-patterns:
- PERF001: string
+=in loop (O(n^2) allocations) - PERF002:
character_atwith loop variable index (O(n) per call; usepeek_datainstead) - PERF003:
character_atanywhere (informational; suggestsfirst_characterfor index 0) - PERF004: string interpolation reassignment in loop (O(n^2) allocations)
- PERF005:
length(string)in while condition (strlen each iteration) - PERF006:
push/push_clone/emplacein for loop withoutreserve() - PERF007: unnecessary
string(das_string)in comparison (das_string supports==/!=directly) - PERF008: unnecessary
get_ptr()foris/astype checks (smart_ptr supports them directly) - PERF009: redundant move-init variable immediately returned (use
return <- exprdirectly)
Expression chain walking, field path tracking, closure-aware detection, inferStack reporting. Two usage modes: require daslib/perf_lint for auto-lint, or standalone utils/perf_lint/main.das for batch checking. Full codebase sweep applied all fixes.
a?[index]for pointer types — returns null ifais null, otherwisea + index(pointer arithmetic). Requiresunsafe. Supports int, uint, int64, uint64 indices.- Bug fix: bounded safe-at types (array, fixed array, vector) accepted int64/uint64 indices but
SimNode_SafeAttruncated to 32-bit. Fixed by restricting bounded types to int/uint only. - Implemented across interpreter, AOT, and JIT.
- Expose
TypeInfo,StructInfo,EnumInfo,FuncInfoas opaque handles indaScriptC.h - ~40 new C functions for querying struct layouts (field names, types, offsets), enum values, function signatures
das_base_typeenum withstatic_assertguards against C/C++ drift- Tutorial 11: struct layout inspection, nested structs, engine-side allocation using discovered offsets
get_module_file_name(name)(#2294) — returns source file path of a module. Enables module-relative asset resolution.get_key(tab, value_ref)(#2322) — O(1) table value-to-key lookup via pointer arithmetic on parallel key/value arraysfirst_character(string)(#2315) — O(1) first character access (bothstringanddas_stringoverloads)with_das_string(block)(#2315) — creates a temporarydas_stringfor block scopesystem()(#2293) — fire-and-forget process launch infiomoduledaslib/command_line(#2328) —get_das_exe()returns path to the daslang interpreter
A TidalCycles-inspired pattern music engine with SF2 SoundFont support, MIDI playback, and a redesigned two-mode player architecture. Patterns are pure functions from time spans to events — composable, lazy, and side-effect-free.
SF2 SoundFont support:
- Load General MIDI soundfonts (
strudel_load_sf2) — 128 GM presets, multi-layered instrument zones - Per-voice reverb and chorus sends from SF2 generator parameters
- Exclusive class handling (hi-hat choke) and strudel cut groups for voice management
- Note-off scheduling with sample-accurate timing
- SF2 state persistence across live reloads via Archive serialization (~140MB GM font survives hot reload)
Two-mode player architecture:
- Main-thread mode —
strudel_create_channel()+strudel_tick()from your render loop. Direct access to per-track PCM and pianoroll hap data. No channels, no lockboxes, novoid*casts. - Threaded mode —
strudel_init(fn)spawns a dedicated audio thread.strudel_play()runs the tick loop with buffer-level sleep. Channel-based command dispatch for live pattern changes.
Visualizer combinators:
pianoroll("name"),spectrum(),scope(),vectorscope(),drums()— pass-through pattern combinators using a rollingg_vis_index. Each registers what visualization the track wants;strudel_add_track()bumps the index.pianoroll()wraps the pattern to capture haps during evaluation into a direct array (same thread, no channels). Other combinators are pure pass-throughs that mark track preferences.vis_name(),vis_color()— set display metadata per track.- Panel names displayed only when explicitly specified.
MIDI player (strudel_midi_player.das):
- Load and play
.midfiles through SF2 soundfont rendering - Per-channel gain, pan, looping, audio visualization channels
- Integrates with the visualizer via the same audio analysis pipeline
Examples (6 demos in examples/daStrudel/):
player_demo— minimal threaded playback (load samples, play pattern, shutdown)synth_demo— 100% synthesized, no sample files needed (drums + bass + lead)sf2_demo— SF2 lo-fi chill beat (Am-F-C-G with GM percussion, piano, bass, strings)piano_demo— "Ode to Joy" with pitched piano samples viaseq()bar notationstrudel_live/strudel_sf2_live— live-reload with REST commands (play/stop/fade tracks by name)strudel_visualizer— OpenGL visualizer with 5-track pianoroll, spectrum, drums, scope, vectorscope panels. Main-thread mode with direct data access.
- Faster CondFolding (#2309) — optimization phase handles multiple transformations per pass instead of one, reducing total optimization passes.
- Optimized
character_at(#2315) — C++ implementation scans only to index instead of fullstrlen. - Fix access flags for array/table lock/unlock (#2310) — split into const/non-const overloads, fixing incorrect variable access flag inference.
- One-liner and table lints are warnings (#2284) — demoted from errors until next major release, controllable via
CodeOfPolicies.
- Explicit error reporting for fio (#2282) — removed all try-catch from C++17 filesystem functions, added Go-style
string& errorout-parameters to 16 functions. 35 new tests. - Fix
stat/fstatside effects (#2319) — changed frommodifyExternaltomodifyArgumentAndExternalfor correct const inference.
- 7 live tools (#2293) —
live_launch,live_status,live_error,live_reload,live_pause,live_command,live_shutdown linttool (#2319) — AI-assisted code quality checking (includes both paranoid lint and perf_lint in one pass) with duplicate message deduplicationshutdowntool (#2293) — shuts down MCP server for code change pickupfailures_onlyparam forrun_test(#2328)- Fix ast-grep detection (#2326) — fallback to
.venv/Scripts/sg/.venv/bin/sg - Fix standalone exe subprocess hang (#2328) —
get_das_exe()prevents launching another MCP server instead ofdaslang.exe - Unique temp files (#2328) —
ref_time_ticks()in names to avoid collisions
- stbtt glyph shape API (#2291) — expose
stbtt_GetCodepointShape, vertex struct, vertex type constants - Safe stb_truetype API (#2312) — two-layer safe API: low-level
stbtt_*wrappers confiningunsafe, high-levelFontmethods with zerounsafe. 70 tests.
- Bulk entity creation (#2290) —
create_entitiesT` API bypasses ComponentMap, resolves component indices once, writes directly into archetype storage. ~10x faster (174ns vs 1772ns for 1000 entities under JIT). - Multi-dimensional fixed array serialization (#2295) —
daslib/archive.dassupports 2D–6D fixed arrays
- daslang-live documentation (#2314) — full RST page covering lifecycle, API, modules, REST API, CLI, examples
- CMake install overhaul (#2313) — complete examples, module install fixes, tutorial install rules, utility install
- Updated CLI help (#2324) — all command-line switches documented for both
daslanganddaslang-live - Lint sweep (#2317, #2321) — all perf_lint and lint warnings fixed across daslib/, modules/, examples/, tutorials/
- Custom org runners (#2307, #2308) —
ubuntu-latest-fat,ubuntu-24.04-arm-fat,windows-latest-fat, macOS xlarge - Correct CI timeouts (#2283) — increased to 900s for dastest, 1h for isolated mode
daslang_staticin CI (#2292) — Release-only testing- das-fmt Release-only (#2292) — run once on Linux only
- Extended CI checks (#2331) — additional test configurations
- AOT
das_null_coalescing(#2286) — template used wrong type source (defaultValue->typeinstead of expression result type). Fixed in both C++ and daScript AOT generators. - ASAN support on MSVC (#2301) — fix
NO_ASAN_INLINEmacro (was missing__declspec(no_sanitize_address)for MSVC), forward ASAN flags to libhv ExternalProject. - ModuleGroup use-after-free (#2301) —
ModuleGroupwas stack-local incompile_script()but outlived byProgram/Context. Moved intoCompileResult. - Fuzzer bugs (#2311) — clone semantics won't pipe to ascend/new;
getBaseSizeOf64/getAlignOfFieldcorrectly crash on type-macros. - Fusion ASAN false positives (#2306) —
NO_ASAN_INLINEon fusion call/return methods usingv_lduon sub-16-byte data. - Cross-platform path hardcoding (#2289) — replace
bin/Release/daslang.exewithget_command_line_arguments()[0]in tests. array_mark_locked(#2289) — use proper API instead of manualArrayfield setup in dasAudio/dasSQLITE.- JIT standalone executables (#2327) — various fixes for JIT-compiled standalone exe generation.
- JIT support for all nodes (#2281) — additional node types supported in JIT backend.
- Handled const string type emission (#2287) — manually emit type for handled const string.
- MCP shared module caching —
ignore_shared_modulesprevents stale structs acrosscompile_checkcalls.
- Arcanoid (#2286, #2290, #2303) — full Breakout game with 3D rendering, DECS entities, procedural audio, power-ups, planar shadows, particles, ball trail, menu/pause states, 11 live commands. Rounded bricks, shield powerup, pickup VFX, sticky paddle.
- Sequence board game (#2295, #2296, #2297, #2300) — complete Sequence implementation with 2-4 players, card placement, jack logic, win detection. Three bots (random, greedy, lookahead), ELO tournament runner, parallel evolution strategy for weight tuning, 176 tests.
utils/migrate-tables/(#2298) — two-pass tool transformingtab.insert(key, tab.get_value(key) + val)patterns intotab[key] += valcompound assignments. 22 ast-grep rules + Python script for compound expressions.