提交 093665d9 authored 作者: Adrian Seyboldt's avatar Adrian Seyboldt 提交者: Adrian Seyboldt

Fix None in slice for numba boxing

上级 0f867394
import operator import operator
import sys
import warnings import warnings
from contextlib import contextmanager from contextlib import contextmanager
from functools import singledispatch from functools import singledispatch
...@@ -10,7 +11,7 @@ import numba.np.unsafe.ndarray as numba_ndarray ...@@ -10,7 +11,7 @@ import numba.np.unsafe.ndarray as numba_ndarray
import numpy as np import numpy as np
import scipy import scipy
import scipy.special import scipy.special
from llvmlite.ir import Type as llvm_Type from llvmlite import ir
from numba import types from numba import types
from numba.core.errors import TypingError from numba.core.errors import TypingError
from numba.cpython.unsafe.tuple import tuple_setitem # noqa: F401 from numba.cpython.unsafe.tuple import tuple_setitem # noqa: F401
...@@ -131,7 +132,7 @@ def create_numba_signature( ...@@ -131,7 +132,7 @@ def create_numba_signature(
def slice_new(self, start, stop, step): def slice_new(self, start, stop, step):
fnty = llvm_Type.function(self.pyobj, [self.pyobj, self.pyobj, self.pyobj]) fnty = ir.FunctionType(self.pyobj, [self.pyobj, self.pyobj, self.pyobj])
fn = self._get_function(fnty, name="PySlice_New") fn = self._get_function(fnty, name="PySlice_New")
return self.builder.call(fn, [start, stop, step]) return self.builder.call(fn, [start, stop, step])
...@@ -150,11 +151,33 @@ def enable_slice_boxing(): ...@@ -150,11 +151,33 @@ def enable_slice_boxing():
This makes it possible to return an Numba's internal representation of a This makes it possible to return an Numba's internal representation of a
``slice`` object as a proper ``slice`` to Python. ``slice`` object as a proper ``slice`` to Python.
""" """
start = c.builder.extract_value(val, 0)
stop = c.builder.extract_value(val, 1)
none_val = ir.Constant(ir.IntType(64), sys.maxsize)
start_is_none = c.builder.icmp_signed("==", start, none_val)
start = c.builder.select(
start_is_none,
c.pyapi.get_null_object(),
c.box(types.int64, start),
)
stop_is_none = c.builder.icmp_signed("==", stop, none_val)
stop = c.builder.select(
stop_is_none,
c.pyapi.get_null_object(),
c.box(types.int64, stop),
)
start = c.box(types.int64, c.builder.extract_value(val, 0))
stop = c.box(types.int64, c.builder.extract_value(val, 1))
if typ.has_step: if typ.has_step:
step = c.box(types.int64, c.builder.extract_value(val, 2)) step = c.builder.extract_value(val, 2)
step_is_none = c.builder.icmp_signed("==", step, none_val)
step = c.builder.select(
step_is_none,
c.pyapi.get_null_object(),
c.box(types.int64, step),
)
else: else:
step = c.pyapi.get_null_object() step = c.pyapi.get_null_object()
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论