mirror of
https://github.com/DeusData/codebase-memory-mcp.git
synced 2026-11-09 09:11:00 +08:00
AST traversal functions used fixed-size TSNode stack[] arrays. When the DFS stack filled up, the child-push loop exited silently, dropping entire subtrees without warning (e.g. 600 TS imports → 511, 130 Express routes capped at 512). Reported in #199; also addresses #213 (large TypeScript files producing zero nodes from stack exhaustion) and #215 (SEGV in template calls from stack overflow). Adds ts_node_stack.h — a growable stack backed by the existing arena allocator. Initial capacity matches previous fixed caps so small files allocate no extra memory; doubles on overflow instead of truncating. Old blocks are abandoned in the arena and freed on arena_destroy at the end of file extraction (no realloc, no mixed lifetimes). Applied to all 14 TSNode fixed stacks across 9 extraction files (extract_calls, extract_channels, extract_defs, extract_env_accesses, extract_imports, extract_semantic, extract_type_assigns, extract_type_refs, extract_usages). walk_defs (uses walk_defs_frame_t, different struct type) deliberately left as-is. 7 regression tests in tests/test_stack_overflow.c cover TS imports >512, JS/Python calls >512, Go calls >1024, Express routes >150, deeply nested calls, and YAML vars >256. Cherry-picked from #217 with merge-conflict resolution against post-#206/#207 main: - Makefile.cbm: keep TEST_STACK_OVERFLOW_SRCS plus main's new TEST_ZSTD_SRCS / TEST_ARTIFACT_SRCS. - extract_channels.c: keep main's scan_string_consts_js name (main also added scan_string_consts_python after the PR was opened); declare CHAN_STACK_CAP in the enum block. - test_stack_overflow.c: replace sprintf with snprintf using the actual remaining buffer size, since macOS clang rejects sprintf and naive snprintf with sizeof(p) on a char* fails -Wformat-truncation. Closes #199, #213, #215. Closes #217.