summaryrefslogtreecommitdiff
path: root/src/runtime/haskell-bind/utils.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2014-09-10 15:41:53 +0000
committerkr.angelov <kr.angelov@gmail.com>2014-09-10 15:41:53 +0000
commitdf0602723dcb0dd9a558aba9b29cdde8e7c4f6c9 (patch)
tree7e363176c26b16f6f56b280153db12af0c254e3f /src/runtime/haskell-bind/utils.c
parent80725e872be76ce713fe34c72f6df42e2dd644ed (diff)
now release the FunPtr:s that are allocated for each literal callback
Diffstat (limited to 'src/runtime/haskell-bind/utils.c')
-rw-r--r--src/runtime/haskell-bind/utils.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/runtime/haskell-bind/utils.c b/src/runtime/haskell-bind/utils.c
new file mode 100644
index 000000000..8ab1e53e3
--- /dev/null
+++ b/src/runtime/haskell-bind/utils.c
@@ -0,0 +1,29 @@
+#include <HsFFI.h>
+#include <pgf/pgf.h>
+
+typedef struct {
+ PgfLiteralCallback callback;
+ GuFinalizer fin;
+} HSPgfLiteralCallback;
+
+static void
+hspgf_literal_callback_fin(GuFinalizer* self)
+{
+ HSPgfLiteralCallback* callback = gu_container(self, HSPgfLiteralCallback, fin);
+
+ if (callback->callback.match != NULL)
+ hs_free_fun_ptr((HsFunPtr) callback->callback.match);
+ if (callback->callback.predict != NULL)
+ hs_free_fun_ptr((HsFunPtr) callback->callback.predict);
+}
+
+PgfLiteralCallback*
+hspgf_new_literal_callback(PgfConcr* concr) {
+ GuPool* pool = pgf_concr_get_pool(concr);
+ HSPgfLiteralCallback* callback = gu_new(HSPgfLiteralCallback, pool);
+ callback->callback.match = NULL;
+ callback->callback.predict = NULL;
+ callback->fin.fn = hspgf_literal_callback_fin;
+ gu_pool_finally(pool, &callback->fin);
+ return &callback->callback;
+}