@@ -17,7 +17,7 @@
1717typedef enum {
1818 CON, INT, BIGINT, FLOAT, STRING, STROFFSET,
1919 BITS8, BITS16, BITS32, BITS64, UNIT, PTR, FWD,
20− BUFFER
20+ MANAGEDPTR, BUFFER
2121} ClosureType;
2222
2323typedef struct Closure *VAL;
@@ -40,6 +40,11 @@ typedef struct {
4040 unsigned char store[];
4141} Buffer;
4242
43+// A foreign pointer, managed by the idris GC
44+typedef struct {
45+ size_t size;
46+ void* data;
47+} ManagedPtr;
4348
4449typedef struct Closure {
4550// Use top 16 bits of ty for saying which heap value is in
@@ -57,6 +62,7 @@ typedef struct Closure {
5762 uint32_t bits32;
5863 uint64_t bits64;
5964 Buffer* buf;
65+ ManagedPtr* mptr;
6066 } info;
6167} Closure;
6268
@@ -112,6 +118,7 @@ typedef void(*func)(VM*, VAL*);
112118
113119#define GETSTR(x) (ISSTR(x) ? (((VAL)(x))->info.str) : GETSTROFF(x))
114120#define GETPTR(x) (((VAL)(x))->info.ptr)
121+#define GETMPTR(x) (((VAL)(x))->info.mptr->data)
115122#define GETFLOAT(x) (((VAL)(x))->info.f)
116123
117124#define TAG(x) (ISINT(x) || x == NULL ? (-1) : ( (x)->ty == CON ? (x)->info.c.tag_arity >> 8 : (-1)) )
@@ -163,6 +170,7 @@ typedef intptr_t i_int;
163170VAL MKFLOAT(VM* vm, double val);
164171VAL MKSTR(VM* vm, const char* str);
165172VAL MKPTR(VM* vm, void* ptr);
173+VAL MKMPTR(VM* vm, void* ptr, int size);
166174VAL MKB8(VM* vm, uint8_t b);
167175VAL MKB16(VM* vm, uint16_t b);
168176VAL MKB32(VM* vm, uint32_t b);
@@ -173,6 +181,7 @@ VAL MKFLOATc(VM* vm, double val);
173181VAL MKSTROFFc(VM* vm, StrOffset* off);
174182VAL MKSTRc(VM* vm, char* str);
175183VAL MKPTRc(VM* vm, void* ptr);
184+VAL MKMPTRc(VM* vm, void* ptr, int size);
176185VAL MKBUFFERc(VM* vm, Buffer* buf);
177186
178187char* GETSTROFF(VAL stroff);