def get_constant_struct(self, builder, ty, val): # override for converting literals to *Vals, incl. None if ty in self._impala_types and val is None: iv = TYPE_LAYOUT[ty](self, builder) _set_is_null(builder, iv, cgutils.true_bit) return iv._getvalue() elif ty == BooleanVal: const = lc.Constant.int(lc.Type.int(8), val) return BooleanVal_ctor(self, builder, None, [const]) elif ty == TinyIntVal: const = lc.Constant.int(lc.Type.int(8), val) return TinyIntVal_ctor(self, builder, None, [const]) elif ty == SmallIntVal: const = lc.Constant.int(lc.Type.int(16), val) return SmallIntVal_ctor(self, builder, None, [const]) elif ty == IntVal: const = lc.Constant.int(lc.Type.int(32), val) return IntVal_ctor(self, builder, None, [const]) elif ty == BigIntVal: const = lc.Constant.int(lc.Type.int(64), val) return BigIntVal_ctor(self, builder, None, [const]) elif ty == FloatVal: const = lc.Constant.real(lc.Type.float(), val) return FloatVal_ctor(self, builder, None, [const]) elif ty == DoubleVal: const = lc.Constant.real(lc.Type.double(), val) return DoubleVal_ctor(self, builder, None, [const]) elif ty == StringVal: iv = StringValStruct(self, builder) _set_is_null(builder, iv, cgutils.false_bit) iv.len = lc.Constant.int(lc.Type.int(32), len(val)) iv.ptr = self.get_constant_string(builder, ntypes.string, val) return iv._getvalue() else: return super(ImpalaTargetContext, self).get_constant_struct(builder, ty, val)
def raise_return_type(context, builder, ty, val): if ty == BooleanVal: bv = BooleanValStruct(context, builder) is_null = builder.trunc(val, lc.Type.int(8)) _set_is_null(builder, bv, is_null) shifted = builder.lshr(val, lc.Constant.int(lc.Type.int(16), 8)) bv.val = builder.trunc(shifted, lc.Type.int(8)) return bv._getvalue() elif ty == TinyIntVal: tiv = TinyIntValStruct(context, builder) is_null = builder.trunc(val, lc.Type.int(8)) _set_is_null(builder, tiv, is_null) shifted = builder.lshr(val, lc.Constant.int(lc.Type.int(16), 8)) tiv.val = builder.trunc(shifted, lc.Type.int(8)) return tiv._getvalue() elif ty == SmallIntVal: siv = SmallIntValStruct(context, builder) is_null = builder.trunc(val, lc.Type.int(8)) _set_is_null(builder, siv, is_null) shifted = builder.lshr(val, lc.Constant.int(lc.Type.int(32), 16)) siv.val = builder.trunc(shifted, lc.Type.int(16)) return siv._getvalue() elif ty == IntVal: iv = IntValStruct(context, builder) is_null = builder.trunc(val, lc.Type.int(8)) _set_is_null(builder, iv, is_null) shifted = builder.lshr(val, lc.Constant.int(lc.Type.int(64), 32)) iv.val = builder.trunc(shifted, lc.Type.int(32)) return iv._getvalue() elif ty == BigIntVal: biv = BigIntValStruct(context, builder) is_null = builder.extract_value(val, 0) _set_is_null(builder, biv, is_null) biv.val = builder.extract_value(val, 1) return biv._getvalue() elif ty == FloatVal: fv = FloatValStruct(context, builder) is_null = builder.trunc(val, lc.Type.int(8)) _set_is_null(builder, fv, is_null) shifted = builder.lshr(val, lc.Constant.int(lc.Type.int(64), 32)) truncated = builder.trunc(shifted, lc.Type.int(32)) fv.val = builder.bitcast(truncated, lc.Type.float()) return fv._getvalue() elif ty == DoubleVal: dv = DoubleValStruct(context, builder) is_null = builder.extract_value(val, 0) _set_is_null(builder, dv, is_null) dv.val = builder.extract_value(val, 1) return dv._getvalue() elif ty == StringVal: sv = StringValStruct(context, builder) packed = builder.extract_value(val, 0) is_null = builder.trunc(packed, lc.Type.int(8)) _set_is_null(builder, sv, is_null) shifted = builder.lshr(packed, lc.Constant.int(lc.Type.int(64), 32)) sv.len = builder.trunc(shifted, lc.Type.int(32)) sv.ptr = builder.extract_value(val, 1) return sv._getvalue() else: return val
def StringVal_ctor(context, builder, sig, args): """StringVal(ntypes.string)""" [x] = args iv = StringValStruct(context, builder) _set_is_null(builder, iv, cgutils.false_bit) fndesc = lowering.ExternalFunctionDescriptor('strlen', ntypes.uintp, [ntypes.CPointer(ntypes.char)]) func = context.declare_external_function(cgutils.get_module(builder), fndesc) strlen_x = context.call_external_function(builder, func, fndesc.argtypes, [x]) len_x = builder.trunc(strlen_x, lc.Type.int(32)) iv.len = len_x iv.ptr = x return iv._getvalue()
def StringVal_ctor(context, builder, sig, args): """StringVal(ntypes.string)""" [x] = args iv = StringValStruct(context, builder) _set_is_null(builder, iv, cgutils.false_bit) fndesc = lowering.ExternalFunctionDescriptor( 'strlen', ntypes.uintp, [ntypes.CPointer(ntypes.char)]) func = context.declare_external_function(cgutils.get_module(builder), fndesc) strlen_x = context.call_external_function(builder, func, fndesc.argtypes, [x]) len_x = builder.trunc(strlen_x, lc.Type.int(32)) iv.len = len_x iv.ptr = x return iv._getvalue()
def string_split_2(context, builder, sig, args): module = cgutils.get_module(builder) precomp_func = context._get_precompiled_function("StringSplitImpl") func = module.get_or_insert_function(precomp_func.type.pointee, precomp_func.name) fnctx_arg = context.get_arguments(cgutils.get_function(builder))[0] cfnctx_arg = builder.bitcast(fnctx_arg, func.args[0].type) [s, sep] = args maxsplit = context.get_constant_struct(builder, IntVal, -1) cs = _conv_numba_struct_to_clang(builder, s, func.args[1].type) csep = _conv_numba_struct_to_clang(builder, sep, func.args[2].type) cmaxsplit = _conv_numba_struct_to_clang(builder, maxsplit, func.args[3].type) # result is StringVal with an array of StringVals in the buffer array_as_lowered_struct = builder.call(func, [cfnctx_arg, cs, csep, cmaxsplit]) array_as_struct = raise_return_type(context, builder, StringVal, array_as_lowered_struct) array_as_StringVal = StringValStruct(context, builder, value=array_as_struct) array_as_numba = context.make_array(sig.return_type)(context, builder) data_ptr = builder.bitcast(array_as_StringVal.ptr, array_as_numba.data.type) array_as_numba.data = data_ptr return array_as_numba._getvalue()
def lower_return_type(context, builder, ty, val): """ Convert value to fit ABI requirement """ if ty == BooleanVal: # Pack structure into int16 # Endian specific iv = BooleanValStruct(context, builder, value=val) lower = builder.zext(_get_is_null(builder, iv), lc.Type.int(16)) upper = builder.zext(iv.val, lc.Type.int(16)) asint16 = builder.shl(upper, lc.Constant.int(lc.Type.int(16), 8)) asint16 = builder.or_(asint16, lower) return asint16 elif ty == TinyIntVal: # Pack structure into int16 # Endian specific iv = TinyIntValStruct(context, builder, value=val) lower = builder.zext(_get_is_null(builder, iv), lc.Type.int(16)) upper = builder.zext(iv.val, lc.Type.int(16)) asint16 = builder.shl(upper, lc.Constant.int(lc.Type.int(16), 8)) asint16 = builder.or_(asint16, lower) return asint16 elif ty == SmallIntVal: # Pack structure into int32 # Endian specific iv = SmallIntValStruct(context, builder, value=val) lower = builder.zext(_get_is_null(builder, iv), lc.Type.int(32)) upper = builder.zext(iv.val, lc.Type.int(32)) asint32 = builder.shl(upper, lc.Constant.int(lc.Type.int(32), 16)) asint32 = builder.or_(asint32, lower) return asint32 elif ty == IntVal: # Pack structure into int64 # Endian specific iv = IntValStruct(context, builder, value=val) lower = builder.zext(_get_is_null(builder, iv), lc.Type.int(64)) upper = builder.zext(iv.val, lc.Type.int(64)) asint64 = builder.shl(upper, lc.Constant.int(lc.Type.int(64), 32)) asint64 = builder.or_(asint64, lower) return asint64 elif ty == BigIntVal: # Pack structure into { int8, int64 } # Endian specific iv = BigIntValStruct(context, builder, value=val) is_null = builder.zext(_get_is_null(builder, iv), lc.Type.int(8)) asstructi8i64 = builder.insert_value( lc.Constant.undef(lc.Type.struct([lc.Type.int(8), lc.Type.int(64)])), is_null, 0) asstructi8i64 = builder.insert_value(asstructi8i64, iv.val, 1) return asstructi8i64 elif ty == FloatVal: # Pack structure into int64 # Endian specific iv = FloatValStruct(context, builder, value=val) lower = builder.zext(_get_is_null(builder, iv), lc.Type.int(64)) asint32 = builder.bitcast(iv.val, lc.Type.int(32)) upper = builder.zext(asint32, lc.Type.int(64)) asint64 = builder.shl(upper, lc.Constant.int(lc.Type.int(64), 32)) asint64 = builder.or_(asint64, lower) return asint64 elif ty == DoubleVal: # Pack structure into { int8, double } # Endian specific iv = DoubleValStruct(context, builder, value=val) is_null = builder.zext(_get_is_null(builder, iv), lc.Type.int(8)) asstructi8double = builder.insert_value( lc.Constant.undef( lc.Type.struct([lc.Type.int(8), lc.Type.double()])), is_null, 0) asstructi8double = builder.insert_value(asstructi8double, iv.val, 1) return asstructi8double elif ty == StringVal: # Pack structure into { int64, int8* } # Endian specific iv = StringValStruct(context, builder, value=val) is_null = builder.zext(_get_is_null(builder, iv), lc.Type.int(64)) len_ = builder.zext(iv.len, lc.Type.int(64)) asint64 = builder.shl(len_, lc.Constant.int(lc.Type.int(64), 32)) asint64 = builder.or_(asint64, is_null) asstructi64i8p = builder.insert_value( lc.Constant.undef( lc.Type.struct( [lc.Type.int(64), lc.Type.pointer(lc.Type.int(8))])), asint64, 0) asstructi64i8p = builder.insert_value(asstructi64i8p, iv.ptr, 1) return asstructi64i8p else: return val
def len_stringval_impl(context, builder, sig, args): [s] = args val = StringValStruct(context, builder, value=s) return val.len
def StringVal_ptr(context, builder, typ, value): """StringVal::ptr""" iv = StringValStruct(context, builder, value=value) return iv.ptr
def StringVal_len(context, builder, typ, value): """StringVal::len""" iv = StringValStruct(context, builder, value=value) return iv.len