示例#1
0
文件: gen.py 项目: cpcloud/cysqlite3
def generate_function_body(func):
    sig, = func.nopython_signatures
    converters = [(arg, VALUE_EXTRACTORS[arg]) for arg in sig.args]
    resulter = RESULT_SETTERS[sig.return_type]

    args = []
    sequence = []

    for i, (argtype, converter) in enumerate(converters):
        arg = sub(load.argv, idx(i))
        converter_function = call[converter.__name__]
        argname = 'arg_{:d}'.format(i)
        if isinstance(argtype, types.Optional):
            if_statement, rest, arg = unnullify(arg, converter_function, argname, argtype)
        else:
            if_statement, rest, arg = fail_if_null(arg, converter_function, argname, argtype)

        sequence.append(if_statement)
        if rest is not None:
            sequence.append(rest)
        args.append(arg)

    result = call[func.__name__](*args)
    final_call = call[resulter.__name__](load.ctx, load.result_value)
    return sequence + [
        ast.Assign(targets=[store.result_value], value=result),
        ast.If(
            test=ast.Compare(
                left=load.result_value,
                ops=[ast.IsNot()],
                comparators=[NONE]
            ),
            body=[ast.Expr(value=final_call)],
            orelse=[ast.Expr(value=call.sqlite3_result_null(load.ctx))]
        ) if isinstance(sig.return_type, types.Optional) else (
            ast.Expr(value=final_call)
        )
    ]
示例#2
0
文件: gen.py 项目: cpcloud/cysqlite3
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
            )
        ]
    )