the Haskell marshaller/unmarshaller are now statically allocated

This commit is contained in:
Krasimir Angelov
2023-03-10 23:34:28 +01:00
parent 4863ab0ec9
commit 62d24b9431
5 changed files with 261 additions and 316 deletions
+33 -26
View File
@@ -1,35 +1,42 @@
#include <HsFFI.h>
#include <pgf/pgf.h>
#include <stdlib.h>
#include "PGF2/FFI_stub.h"
void hs_free_marshaller(PgfMarshaller *marshaller)
{
hs_free_fun_ptr((HsFunPtr) marshaller->vtbl->match_lit);
hs_free_fun_ptr((HsFunPtr) marshaller->vtbl->match_expr);
hs_free_fun_ptr((HsFunPtr) marshaller->vtbl->match_type);
free(marshaller->vtbl);
free(marshaller);
}
static
PgfMarshallerVtbl haskell_marshaller_vtbl = {
(void*)haskell_match_lit,
(void*)haskell_match_expr,
(void*)haskell_match_type
};
void hs_free_unmarshaller(PgfUnmarshaller *unmarshaller)
{
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->eabs);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->eapp);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->elit);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->emeta);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->efun);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->evar);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->etyped);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->eimplarg);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->lint);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->lflt);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->lstr);
hs_free_fun_ptr((HsFunPtr) unmarshaller->vtbl->dtyp);
free(unmarshaller->vtbl);
free(unmarshaller);
}
PgfMarshaller haskell_marshaller = {
&haskell_marshaller_vtbl
};
void hs_free_reference(PgfUnmarshaller *self, uintptr_t ref)
static
void haskell_free_ref(PgfUnmarshaller *self, uintptr_t ref)
{
hs_free_stable_ptr((HsStablePtr) ref);
}
static
PgfUnmarshallerVtbl haskell_unmarshaller_vtbl = {
(void*)haskell_eabs,
(void*)haskell_eapp,
(void*)haskell_elit,
(void*)haskell_emeta,
(void*)haskell_efun,
(void*)haskell_evar,
(void*)haskell_etyped,
(void*)haskell_eimplarg,
(void*)haskell_lint,
(void*)haskell_lflt,
(void*)haskell_lstr,
(void*)haskell_dtyp,
haskell_free_ref
};
PgfUnmarshaller haskell_unmarshaller = {
&haskell_unmarshaller_vtbl
};