Exemple #1
0
def resolve_overloads(o, scope, bound):
    """
    Resolve the signatures of overloaded methods in the given scope. Further
    resolve any type variables listed in `bound` by their replacement.
    """
    result = Dispatcher()
    for (f, signature, kwds) in o.overloads:
        new_sig = resolve(signature, scope, bound)
        new_sig = to_blaze(new_sig) # Use blaze's coercion rules for now
        overload(new_sig, result, **kwds)(f)
    return result
Exemple #2
0
    def decorator(f):
        func = lookup_previous(f)
        if isinstance(func, Kernel):
            func = func.dispatcher
        elif isinstance(func, types.FunctionType):
            raise TypeError(
                "Function %s in current scope is not overloadable" % (func,))
        else:
            func = Dispatcher()

        dispatcher = overload(signature, func=func)(f)

        if isinstance(f, types.FunctionType):
            kernel = Kernel(dispatcher)
        else:
            assert isinstance(f, Kernel), f
            kernel = f

        kernel.add_metadata(metadata)
        return kernel
Exemple #3
0
    def decorator(f):
        func = lookup_previous(f)
        if isinstance(func, BlazeFunc):
            func = func.dispatcher
        elif isinstance(func, types.FunctionType):
            raise TypeError(
                "Function %s in current scope is not overloadable" % (func,))
        else:
            func = Dispatcher()

        dispatcher = overload(signature, func=func)(f)

        if isinstance(f, types.FunctionType):
            kernel = BlazeFunc(dispatcher)
        else:
            assert isinstance(f, BlazeFunc), f
            kernel = f

        metadata.setdefault('elementwise', True)
        kernel.add_metadata(metadata)
        if impl != 'python':
            kernel.implement(f, signature, impl, f)
        return kernel