From d046c97c1f7d923af215cedf3e54b446afeeed93 Mon Sep 17 00:00:00 2001 From: Sasha Koss Date: Mon, 22 Dec 2025 08:02:06 +0000 Subject: [PATCH 1/2] Make __assert_fail static inline to avoid duplicate symbol rust-lld error --- crates/language/wasm/include/assert.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/language/wasm/include/assert.h b/crates/language/wasm/include/assert.h index e981a20e..b1ef2f93 100644 --- a/crates/language/wasm/include/assert.h +++ b/crates/language/wasm/include/assert.h @@ -4,7 +4,7 @@ #ifdef NDEBUG #define assert(e) ((void)0) #else -__attribute__((noreturn)) void __assert_fail(const char *assertion, const char *file, unsigned line, const char *function) { +__attribute__((noreturn)) static inline void __assert_fail(const char *assertion, const char *file, unsigned line, const char *function) { __builtin_trap(); } #define assert(expression) \ From 134a7681721a4c2aba2e499630c34dc0cb54f1f8 Mon Sep 17 00:00:00 2001 From: Sasha Koss Date: Mon, 22 Dec 2025 08:53:58 +0000 Subject: [PATCH 2/2] Add missing Wasm shims required by tree-sitter-ruby --- crates/language/wasm/include/string.h | 4 ++++ crates/language/wasm/include/wctype.h | 6 ++++++ crates/language/wasm/src/string.c | 18 ++++++++++++++++++ crates/language/wasm/src/wctype.c | 9 +++++++++ lib/binding_rust/build.rs | 1 + 5 files changed, 38 insertions(+) create mode 100644 crates/language/wasm/src/wctype.c diff --git a/crates/language/wasm/include/string.h b/crates/language/wasm/include/string.h index 2d576f08..d9d10ed8 100644 --- a/crates/language/wasm/include/string.h +++ b/crates/language/wasm/include/string.h @@ -3,6 +3,8 @@ #include +void *memchr(const void *src, int c, size_t n); + int memcmp(const void *lhs, const void *rhs, size_t count); void *memcpy(void *restrict dst, const void *restrict src, size_t size); @@ -13,4 +15,6 @@ void *memset(void *dst, int value, size_t count); int strncmp(const char *left, const char *right, size_t n); +char *strchr(const char *str, int c); + #endif // TREE_SITTER_WASM_STRING_H_ diff --git a/crates/language/wasm/include/wctype.h b/crates/language/wasm/include/wctype.h index 8d1e8c82..11029092 100644 --- a/crates/language/wasm/include/wctype.h +++ b/crates/language/wasm/include/wctype.h @@ -1,8 +1,14 @@ #ifndef TREE_SITTER_WASM_WCTYPE_H_ #define TREE_SITTER_WASM_WCTYPE_H_ +#include + typedef int wint_t; +int iswlower(wint_t wch); + +int iswupper(wint_t wch); + static inline bool iswalpha(wint_t wch) { switch (wch) { case L'a': diff --git a/crates/language/wasm/src/string.c b/crates/language/wasm/src/string.c index 0fcf4b85..f3992e4a 100644 --- a/crates/language/wasm/src/string.c +++ b/crates/language/wasm/src/string.c @@ -1,5 +1,13 @@ #include +// Derived from musl (MIT): https://git.musl-libc.org/cgit/musl/tree/src/string/memchr.c +void *memchr(const void *src, int c, size_t n) { + const unsigned char *s = src; + c = (unsigned char)c; + for (; n && *s != c; s++, n--); + return n ? (void *)s : 0; +} + int memcmp(const void *lhs, const void *rhs, size_t count) { const unsigned char *l = lhs; const unsigned char *r = rhs; @@ -58,3 +66,13 @@ int strncmp(const char *left, const char *right, size_t n) { } return 0; } + +char *strchr(const char *str, int c) { + while (*str != (char)c) { + if (*str == '\0') { + return 0; + } + str++; + } + return (char *)str; +} diff --git a/crates/language/wasm/src/wctype.c b/crates/language/wasm/src/wctype.c new file mode 100644 index 00000000..34b60e0f --- /dev/null +++ b/crates/language/wasm/src/wctype.c @@ -0,0 +1,9 @@ +#include + +int iswlower(wint_t wch) { + return (unsigned)wch - L'a' < 26; +} + +int iswupper(wint_t wch) { + return (unsigned)wch - L'A' < 26; +} diff --git a/lib/binding_rust/build.rs b/lib/binding_rust/build.rs index 624001bc..d2485115 100644 --- a/lib/binding_rust/build.rs +++ b/lib/binding_rust/build.rs @@ -70,6 +70,7 @@ fn configure_wasm_build(config: &mut cc::Build) { wasm_src.join("stdio.c"), wasm_src.join("stdlib.c"), wasm_src.join("string.c"), + wasm_src.join("wctype.c"), ]); }