@@ -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