Esempio n. 1
0
def iternext_setiter(context, builder, sig, args, result):
    iterty, = sig.args
    it, = args
    iterobj = context.make_helper(builder, iterty, value=it)

    fnty = lir.FunctionType(lir.IntType(1),
                            [lir.IntType(8).as_pointer(), lir.IntType(8).as_pointer()])
    fn = builder.module.get_or_insert_function(fnty, name="set_itervalid_string")
    is_valid = builder.call(fn, [iterobj.itp, iterobj.set])
    result.set_valid(is_valid)

    fnty = lir.FunctionType(lir.IntType(8).as_pointer(),
                            [lir.IntType(8).as_pointer()])
    fn = builder.module.get_or_insert_function(fnty, name="set_nextval_string")
    kind = numba.cpython.unicode.PY_UNICODE_1BYTE_KIND

    def std_str_to_unicode(std_str):
        length = sdc.str_ext.get_std_str_len(std_str)
        ret = numba.cpython.unicode._empty_string(kind, length)
        sdc.str_arr_ext._memcpy(
            ret._data, sdc.str_ext.get_c_str(std_str), length, 1)
        sdc.str_ext.del_str(std_str)
        return ret

    with builder.if_then(is_valid):
        val = builder.call(fn, [iterobj.itp])
        val = context.compile_internal(
            builder,
            std_str_to_unicode,
            string_type(sdc.str_ext.std_str_type),
            [val])
        result.yield_(val)
Esempio n. 2
0
        def generic(self, args, kws):
            assert not kws
            [in_arr, in_idx] = args
            is_arr_series = False
            is_idx_series = False
            is_arr_dt_index = False

            if not isinstance(in_arr, SeriesType) and not isinstance(
                    in_idx, SeriesType):
                return None

            if isinstance(in_arr, SeriesType):
                in_arr = series_to_array_type(in_arr)
                is_arr_series = True
                if in_arr.dtype == types.NPDatetime('ns'):
                    is_arr_dt_index = True

            if isinstance(in_idx, SeriesType):
                in_idx = series_to_array_type(in_idx)
                is_idx_series = True

            # TODO: dt_index
            if in_arr == string_array_type:
                # XXX fails due in overload
                # compile_internal version results in symbol not found!
                # sig = self.context.resolve_function_type(
                #     operator.getitem, (in_arr, in_idx), kws)
                # HACK to get avoid issues for now
                if isinstance(in_idx, (types.Integer, types.IntegerLiteral)):
                    sig = string_type(in_arr, in_idx)
                else:
                    sig = GetItemStringArray.generic(self, (in_arr, in_idx),
                                                     kws)
            elif in_arr == list_string_array_type:
                # TODO: split view
                # mimic array indexing for list
                if (isinstance(in_idx, types.Array) and in_idx.ndim == 1
                        and isinstance(in_idx.dtype,
                                       (types.Integer, types.Boolean))):
                    sig = signature(in_arr, in_arr, in_idx)
                else:
                    sig = numba.typing.collections.GetItemSequence.generic(
                        self, (in_arr, in_idx), kws)
            elif in_arr == string_array_split_view_type:
                sig = GetItemStringArraySplitView.generic(
                    self, (in_arr, in_idx), kws)
            else:
                out = get_array_index_type(in_arr, in_idx)
                sig = signature(out.result, in_arr, out.index)

            if sig is not None:
                arg1 = sig.args[0]
                arg2 = sig.args[1]
                if is_arr_series:
                    sig.return_type = if_arr_to_series_type(sig.return_type)
                    arg1 = if_arr_to_series_type(arg1)
                if is_idx_series:
                    arg2 = if_arr_to_series_type(arg2)
                sig.args = (arg1, arg2)
                # dt_index and Series(dt64) should return Timestamp
                if is_arr_dt_index and sig.return_type == types.NPDatetime(
                        'ns'):
                    sig.return_type = pandas_timestamp_type
            return sig