@@ -17,7 +17,7 @@
17typedef enum {
17typedef enum {
18 CON, INT, BIGINT, FLOAT, STRING, STROFFSET,
18 CON, INT, BIGINT, FLOAT, STRING, STROFFSET,
19 BITS8, BITS16, BITS32, BITS64, UNIT, PTR, FWD,
19 BITS8, BITS16, BITS32, BITS64, UNIT, PTR, FWD,
20− BUFFER
20+ MANAGEDPTR, BUFFER
21} ClosureType;
21} ClosureType;
23typedef struct Closure *VAL;
23typedef struct Closure *VAL;
@@ -40,6 +40,11 @@ typedef struct {
40 unsigned char store[];
40 unsigned char store[];
43+// A foreign pointer, managed by the idris GC
44typedef struct Closure {
49typedef struct Closure {
45// Use top 16 bits of ty for saying which heap value is in
50// Use top 16 bits of ty for saying which heap value is in
@@ -57,6 +62,7 @@ typedef struct Closure {
57 uint32_t bits32;
62 uint32_t bits32;
58 uint64_t bits64;
63 uint64_t bits64;
59 Buffer* buf;
64 Buffer* buf;
@@ -112,6 +118,7 @@ typedef void(*func)(VM*, VAL*);
113#define GETSTR(x) (ISSTR(x) ? (((VAL)(x))->info.str) : GETSTROFF(x))
119#define GETSTR(x) (ISSTR(x) ? (((VAL)(x))->info.str) : GETSTROFF(x))
114#define GETPTR(x) (((VAL)(x))->info.ptr)
120#define GETPTR(x) (((VAL)(x))->info.ptr)
121+#define GETMPTR(x) (((VAL)(x))->info.mptr->data)
115#define GETFLOAT(x) (((VAL)(x))->info.f)
122#define GETFLOAT(x) (((VAL)(x))->info.f)
117#define TAG(x) (ISINT(x) || x == NULL ? (-1) : ( (x)->ty == CON ? (x)->info.c.tag_arity >> 8 : (-1)) )
124#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;
163VAL MKFLOAT(VM* vm, double val);
170VAL MKFLOAT(VM* vm, double val);
164VAL MKSTR(VM* vm, const char* str);
171VAL MKSTR(VM* vm, const char* str);
165VAL MKPTR(VM* vm, void* ptr);
172VAL MKPTR(VM* vm, void* ptr);
173+VAL MKMPTR(VM* vm, void* ptr, int size);
166VAL MKB8(VM* vm, uint8_t b);
174VAL MKB8(VM* vm, uint8_t b);
167VAL MKB16(VM* vm, uint16_t b);
175VAL MKB16(VM* vm, uint16_t b);
168VAL MKB32(VM* vm, uint32_t b);
176VAL MKB32(VM* vm, uint32_t b);
@@ -173,6 +181,7 @@ VAL MKFLOATc(VM* vm, double val);
173VAL MKSTROFFc(VM* vm, StrOffset* off);
181VAL MKSTROFFc(VM* vm, StrOffset* off);
174VAL MKSTRc(VM* vm, char* str);
182VAL MKSTRc(VM* vm, char* str);
175VAL MKPTRc(VM* vm, void* ptr);
183VAL MKPTRc(VM* vm, void* ptr);
184+VAL MKMPTRc(VM* vm, void* ptr, int size);
176VAL MKBUFFERc(VM* vm, Buffer* buf);
185VAL MKBUFFERc(VM* vm, Buffer* buf);
178char* GETSTROFF(VAL stroff);
187char* GETSTROFF(VAL stroff);