diff --git a/src/h.h b/src/h.h index a204a87f..69ff14b5 100644 --- a/src/h.h +++ b/src/h.h @@ -188,7 +188,9 @@ static const u16 OBJ_TAG = 0b1111111111110110; // FFF6 1111111111110110ppppppppp static const u16 ARR_TAG = 0b1111111111110111; // FFF7 1111111111110111ppppppppppppppppppppppppppppppppppppppppppppp000 array (everything else here is an atom) static const u16 VAL_TAG = 0b1111111111110 ; // FFF. 1111111111110................................................... pointer to Value, needs refcounting #define ftag(X) ((u64)(X) << 48) -#define tag(V, T) b(((u64)(V)) | ftag(T)) +#define ptr2u64(X) ((u64)(uintptr_t)(X)) +#define tagu64(V, T) b((u64)(V) | ftag(T)) +#define tag(V, T) b(ptr2u64(V) | ftag(T)) #define taga(V) tag(V,ARR_TAG) void cbqn_init(void); @@ -408,7 +410,7 @@ FORCE_INLINE bool isPrim(B x) { return isCallable(x) && v(x)->flags; } // make objects static B m_f64(f64 n) { assert(isF64(b(n))); return b(n); } // assert just to make sure we're actually creating a float -static B m_c32(u32 n) { return tag(n,C32_TAG); } // TODO check validity? +static B m_c32(u32 n) { return tagu64(n,C32_TAG); } // TODO check validity? static B m_i32(i32 n) { return m_f64(n); } static B m_usz(usz n) { return nty==0? DFND0 : bl->ty==1? DFND1 : DFND2); - A64((u64)bl); + A64(ptr2u64(bl)); TSADD(usedBlocks, bl); break; } @@ -386,8 +386,8 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl u64 bodyReqAm = TSSIZE(bodyReqs); for (u64 i = 0; i < bodyReqAm; i++) { NextRequest r = bodyReqs[i]; - /*ugly, but whatever*/ u64 v1 = (u64)bodyMap[r.pos1]; newBC[r.off+0] = (u32)v1; newBC[r.off+1] = v1>>32; - if (r.pos2!=U32_MAX) { u64 v2 = (u64)bodyMap[r.pos2]; newBC[r.off+2] = (u32)v2; newBC[r.off+3] = v2>>32; } + /*ugly, but whatever*/ u64 v1 = ptr2u64(bodyMap[r.pos1]); newBC[r.off+0] = (u32)v1; newBC[r.off+1] = v1>>32; + if (r.pos2!=U32_MAX) { u64 v2 = ptr2u64(bodyMap[r.pos2]); newBC[r.off+2] = (u32)v2; newBC[r.off+3] = v2>>32; } } TSFREE(bodyReqs); TFREE(bodyMap); @@ -716,7 +716,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume #endif #define L64 ({ u64 r = bc[0] | ((u64)bc[1])<<32; bc+= 2; r; }) #if VM_POS - #define POS_UPD envCurr->pos = (u64)(bc-1); + #define POS_UPD envCurr->pos = ptr2u64(bc-1); #else #define POS_UPD #endif @@ -799,7 +799,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume } case VARM: { u32 d = *bc++; u32 p = *bc++; - ADD(tag((u64)d<<32 | (u32)p, VAR_TAG)); + ADD(tagu64((u64)d<<32 | (u32)p, VAR_TAG)); break; } case VARO: { u32 d = *bc++; u32 p = *bc++; @@ -816,7 +816,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume } case EXTM: { u32 d = *bc++; u32 p = *bc++; - ADD(tag((u64)d<<32 | (u32)p, EXT_TAG)); + ADD(tagu64((u64)d<<32 | (u32)p, EXT_TAG)); break; } case EXTO: { u32 d = *bc++; u32 p = *bc++; diff --git a/src/vm.h b/src/vm.h index 750f194d..646744b8 100644 --- a/src/vm.h +++ b/src/vm.h @@ -224,7 +224,7 @@ static inline void pushEnv(Scope* sc, u32* bc) { if (envCurr+1==envEnd) thrM("Stack overflow"); Env* e = envCurr+1; e->sc = sc; - e->pos = (u64)bc; + e->pos = ptr2u64(bc); envCurr = e; } static inline void popEnv() {