summaryrefslogtreecommitdiff
path: root/src/syntax.zig
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-24 13:04:20 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:14 -0300
commitb4fc9fed0c2d10cd8c1b3b99246b39c262ac5ade (patch)
treef1d6357456dc85b9fb7bab84afc48915aaf7c16f /src/syntax.zig
parent1ba82eedb79d6c9fbc9b80dcac9315645d141f25 (diff)
downloadpardes-b4fc9fed0c2d10cd8c1b3b99246b39c262ac5ade.tar.gz
pardes-b4fc9fed0c2d10cd8c1b3b99246b39c262ac5ade.zip
Allocate tree-sitter's external scanners from the same Zig allocator as its runtime
syntax.zig points the tree-sitter runtime at a Zig allocator, but the grammars' external scanners did not follow it. A grammar's tree_sitter/alloc.h maps ts_malloc to the runtime's current allocator only when TREE_SITTER_REUSE_ALLOCATOR is defined, and plain malloc otherwise, so every scanner's state and its arrays came from libc. Five scanners (bash, markdown, markdown_inline, python, typst) also call malloc, calloc, realloc and free by name. build.zig now compiles every grammar with TREE_SITTER_REUSE_ALLOCATOR and forces in src/tree_sitter_heap.h, which includes stdlib.h and then defines the four names as calls through ts_current_malloc and friends. A header forced in from the build rather than a patch to the grammars keeps zig-pkg pristine. No grammar archive refers to libc's allocator any more; only the runtime does, for its defaults. A scanner frees only what it allocated itself, and the syntax tests that create and destroy a parser for every grammar under a leak-checking allocator pass. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Diffstat (limited to 'src/syntax.zig')
-rw-r--r--src/syntax.zig5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/syntax.zig b/src/syntax.zig
index 5c8b9c0f..9c1a4f4b 100644
--- a/src/syntax.zig
+++ b/src/syntax.zig
@@ -140,8 +140,9 @@ fn initSpecs() [specCount()]Spec {
var specs = initSpecs();
-/// What the tree-sitter runtime allocates from: `start`'s allocator, through
-/// the shared C heap.
+/// What tree-sitter allocates from, the runtime and every grammar's external
+/// scanner (build.zig compiles them to use the runtime's allocator):
+/// `start`'s allocator, through the shared C heap.
var syntax_allocator: std.mem.Allocator = undefined;
const syntax_heap = c_heap.Heap(&syntax_allocator);
var syntax_started = false;