aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2016-04-01 08:56:23 +1000
committerSteve Bennett <steveb@workware.net.au>2023-02-13 10:43:00 +1000
commitdb26fe46ea9a35d403067498f4b85eee82b431b0 (patch)
tree594a0c3f670ea91500c763220d4aca65d8bc53fc
parentd30183cbf77bce87ed5d96c1021e9521ac10c015 (diff)
downloadjimtcl-db26fe46ea9a35d403067498f4b85eee82b431b0.zip
jimtcl-db26fe46ea9a35d403067498f4b85eee82b431b0.tar.gz
jimtcl-db26fe46ea9a35d403067498f4b85eee82b431b0.tar.bz2
jim: make the Jim memory allocator replaceable
Allows for a specialised allocator or debugging allocator. Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c25
-rw-r--r--jim.h16
2 files changed, 25 insertions, 16 deletions
diff --git a/jim.c b/jim.c
index 8806ec4..36a9243 100644
--- a/jim.c
+++ b/jim.c
@@ -660,24 +660,25 @@ static void JimPanicDump(int condition, const char *fmt, ...)
* Memory allocation
* ---------------------------------------------------------------------------*/
-void *Jim_Alloc(int size)
+void *JimDefaultAllocator(void *ptr, size_t size)
{
- return size ? malloc(size) : NULL;
-}
-
-void Jim_Free(void *ptr)
-{
- free(ptr);
+ if (size == 0) {
+ free(ptr);
+ return NULL;
+ }
+ else if (ptr) {
+ return realloc(ptr, size);
+ }
+ else {
+ return malloc(size);
+ }
}
-void *Jim_Realloc(void *ptr, int size)
-{
- return realloc(ptr, size);
-}
+void *(*Jim_Allocator)(void *ptr, size_t size) = JimDefaultAllocator;
char *Jim_StrDup(const char *s)
{
- return strdup(s);
+ return Jim_StrDupLen(s, strlen(s));
}
char *Jim_StrDupLen(const char *s, int l)
diff --git a/jim.h b/jim.h
index 9e11260..2ce3312 100644
--- a/jim.h
+++ b/jim.h
@@ -627,12 +627,20 @@ typedef struct Jim_Reference {
#define Jim_NewEmptyStringObj(i) Jim_NewStringObj(i, "", 0)
#define Jim_FreeHashTableIterator(iter) Jim_Free(iter)
-#define JIM_EXPORT
+#define JIM_EXPORT extern
/* Memory allocation */
-JIM_EXPORT void *Jim_Alloc (int size);
-JIM_EXPORT void *Jim_Realloc(void *ptr, int size);
-JIM_EXPORT void Jim_Free (void *ptr);
+
+/* The default Jim Allocator can be replaced by assigning to Jim_Allocator.
+ * This function does malloc/realloc/free depending on the arguments.
+ * If size is 0, ptr is freed.
+ * Otherwise malloc or realloc is done depending on whether ptr is NULL.
+ */
+JIM_EXPORT void *(*Jim_Allocator)(void *ptr, size_t size);
+
+#define Jim_Free(P) Jim_Allocator((P), 0)
+#define Jim_Realloc(P, S) Jim_Allocator((P), (S))
+#define Jim_Alloc(S) Jim_Allocator(NULL, (S))
JIM_EXPORT char * Jim_StrDup (const char *s);
JIM_EXPORT char *Jim_StrDupLen(const char *s, int l);