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