'Raw-copy the given payload into self.'

def _copy_payload(self, src_payload):

    context = self._context
    builder = self._builder
    ok = cgutils.alloca_once_value(builder, cgutils.true_bit)
    intp_t = context.get_value_type(types.intp)
    zero = ir.Constant(intp_t, 0)
    one = ir.Constant(intp_t, 1)
    payload_type = context.get_data_type(types.SetPayload(self._ty))
    payload_size = context.get_abi_sizeof(payload_type)
    entry_size = self._entrysize
    payload_size -= entry_size
    mask = src_payload.mask
    nentries = builder.add(one, mask)
    allocsize = builder.add(ir.Constant(intp_t, payload_size), builder.mul(ir.Constant(intp_t, entry_size), nentries))
    with builder.if_then(builder.load(ok), likely=True):
        meminfo = context.nrt.meminfo_new_varsize(builder, size=allocsize)
        alloc_ok = cgutils.is_null(builder, meminfo)
        with builder.if_else(cgutils.is_null(builder, meminfo), likely=False) as (if_error, if_ok):
            with if_error:
                builder.store(cgutils.false_bit, ok)
            with if_ok:
                self._set.meminfo = meminfo
                payload = self.payload
                payload.used = src_payload.used
                payload.fill = src_payload.fill
                payload.finger = zero
                payload.mask = mask
                cgutils.raw_memcpy(builder, payload.entries, src_payload.entries, nentries, entry_size)
                if DEBUG_ALLOCS:
                    context.printf(builder, 'allocated    %zd    bytes    for    set    at    %p:    mask    =    %zd\n', allocsize, payload.ptr, mask)
    return builder.load(ok)
