Exemplo n.º 1
0
def main():
    outputfilename = sys.argv[1]
    entry_modname = sys.argv[2]
    sys.path += [os.path.dirname(os.curdir)]
    entry_module = __import__(entry_modname)

    rootns = namespaces['']

    # Generate C++ source
    with open('%s.cpp' % outputfilename, 'w') as cppfile:
        println = codegen.wrap_println_from_file(cppfile)
        populate_headers(println)                  # extra headers
        # print all includes
        for inc in rootns.aggregate_includes():
            println('#include "%s"' % inc)
        println()
        # print all downcast
        downcast_fns = rootns.aggregate_downcast()
        for ((fromty, toty), fn) in downcast_fns:
            name = fn.name
            fmt = '''
static
%(toty)s* %(name)s(%(fromty)s* arg)
{
    return typecast< %(toty)s >::from(arg);
}
'''
            println(fmt % locals())

            fn.generate_cpp(println)

        println('static')
        println('PyMethodDef downcast_methodtable[] = {')
        fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },'
        for _, fn in downcast_fns:
            name = fn.name
            func = fn.c_name
            println(fmt % locals())
        println('{ NULL }')
        println('};')
        println()
        # generate submodule
        rootns.generate_cpp(println, extras=[('extra', 'extra_methodtable'),
                                             ('downcast', 'downcast_methodtable')])
        println(extension_entry % {'module' : '_api',
                                   'ns'     : ''})

    # Generate Python source
    rootns.generate_py(rootdir='.', name='api')
Exemplo n.º 2
0
def main():
    outputfilename = sys.argv[1]
    entry_modname = sys.argv[2]
    sys.path += [os.path.dirname(os.curdir)]
    entry_module = __import__(entry_modname)

    rootns = namespaces['']

    # Generate C++ source
    with open('%s.cpp' % outputfilename, 'w') as cppfile:
        println = codegen.wrap_println_from_file(cppfile)
        populate_headers(println)  # extra headers
        # print all includes
        for inc in rootns.aggregate_includes():
            println('#include "%s"' % inc)
        println()
        # print all downcast
        downcast_fns = rootns.aggregate_downcast()
        for ((fromty, toty), fn) in downcast_fns:
            name = fn.name
            fmt = '''
static
%(toty)s* %(name)s(%(fromty)s* arg)
{
    return typecast< %(toty)s >::from(arg);
}
'''
            println(fmt % locals())

            fn.generate_cpp(println)

        println('static')
        println('PyMethodDef downcast_methodtable[] = {')
        fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },'
        for _, fn in downcast_fns:
            name = fn.name
            func = fn.c_name
            println(fmt % locals())
        println('{ NULL }')
        println('};')
        println()
        # generate submodule
        rootns.generate_cpp(println,
                            extras=[('extra', 'extra_methodtable'),
                                    ('downcast', 'downcast_methodtable')])
        println(extension_entry % {'module': '_api', 'ns': ''})

    # Generate Python source
    rootns.generate_py(rootdir='.', name='api')
Exemplo n.º 3
0
    def generate_py(self, rootdir='.', name=''):
        name = name or self.localname
        if self.namespaces:  # should make new directory
            path = os.path.join(rootdir, name)
            makedir(path)
            filepath = os.path.join(path, '__init__.py')
        else:
            filepath = os.path.join(rootdir, '%s.py' % name)
        with open(filepath, 'w') as pyfile:
            println = cg.wrap_println_from_file(pyfile)
            println('from llvmpy import _api, capsule')
            for ns in self.namespaces:
                println('from . import %s' % ns.localname)
            println()
            for unit in self.iter_all():
                if not isinstance(unit, Namespace):
                    writer = cg.PyCodeWriter(println)
                    unit.compile_py(writer)

        for ns in self.namespaces:
            ns.generate_py(rootdir=path)
Exemplo n.º 4
0
    def generate_py(self, rootdir='.', name=''):
        name = name or self.localname
        if self.namespaces: # should make new directory
            path = os.path.join(rootdir, name)
            makedir(path)
            filepath = os.path.join(path, '__init__.py')
        else:
            filepath = os.path.join(rootdir, '%s.py' % name)
        with open(filepath, 'w') as pyfile:
            println = cg.wrap_println_from_file(pyfile)
            println('from llvmpy import _api, capsule')
            for ns in self.namespaces:
                println('from . import %s' % ns.localname)
            println()
            for unit in self.iter_all():
                if not isinstance(unit, Namespace):
                    writer = cg.PyCodeWriter(println)
                    unit.compile_py(writer)

        for ns in self.namespaces:
            ns.generate_py(rootdir=path)
Exemplo n.º 5
0
def main():
    print("Running LLVM API generator")
    outputfilename = sys.argv[1]
    entry_modname = sys.argv[2]
    sys.path += [os.path.dirname(os.curdir)]
    entry_module = __import__(entry_modname)
    rootns = namespaces['']

    # Check if files are modified

    outputfilepath = '%s.cpp' % outputfilename
    try:
        mtime = os.path.getmtime(outputfilepath)
    except OSError:
        mtime = 0

    if entry_module.last_mtime <= mtime:

        # Check if file header matches
        with open(outputfilepath) as checkfile:
            n = len(FILE_HEADER)
            header = checkfile.read(n)

        if header == FILE_HEADER:
            print("up to date")
            return
        else:
            print("file is outdated")
            pass

    # Generate C++ source
    with open(outputfilepath, 'w') as cppfile:
        println = codegen.wrap_println_from_file(cppfile)
        println(FILE_HEADER)
        populate_headers(println)  # extra headers
        # print all includes
        for inc in rootns.aggregate_includes():
            println('#include "%s"' % inc)
        println()
        # print all downcast
        downcast_fns = rootns.aggregate_downcast()
        for ((fromty, toty), fn) in downcast_fns:
            name = fn.name
            fmt = '''
static
%(toty)s* %(name)s(%(fromty)s* arg)
{
    return typecast< %(toty)s >::from(arg);
}
'''
            println(fmt % locals())

            fn.generate_cpp(println)

        println('static')
        println('PyMethodDef downcast_methodtable[] = {')
        fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },'
        for _, fn in downcast_fns:
            name = fn.name
            func = fn.c_name
            println(fmt % locals())
        println('{ NULL }')
        println('};')
        println()
        # generate submodule
        rootns.generate_cpp(println,
                            extras=[('extra', 'extra_methodtable'),
                                    ('downcast', 'downcast_methodtable')])
        println(extension_entry % {'module': '_api', 'ns': ''})

    # Generate Python source
    rootns.generate_py(rootdir='.', name='api')
Exemplo n.º 6
0
def main():
    print("Running LLVM API generator")
    outputfilename = sys.argv[1]
    entry_modname = sys.argv[2]
    sys.path += [os.path.dirname(os.curdir)]
    entry_module = __import__(entry_modname)
    rootns = namespaces['']

    # Check if files are modified

    outputfilepath = '%s.cpp' % outputfilename
    try:
        mtime = os.path.getmtime(outputfilepath)
    except OSError:
        mtime = 0

    if entry_module.last_mtime <= mtime:

        # Check if file header matches
        with open(outputfilepath) as checkfile:
            n = len(FILE_HEADER)
            header = checkfile.read(n)

        if header == FILE_HEADER:
            print("up to date")
            return
        else:
            print("file is outdated")
            pass

    # Generate C++ source
    with open(outputfilepath, 'w') as cppfile:
        println = codegen.wrap_println_from_file(cppfile)
        println(FILE_HEADER)
        populate_headers(println)                  # extra headers
        # print all includes
        for inc in rootns.aggregate_includes():
            println('#include "%s"' % inc)
        println()
        # print all downcast
        downcast_fns = rootns.aggregate_downcast()
        for ((fromty, toty), fn) in downcast_fns:
            name = fn.name
            fmt = '''
static
%(toty)s* %(name)s(%(fromty)s* arg)
{
    return typecast< %(toty)s >::from(arg);
}
'''
            println(fmt % locals())

            fn.generate_cpp(println)

        println('static')
        println('PyMethodDef downcast_methodtable[] = {')
        fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },'
        for _, fn in downcast_fns:
            name = fn.name
            func = fn.c_name
            println(fmt % locals())
        println('{ NULL }')
        println('};')
        println()
        # generate submodule
        rootns.generate_cpp(println, extras=[('extra', 'extra_methodtable'),
                                             ('downcast',
                                              'downcast_methodtable')])
        println(extension_entry % {'module': '_api',
                                   'ns': ''})

    # Generate Python source
    rootns.generate_py(rootdir='.', name='api')