def gen_scalar(func, name): return 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=ast.arguments( args=[ arg.ctx, arg.argc, arg.argv, ], vararg=None, kwonlyargs=[], kw_defaults=[], kwargs=None, defaults=[], ), body=generate_function_body(func), decorator_list=[ call.cfunc( call.void( load.voidptr, load.intc, call.CPointer(load.voidptr) ), nopython=TRUE ) ], returns=None ) ] )
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 ) ] )
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