Ejemplo n.º 1
0
def test_builder_module1():
    integer = make_type_integer()
    unit = make_translation_unit()
    m = translation_unit_make_module(unit, "mod1")

    f = scope_add_function(unit.global_scope,
                           "f",
                           args=["a", "b"],
                           return_var="c")
    a, b = f.args
    a.intent = "in"
    a.type = integer
    b.intent = "in"
    b.type = integer
    c = f.return_var
    c.type = integer
    d = function_make_var(f, name="d", type=integer)
    f.body.extend([
        asr.Assignment(d, asr.Num(n=5, type=integer)),
        asr.Assignment(
            c,
            asr.BinOp(d, asr.Mul(), asr.BinOp(a, asr.Add(), b, integer),
                      integer))
    ])

    a = asr.Variable(name="a", intent="in", type=integer)
    b = asr.Variable(name="b", intent="in", type=integer)
    c = asr.Variable(name="c", type=integer)
    f = scope_add_function(m.symtab, name="g", args=[a, b], return_var=c)

    verify_asr(unit)
    a = asr_to_ast.asr_to_ast(unit)
    s = ast_to_src(a)

    # Check that the generated source code contains a few "key" parts, which
    # are reasonably robust against changes in the way the source code is
    # generated from ASR.
    def has(s, a):
        assert s.find(a) > 0

    has(s, "function f(a, b)")
    has(s, "d = 5\n")
    has(s, "(a + b)")
    has(s, "interface\n")
    has(s, "function g(a, b)")
Ejemplo n.º 2
0
def process_function(scope, node):
    types = process_type(node.type)
    arg_names = []
    for arg in node.get_arguments():
        arg_names.append(arg.spelling)
    type = make_type_integer()
    return_var = asr.Variable(name=node.spelling, type=type)
    f = scope_add_function(scope, node.spelling, args=arg_names,
            return_var=return_var)
    for a in f.args:
        a.intent = "in"
    f.bind = asr.Bind(lang="c", name=node.spelling)
Ejemplo n.º 3
0
def convert_function(symtab, table, f):
    assert isinstance(f, Procedure)
    assert isinstance(f.name, str)
    assert isinstance(f.type, str)
    return_var = asr.Variable(name=f.name, type=string_to_type(f.type))
    lf = scope_add_function(symtab, f.name, return_var=return_var)
    args = []
    for arg in f.args:
        assert isinstance(arg, VarIdx)
        larg = convert_arg(table, lf.symtab, arg.idx)
        scope_add_symbol(lf.symtab, larg)
        args.append(larg)
    lf.args = args
Ejemplo n.º 4
0
    def visit_Function(self, node):
        name = self.visit_object(node.name)
        symtab = self.visit_object(node.symtab)
        self._lookup = 1
        self._scope = symtab
        args = self.visit_sequence(node.args)
        body = self.visit_sequence(node.body)
        self._lookup = 0
        if node.bind:
            bind = self.visit(node.bind)
        else:
            bind = None
        tmp = asr.VariableOld(name="a", type=make_type_integer())
        f = asr.Function(name=name, args=args, body=body, bind=bind,
            symtab=symtab, return_var=tmp)
        return_var = function_make_var(f, name="r", type=self.visit(node.return_var.type))
        return_var.dummy = True
        f.return_var = return_var

        cname = node.name + "_c_wrapper"
        mangled_name = '__' + self._modname + '_MOD_' + node.name.lower()
        bind = asr.Bind(lang="c", name=mangled_name)
        cargs = []
        args2 = []
        type1 = make_type_integer()
        type1.dims = [asr.dimension(asr.Num(n=1, type=make_type_integer()))]
        type2 = make_type_integer()
        type2.dims = [
            asr.dimension(asr.Num(n=1, type=make_type_integer())),
            asr.dimension(asr.Num(n=1, type=make_type_integer()))
            ]
        c_desc1 = scope_add_function(
            symtab,
            "c_desc1_int32",
            args=[
                asr.VariableOld(
                    name="A",
                    intent="in",
                    type=type1
                )
            ],
            return_var=asr.VariableOld(
                name="c_desc1_int32",
                type=asr.Derived(name="c_desc1_t")
            ),
            module = "gfort_interop"
        )
        c_desc2 = scope_add_function(
            symtab,
            "c_desc2_int32",
            args=[
                asr.VariableOld(
                    name="A",
                    intent="in",
                    type=type2
                )
            ],
            return_var=asr.VariableOld(
                name="c_desc2_int32",
                type=asr.Derived(name="c_desc2_t")
            ),
            module = "gfort_interop"
        )
        for arg in node.args:
            type = self.visit(arg.type)
            if array_is_assumed_shape(type):
                if len(type.dims) == 1:
                    dname = "c_desc1_t"
                    fname = c_desc1
                elif len(type.dims) == 2:
                    dname = "c_desc2_t"
                    fname = c_desc2
                else:
                    raise NotImplementedError("Too many dimensions")
                type = asr.Derived(name=dname, module="gfort_interop")
                args2.append(asr.FuncCall(func=fname, args=[arg],
                    keywords=[], type=type))
            else:
                args2.append(arg)
            cargs.append(asr.VariableOld(
                name=arg.name,
                intent=arg.intent,
                type=type,
            ))
        fw = scope_add_function(symtab, cname, args=cargs, return_var=cname)
        fw.bind = bind

        body = [
            asr.Assignment(return_var,
                asr.FuncCall(func=fw, args=args2, keywords=[],
                    type=fw.return_var.type)
            )
        ]
        f.body = body

        return f