guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 84/86: Allow users to pass custom allocators


From: Andy Wingo
Subject: [Guile-commits] 84/86: Allow users to pass custom allocators
Date: Wed, 3 Apr 2019 11:39:06 -0400 (EDT)

wingo pushed a commit to branch lightening
in repository guile.

commit 22d06620ee225d6003f5a29fd6f91873637a6575
Author: Andy Wingo <address@hidden>
Date:   Wed Apr 3 15:25:21 2019 +0200

    Allow users to pass custom allocators
---
 lightening.h            | 15 ++++++++++++++-
 lightening/lightening.c | 13 ++++++++++---
 tests/test.h            |  2 +-
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/lightening.h b/lightening.h
index da1d4ec..5331a8d 100644
--- a/lightening.h
+++ b/lightening.h
@@ -110,6 +110,18 @@ typedef struct jit_reloc
 #define jit_class(bits)                ((bits) & 0xffff0000)
 #define jit_regno(bits)                ((bits) & 0x00007fff)
 
+static inline jit_bool_t
+jit_gpr_is_callee_save (jit_gpr_t reg)
+{
+  return jit_class(reg.bits) & jit_class_sav;
+}
+
+static inline jit_bool_t
+jit_fpr_is_callee_save (jit_fpr_t reg)
+{
+  return jit_class(reg.bits) & jit_class_sav;
+}
+
 typedef struct jit_state       jit_state_t;
 enum jit_arg_loc
 {
@@ -155,7 +167,8 @@ typedef union jit_anyreg
 
 JIT_API jit_bool_t init_jit(void);
 
-JIT_API jit_state_t *jit_new_state(void);
+JIT_API jit_state_t *jit_new_state(void* (*alloc_fn)(size_t),
+                                   void (*free_fn)(void*));
 JIT_API void jit_destroy_state(jit_state_t*);
 
 JIT_API void jit_begin(jit_state_t*, uint8_t*, size_t);
diff --git a/lightening/lightening.c b/lightening/lightening.c
index afb0b11..7b46d4f 100644
--- a/lightening/lightening.c
+++ b/lightening/lightening.c
@@ -137,6 +137,8 @@ struct jit_state
   uint8_t temp_gpr_saved;
   uint8_t temp_fpr_saved;
   uint8_t overflow;
+  void* (*alloc)(size_t);
+  void (*free)(void*);
 };
 
 enum jit_reloc_flags
@@ -177,13 +179,18 @@ init_jit(void)
 }
 
 jit_state_t *
-jit_new_state(void)
+jit_new_state(void* (*alloc_fn)(size_t), void (*free_fn)(void*))
 {
-  jit_state_t *_jit = malloc (sizeof (*_jit));
+  if (!alloc_fn) alloc_fn = malloc;
+  if (!free_fn) free_fn = free;
+
+  jit_state_t *_jit = alloc_fn (sizeof (*_jit));
   if (!_jit)
     abort ();
 
   memset(_jit, 0, sizeof (*_jit));
+  _jit->alloc = alloc_fn;
+  _jit->free = free_fn;
 
   if (!jit_init (_jit));
 
@@ -193,7 +200,7 @@ jit_new_state(void)
 void
 jit_destroy_state(jit_state_t *_jit)
 {
-  free (_jit);
+  _jit->free (_jit);
 }
 
 jit_pointer_t
diff --git a/tests/test.h b/tests/test.h
index d2d7ec7..578709f 100644
--- a/tests/test.h
+++ b/tests/test.h
@@ -18,7 +18,7 @@ main_helper (int argc, char *argv[],
              void (*run_test)(jit_state_t*, uint8_t*, size_t))
 {
   ASSERT(init_jit());
-  jit_state_t *j = jit_new_state();
+  jit_state_t *j = jit_new_state (NULL, NULL);
   ASSERT(j);
 
   const size_t arena_size = 4096;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]