def sentry_literal_args(pysig, literal_args, args, kwargs): """Ensures that the given argument types (in *args* and *kwargs*) are literally typed for a function with the python signature *pysig* and the list of literal argument names in *literal_args*. Alternatively, this is the same as:: SentryLiteralArgs(literal_args).for_pysig(pysig).bind(*args, **kwargs) """ boundargs = pysig.bind(*args, **kwargs) # Find literal argument positions and whether it is satisfied. request_pos = set() missing = False for i, (k, v) in enumerate(boundargs.arguments.items()): if k in literal_args: request_pos.add(i) if not isinstance(v, types.Literal): missing = True if missing: # Yes, there are missing required literal arguments e = errors.ForceLiteralArg(request_pos) # A helper function to fold arguments def folded(args, kwargs): out = pysig.bind(*args, **kwargs).arguments.values() return tuple(out) raise e.bind_fold_arguments(folded)
def find_literally_calls(func_ir, argtypes): """An analysis to find `numba.literally` call inside the given IR. When an unsatisfied literal typing request is found, a `ForceLiteralArg` exception is raised. Parameters ---------- func_ir : numba.ir.FunctionIR argtypes : Sequence[numba.types.Type] The argument types. """ from numba.core import ir_utils marked_args = set() first_loc = {} # Scan for literally calls for blk in func_ir.blocks.values(): for assign in blk.find_exprs(op='call'): var = ir_utils.guard(ir_utils.get_definition, func_ir, assign.func) if isinstance(var, (ir.Global, ir.FreeVar)): fnobj = var.value else: fnobj = ir_utils.guard(ir_utils.resolve_func_from_module, func_ir, var) if fnobj is special.literally: # Found [arg] = assign.args defarg = func_ir.get_definition(arg) if isinstance(defarg, ir.Arg): argindex = defarg.index marked_args.add(argindex) first_loc.setdefault(argindex, assign.loc) # Signal the dispatcher to force literal typing for pos in marked_args: query_arg = argtypes[pos] do_raise = (isinstance(query_arg, types.InitialValue) and query_arg.initial_value is None) if do_raise: loc = first_loc[pos] raise errors.ForceLiteralArg(marked_args, loc=loc) if not isinstance(query_arg, (types.Literal, types.InitialValue)): loc = first_loc[pos] raise errors.ForceLiteralArg(marked_args, loc=loc)