diff --git a/lib/src/alloc.h b/lib/src/alloc.h index 52e5ad3d..c6a3331b 100644 --- a/lib/src/alloc.h +++ b/lib/src/alloc.h @@ -9,6 +9,21 @@ extern "C" { #include #include +// Allow clients to override allocation functions + +#ifndef ts_malloc +#define ts_malloc(size) ts_malloc_default(size) +#endif +#ifndef ts_calloc +#define ts_calloc(count,size) ts_calloc_default(count,size) +#endif +#ifndef ts_realloc +#define ts_realloc(buffer,size) ts_realloc_default(buffer,size) +#endif +#ifndef ts_free +#define ts_free(buffer) ts_free_default(buffer) +#endif + #if defined(TREE_SITTER_TEST) void *ts_record_malloc(size_t); @@ -17,19 +32,19 @@ void *ts_record_realloc(void *, size_t); void ts_record_free(void *); bool ts_toggle_allocation_recording(bool); -static inline void *ts_malloc(size_t size) { +static inline void *ts_malloc_default(size_t size) { return ts_record_malloc(size); } -static inline void *ts_calloc(size_t count, size_t size) { +static inline void *ts_calloc_default(size_t count, size_t size) { return ts_record_calloc(count, size); } -static inline void *ts_realloc(void *buffer, size_t size) { +static inline void *ts_realloc_default(void *buffer, size_t size) { return ts_record_realloc(buffer, size); } -static inline void ts_free(void *buffer) { +static inline void ts_free_default(void *buffer) { ts_record_free(buffer); } @@ -42,20 +57,8 @@ static inline bool ts_toggle_allocation_recording(bool value) { return false; } -#ifndef ts_malloc -#define ts_malloc(_sz) ts_malloc_dflt(_sz) -#endif -#ifndef ts_calloc -#define ts_calloc(_cnt,_sz) ts_calloc_dflt(_cnt,_sz) -#endif -#ifndef ts_realloc -#define ts_realloc(_ptr,_sz) ts_realloc_dflt(_ptr,_sz) -#endif -#ifndef ts_free -#define ts_free(_ptr) ts_free_dflt(_ptr) -#endif -static inline void *ts_malloc_dflt(size_t size) { +static inline void *ts_malloc_default(size_t size) { void *result = malloc(size); if (size > 0 && !result) { fprintf(stderr, "tree-sitter failed to allocate %zu bytes", size); @@ -64,7 +67,7 @@ static inline void *ts_malloc_dflt(size_t size) { return result; } -static inline void *ts_calloc_dflt(size_t count, size_t size) { +static inline void *ts_calloc_default(size_t count, size_t size) { void *result = calloc(count, size); if (count > 0 && !result) { fprintf(stderr, "tree-sitter failed to allocate %zu bytes", count * size); @@ -73,7 +76,7 @@ static inline void *ts_calloc_dflt(size_t count, size_t size) { return result; } -static inline void *ts_realloc_dflt(void *buffer, size_t size) { +static inline void *ts_realloc_default(void *buffer, size_t size) { void *result = realloc(buffer, size); if (size > 0 && !result) { fprintf(stderr, "tree-sitter failed to reallocate %zu bytes", size); @@ -82,7 +85,7 @@ static inline void *ts_realloc_dflt(void *buffer, size_t size) { return result; } -static inline void ts_free_dflt(void *buffer) { +static inline void ts_free_default(void *buffer) { free(buffer); }