def setitem_list(context, builder, sig, args): inst = ListInstance(context, builder, sig.args[0], args[0]) slice = slicing.Slice(context, builder, value=args[1]) cgutils.guard_invalid_slice(context, builder, slice) inst.fix_slice(slice) slice_len = slicing.get_slice_length(builder, slice) zero = ir.Constant(slice_len.type, 0) one = ir.Constant(slice_len.type, 1) with builder.if_then(builder.icmp_signed('!=', slice.step, one), likely=False): msg = "unsupported del list[start:stop:step] with step != 1" context.call_conv.return_user_exc(builder, NotImplementedError, (msg,)) # Compute the real stop, e.g. for dest[2:0] start = slice.start real_stop = builder.add(start, slice_len) # Size of the list tail, after the end of slice tail_size = builder.sub(inst.size, real_stop) inst.move(start, real_stop, tail_size) inst.resize(builder.sub(inst.size, slice_len)) return context.get_dummy_value()
def setitem_list(context, builder, sig, args): inst = ListInstance(context, builder, sig.args[0], args[0]) slice = slicing.Slice(context, builder, value=args[1]) cgutils.guard_invalid_slice(context, builder, slice) inst.fix_slice(slice) slice_len = slicing.get_slice_length(builder, slice) zero = ir.Constant(slice_len.type, 0) one = ir.Constant(slice_len.type, 1) with builder.if_then(builder.icmp_signed("!=", slice.step, one), likely=False): msg = "unsupported del list[start:stop:step] with step != 1" context.call_conv.return_user_exc(builder, NotImplementedError, (msg,)) # Compute the real stop, e.g. for dest[2:0] start = slice.start real_stop = builder.add(start, slice_len) # Size of the list tail, after the end of slice tail_size = builder.sub(inst.size, real_stop) inst.move(start, real_stop, tail_size) inst.resize(builder.sub(inst.size, slice_len)) return context.get_dummy_value()
def setitem_list(context, builder, sig, args): dest = ListInstance(context, builder, sig.args[0], args[0]) slice = slicing.Slice(context, builder, value=args[1]) src = ListInstance(context, builder, sig.args[2], args[2]) cgutils.guard_invalid_slice(context, builder, slice) dest.fix_slice(slice) src_size = src.size avail_size = slicing.get_slice_length(builder, slice) size_delta = builder.sub(src.size, avail_size) zero = ir.Constant(size_delta.type, 0) one = ir.Constant(size_delta.type, 1) with builder.if_else(builder.icmp_signed('==', slice.step, one)) as (then, otherwise): with then: # Slice step == 1 => we can resize # Compute the real stop, e.g. for dest[2:0] = [...] real_stop = builder.add(slice.start, avail_size) # Size of the list tail, after the end of slice tail_size = builder.sub(dest.size, real_stop) with builder.if_then(builder.icmp_signed('>', size_delta, zero)): # Grow list then move list tail dest.resize(builder.add(dest.size, size_delta)) dest.move(builder.add(real_stop, size_delta), real_stop, tail_size) with builder.if_then(builder.icmp_signed('<', size_delta, zero)): # Move list tail then shrink list dest.move(builder.add(real_stop, size_delta), real_stop, tail_size) dest.resize(builder.add(dest.size, size_delta)) dest_offset = slice.start with cgutils.for_range(builder, src_size) as loop: value = src.getitem(loop.index) dest.setitem(builder.add(loop.index, dest_offset), value) with otherwise: with builder.if_then(builder.icmp_signed('!=', size_delta, zero)): msg = "cannot resize extended list slice with step != 1" context.call_conv.return_user_exc(builder, ValueError, (msg, )) with cgutils.for_range_slice_generic(builder, slice.start, slice.stop, slice.step) as (pos_range, neg_range): with pos_range as (index, count): value = src.getitem(count) dest.setitem(index, value) with neg_range as (index, count): value = src.getitem(count) dest.setitem(index, value) return context.get_dummy_value()
def setitem_list(context, builder, sig, args): dest = ListInstance(context, builder, sig.args[0], args[0]) slice = slicing.Slice(context, builder, value=args[1]) src = ListInstance(context, builder, sig.args[2], args[2]) cgutils.guard_invalid_slice(context, builder, slice) dest.fix_slice(slice) src_size = src.size avail_size = slicing.get_slice_length(builder, slice) size_delta = builder.sub(src.size, avail_size) zero = ir.Constant(size_delta.type, 0) one = ir.Constant(size_delta.type, 1) with builder.if_else(builder.icmp_signed("==", slice.step, one)) as (then, otherwise): with then: # Slice step == 1 => we can resize # Compute the real stop, e.g. for dest[2:0] = [...] real_stop = builder.add(slice.start, avail_size) # Size of the list tail, after the end of slice tail_size = builder.sub(dest.size, real_stop) with builder.if_then(builder.icmp_signed(">", size_delta, zero)): # Grow list then move list tail dest.resize(builder.add(dest.size, size_delta)) dest.move(builder.add(real_stop, size_delta), real_stop, tail_size) with builder.if_then(builder.icmp_signed("<", size_delta, zero)): # Move list tail then shrink list dest.move(builder.add(real_stop, size_delta), real_stop, tail_size) dest.resize(builder.add(dest.size, size_delta)) dest_offset = slice.start with cgutils.for_range(builder, src_size) as loop: value = src.getitem(loop.index) dest.setitem(builder.add(loop.index, dest_offset), value) with otherwise: with builder.if_then(builder.icmp_signed("!=", size_delta, zero)): msg = "cannot resize extended list slice with step != 1" context.call_conv.return_user_exc(builder, ValueError, (msg,)) with cgutils.for_range_slice_generic(builder, slice.start, slice.stop, slice.step) as ( pos_range, neg_range, ): with pos_range as (index, count): value = src.getitem(count) dest.setitem(index, value) with neg_range as (index, count): value = src.getitem(count) dest.setitem(index, value) return context.get_dummy_value()
def getslice_list(context, builder, sig, args): inst = ListInstance(context, builder, sig.args[0], args[0]) slice = slicing.Slice(context, builder, value=args[1]) cgutils.guard_invalid_slice(context, builder, slice) inst.fix_slice(slice) # Allocate result and populate it result_size = slicing.get_slice_length(builder, slice) result = ListInstance.allocate(context, builder, sig.return_type, result_size) result.size = result_size with cgutils.for_range_slice_generic(builder, slice.start, slice.stop, slice.step) as (pos_range, neg_range): with pos_range as (idx, count): value = inst.getitem(idx) result.inititem(count, value) with neg_range as (idx, count): value = inst.getitem(idx) result.inititem(count, value) return impl_ret_new_ref(context, builder, sig.return_type, result.value)