コード例 #1
0
ファイル: target.py プロジェクト: fkaufer/impyla
 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)
コード例 #2
0
ファイル: abi.py プロジェクト: vamseeyarla/impyla
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
コード例 #3
0
ファイル: abi.py プロジェクト: awleblang/impyla
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
コード例 #4
0
ファイル: target.py プロジェクト: fkaufer/impyla
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()
コード例 #5
0
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()
コード例 #6
0
ファイル: stringimpl.py プロジェクト: vamseeyarla/impyla
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()
コード例 #7
0
 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)
コード例 #8
0
ファイル: abi.py プロジェクト: vamseeyarla/impyla
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
コード例 #9
0
def len_stringval_impl(context, builder, sig, args):
    [s] = args
    val = StringValStruct(context, builder, value=s)
    return val.len
コード例 #10
0
def StringVal_ptr(context, builder, typ, value):
    """StringVal::ptr"""
    iv = StringValStruct(context, builder, value=value)
    return iv.ptr
コード例 #11
0
def StringVal_len(context, builder, typ, value):
    """StringVal::len"""
    iv = StringValStruct(context, builder, value=value)
    return iv.len