def enable_slice_literals(): """Enable lowering for ``SliceLiteral``s. TODO: This can be removed once https://github.com/numba/numba/pull/6996 is merged and a release is made. """ from numba.core import types from numba.core.datamodel.models import SliceModel from numba.core.datamodel.registry import register_default from numba.core.imputils import lower_cast, lower_constant from numba.core.types.misc import SliceLiteral from numba.cpython.slicing import get_defaults register_default(numba.types.misc.SliceLiteral)(SliceModel) @property def key(self): return self.name SliceLiteral.key = key def make_slice_from_constant(context, builder, ty, pyval): sli = context.make_helper(builder, ty) lty = context.get_value_type(types.intp) ( default_start_pos, default_start_neg, default_stop_pos, default_stop_neg, default_step, ) = [ context.get_constant(types.intp, x) for x in get_defaults(context) ] step = pyval.step if step is None: step_is_neg = False step = default_step else: step_is_neg = step < 0 step = lty(step) start = pyval.start if start is None: if step_is_neg: start = default_start_neg else: start = default_start_pos else: start = lty(start) stop = pyval.stop if stop is None: if step_is_neg: stop = default_stop_neg else: stop = default_stop_pos else: stop = lty(stop) sli.start = start sli.stop = stop sli.step = step return sli._getvalue() @lower_constant(numba.types.SliceType) def constant_slice(context, builder, ty, pyval): if isinstance(ty, types.Literal): typ = ty.literal_type else: typ = ty return make_slice_from_constant(context, builder, typ, pyval) @lower_cast(numba.types.misc.SliceLiteral, numba.types.SliceType) def cast_from_literal(context, builder, fromty, toty, val): return make_slice_from_constant( context, builder, toty, fromty.literal_value, )
class BooleanLiteral(types.Literal, types.Boolean): def __init__(self, value): self._literal_init(value) name = 'Literal[bool]({})'.format(value) basetype = self.literal_type types.Boolean.__init__(self, name=name) def can_convert_to(self, typingctx, other): # similar to IntegerLiteral conv = typingctx.can_convert(self.literal_type, other) if conv is not None: return max(conv, types.Conversion.promote) types.Literal.ctor_map[bool] = BooleanLiteral register_default(BooleanLiteral)(numba.core.datamodel.models.BooleanModel) @lower_cast(BooleanLiteral, types.boolean) def literal_bool_cast(context, builder, fromty, toty, val): lit = context.get_constant_generic( builder, fromty.literal_type, fromty.literal_value, ) return context.cast(builder, lit, fromty.literal_type, toty) lower_builtin(operator.eq, BooleanLiteral, BooleanLiteral)(numba.cpython.builtins.const_eq_impl) lower_builtin(operator.ne, BooleanLiteral,