Compiler can compile simple nested expressions and function calls.
The generated code can be called from C, and values can be passed between.
diff --git a/src/lisp/plat/linux.c b/src/lisp/plat/linux.c
index 23f7f82..bd9af10 100644
--- a/src/lisp/plat/linux.c
+++ b/src/lisp/plat/linux.c
@@ -1,6 +1,7 @@
#include "plat.h"
#include <stdlib.h>
#include <string.h>
+#include <sys/mman.h>
void *malloc_aligned (size_t size)
{
@@ -27,3 +28,16 @@
void **ptr = (void **)addr;
free (ptr[ -1 ]);
}
+
+void *link (dasm_State **Dst)
+{
+ size_t size;
+ void *buf;
+
+ dasm_link (Dst, &size);
+ buf = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ dasm_encode (Dst, buf);
+
+ mprotect (buf, size, PROT_READ | PROT_EXEC);
+ return buf;
+}
diff --git a/src/lisp/plat/plat.h b/src/lisp/plat/plat.h
index 227e0d2..87544ba 100644
--- a/src/lisp/plat/plat.h
+++ b/src/lisp/plat/plat.h
@@ -2,6 +2,7 @@
#include <stdint.h>
#include <stddef.h>
+#include <dasm_proto.h>
/* Platform specific definitions */
@@ -9,3 +10,5 @@
void *malloc_aligned (size_t size);
void *realloc_aligned (void *addr, size_t size);
void free_aligned (void *addr);
+
+void *link (dasm_State **Dst);