def push_field(self, num, value): ptr = rffi.ptradd(self.ll_buffer, self.shape.ll_positions[num]) TP = lltype.typeOf(value) # Handle bitfields for c in unroll_letters_for_numbers: if LL_TYPEMAP[c] is TP and self.shape.ll_bitsizes: # Modify the current value with the bitfield changed bitsize = self.shape.ll_bitsizes[num] numbits = NUM_BITS(bitsize) if numbits: lowbit = LOW_BIT(bitsize) bitmask = BIT_MASK(numbits, TP) masktype = lltype.typeOf(bitmask) value = rffi.cast(masktype, value) current = rffi.cast(masktype, read_ptr(ptr, 0, TP)) current &= ~(bitmask << lowbit) current |= (value & bitmask) << lowbit value = rffi.cast(TP, current) break write_ptr(ptr, 0, value)
def cast_pos(self, i, ll_t): pos = rffi.ptradd(self.ll_buffer, self.shape.ll_positions[i]) value = read_ptr(pos, 0, ll_t) # Handle bitfields for c in unroll_letters_for_numbers: if LL_TYPEMAP[c] is ll_t and self.shape.ll_bitsizes: bitsize = self.shape.ll_bitsizes[i] numbits = NUM_BITS(bitsize) if numbits: lowbit = LOW_BIT(bitsize) bitmask = BIT_MASK(numbits, ll_t) masktype = lltype.typeOf(bitmask) value = rffi.cast(masktype, value) value >>= lowbit value &= bitmask if ll_t is lltype.Bool or signedtype(ll_t._type): sign = (value >> (numbits - 1)) & 1 if sign: value -= bitmask + 1 value = rffi.cast(ll_t, value) break return value