on master help sign in
Add u8/u16 fields to header, use u8 for marking null strings
commit751249805310ec9c0755c4fe3b2e87936e3559fa authorJorge Acereda <jacereda@gmail.com> dateWed 21 Mar 2018, 00:00 (9 years ago) parent1b6dd31
3 files changed+18−10
config.mk+1−1 rts/idris_rts.c+5−2 rts/idris_rts.h+12−7
config.mk+1−1
@@ -14,7 +14,7 @@ RANLIB ?=ranlib
1414CABAL :=cabal
1515# IDRIS_ENABLE_STATS should not be set in final release
1616# Any flags defined here which alter the RTS API must also be added to src/IRTS/CodegenC.hs
17−CFLAGS :=-O2 -Wall -std=c99 -D_POSIX_C_SOURCE=200809L -DHAS_PTHREAD -DIDRIS_ENABLE_STATS $(CFLAGS)
17+CFLAGS :=-O2 -Wall -g -std=c99 -D_POSIX_C_SOURCE=200809L -DHAS_PTHREAD -DIDRIS_ENABLE_STATS $(CFLAGS)
1818
1919# CABALFLAGS :=
2020CABALFLAGS += --enable-tests
rts/idris_rts.c+5−2
@@ -7,6 +7,10 @@
77#include "idris_bitstring.h"
88#include "getline.h"
99
10+#define STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(COND)?1:-1]
11+
12+STATIC_ASSERT(sizeof(Hdr) == 8, condSizeOfHdr);
13+
1014#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__)
1115#include <signal.h>
1216#endif
@@ -264,8 +268,7 @@ VAL MKFLOAT(VM* vm, double val) {
264268VAL MKSTRlen(VM* vm, const char * str, size_t len) {
265269 String * cl = allocStr(vm, len, 0);
266270 memcpy(cl->str, str, len);
267− if (str == NULL)
268− cl->slen = ~0;
271+ cl->__null = str == NULL;
269272 return (VAL)cl;
270273}
271274
rts/idris_rts.h+12−7
@@ -29,7 +29,9 @@ typedef enum {
2929
3030
3131typedef struct Hdr {
32− ClosureType ty;
32+ uint8_t ty;
33+ uint8_t u8;
34+ uint16_t u16;
3335 uint32_t sz;
3436} Hdr;
3537
@@ -70,6 +72,7 @@ typedef struct Float {
7072typedef struct String {
7173 Hdr hdr;
7274 size_t slen;
75+#define __null hdr.u8
7376 char str[0];
7477} String;
7578
@@ -231,17 +234,17 @@ typedef void(*func)(VM*, VAL*);
231234// Register access
232235
233236#define RVAL (vm->ret)
234−#define LOC(x) (*(vm->valstack_base + (x)))
235−#define TOP(x) (*(vm->valstack_top + (x)))
237+#define LOC(x) (vm->valstack_base[x])
238+#define TOP(x) (vm->valstack_top[x])
236239#define REG1 (vm->reg1)
237240
238241// Retrieving values
239242static inline char * getstr(String * x) {
240− return x->slen == ~0? NULL : x->str;
243+ return x->__null? NULL : x->str;
241244}
242245
243246static inline size_t getstrlen(String * x) {
244− return x->slen == ~0? 0 : x->slen;
247+ return x->slen;
245248}
246249
247250#define GETSTR(x) (ISSTR(x) ? getstr((String*)(x)) : GETSTROFF(x))
@@ -265,7 +268,7 @@ static inline size_t getstrlen(String * x) {
265268
266269#define CELEM(x) (((x)->hdr.sz - sizeof(Array)) / sizeof(VAL))
267270
268−#define GETTY(x) (((x)->hdr.ty))
271+#define GETTY(x) ((ClosureType)((x)->hdr.ty))
269272#define SETTY(x,t) ((x)->hdr.ty = t)
270273
271274// Integers, floats and operators
@@ -372,7 +375,9 @@ static inline void updateConF(Con * cl, unsigned tag, unsigned arity) {
372375static inline Con * allocConF(VM * vm, unsigned tag, unsigned arity, int outer) {
373376 size_t sz = sizeof(VAL) * arity;
374377 Con * cl = iallocate(vm, sizeof(*cl) + sz, outer);
375− updateConF(cl, tag, arity);
378+ SETTY(cl, CT_CON);
379+ cl->tag = tag;
380+ cl->arity = arity;
376381 return cl;
377382}
378383