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)
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