Example #1
0
def gen_finalize(cls, name):
    class_name = cls.__name__
    sig, = cls.class_type.jitmethods['finalize'].nopython_signatures
    output_call = ast.Expr(
        value=call[
            RESULT_SETTERS[sig.return_type].__name__
        ](load.ctx, load.final_value)
    )
    final_result = ast.If(
        test=ast.Compare(
            left=load.final_value,
            ops=[ast.IsNot()],
            comparators=[NONE],
        ),
        body=[output_call],
        orelse=[ast.Expr(value=call.sqlite3_result_null(load.ctx))]
    ) if isinstance(sig.return_type, types.Optional) else output_call
    return ast.Module(
        body=[
            # no imports because this is always defined with a step function,
            # which has the imports
            ast.FunctionDef(
                name=name,
                args=ast.arguments(
                    args=[arg.ctx],
                    vararg=None,
                    kwonlyargs=[],
                    kw_defaults=[],
                    kwargs=None,
                    defaults=[],
                ),
                body=[
                    ast.Assign(
                        targets=[
                            store.agg_ctx
                        ],
                        value=call.unsafe_cast(
                            call.sqlite3_aggregate_context(
                                load.ctx,
                                ast.Num(n=0)
                            ),
                            load[class_name]
                        )
                    ),
                    ast.If(
                        test=call.not_null(load.agg_ctx),
                        body=[
                            ast.Assign(
                                targets=[
                                    store.final_value,
                                ],
                                value=call(attr.agg_ctx.finalize)
                            ),
                            final_result,
                        ],
                        orelse=[],
                    )
                ],
                decorator_list=[
                    call.cfunc(call.void(load.voidptr), nopython=TRUE)
                ],
                returns=None
            )
        ]
    )
Example #2
0
def gen_step(cls, name):
    class_name = cls.__name__
    sig, = cls.class_type.jitmethods['step'].nopython_signatures
    args = sig.args[1:]

    body = [
        ast.Assign(
            targets=[store['arg_{:d}'.format(i)]],
            value=sub(load.argv, idx(i))
        )
        for i, arg in enumerate(args)
    ]

    step_args = []
    statements = []

    for i, a in enumerate(args):
        if isinstance(a, types.Optional):
            func = unnullify
        else:
            func = fail_if_null
        if_statement, rest, argument = func(
            load['arg_{:d}'.format(i)],
            call[VALUE_EXTRACTORS[a].__name__],
            'value_{:d}'.format(i),
            a
        )
        statements.append(if_statement)
        if rest is not None:
            statements.append(rest)
        step_args.append(argument)

    body.extend([
        ast.Assign(
            targets=[
                store.agg_ctx
            ],
            value=call.unsafe_cast(
                call.sqlite3_aggregate_context(
                    load.ctx,
                    call.sizeof(load[class_name])
                ),
                load[class_name]
            )
        ),
        ast.If(
            test=call.not_null(load.agg_ctx),
            body=statements + [
                ast.Expr(value=call(attr.agg_ctx.step, *step_args))
            ],
            orelse=[]
        )
    ])
    decorator_list = [
        call.cfunc(
            call.void(load.voidptr, load.intc, call.CPointer(load.voidptr)),
            nopython=TRUE
        )
    ]
    function_signature = ast.arguments(
        args=[arg.ctx, arg.argc, arg.argv],
        vararg=None,
        kwonlyargs=[],
        kw_defaults=[],
        kwargs=None,
        defaults=[],
    )
    mod = ast.Module(
        body=[
            import_from.numba[alias.cfunc],
            import_from.numba.types[
                alias.void, alias.voidptr, alias.intc, alias.CPointer
            ],
            ast.FunctionDef(
                name=name,
                args=function_signature,
                body=body,
                decorator_list=decorator_list,
                returns=None
            )
        ]
    )
    return mod