def gen_source(database, modulename, targetdir, eci, defines={}): assert not database.standalone if isinstance(targetdir, str): targetdir = py.path.local(targetdir) filename = targetdir.join(modulename + '.c') f = filename.open('w') incfilename = targetdir.join('common_header.h') fi = incfilename.open('w') # # Header # print >> f, '#include "common_header.h"' print >> f for key, value in defines.items(): print >> fi, '#define %s %s' % (key, value) print >> fi, '#include "pyconfig.h"' for line in database.gcpolicy.pre_pre_gc_code(): print >> fi, line print >> fi, '#include "src/g_prerequisite.h"' for line in database.gcpolicy.pre_gc_code(): print >> fi, line eci.write_c_header(fi) fi.close() if database.translator is None or database.translator.rtyper is None: preimplementationlines = [] else: preimplementationlines = list( pre_include_code_lines(database, database.translator.rtyper)) # # 1) All declarations # 2) Implementation of functions and global structures and arrays # sg = SourceGenerator(database, preimplementationlines) sg.set_strategy(targetdir) sg.gen_readable_parts_of_source(f) gen_startupcode(f, database) f.close() # # Generate a setup.py while we're at it # pypy_include_dir = autopath.this_dir f = targetdir.join('setup.py').open('w') include_dirs = eci.include_dirs library_dirs = eci.library_dirs libraries = eci.libraries f.write(SETUP_PY % locals()) f.close() eci = eci.convert_sources_to_files(being_main=True) return filename, sg.getextrafiles() + list(eci.separate_module_files)
def gen_source_standalone(database, modulename, targetdir, eci, entrypointname, defines={}): assert database.standalone if isinstance(targetdir, str): targetdir = py.path.local(targetdir) filename = targetdir.join(modulename + '.c') f = filename.open('w') incfilename = targetdir.join('common_header.h') fi = incfilename.open('w') # # Header # print >> f, '#include "common_header.h"' print >> f defines['PYPY_STANDALONE'] = entrypointname for key, value in defines.items(): print >> fi, '#define %s %s' % (key, value) print >> fi, '#define Py_BUILD_CORE /* for Windows: avoid pulling libs in */' print >> fi, '#include "pyconfig.h"' for line in database.gcpolicy.pre_pre_gc_code(): print >> fi, line eci.write_c_header(fi) print >> fi, '#include "src/g_prerequisite.h"' for line in database.gcpolicy.pre_gc_code(): print >> fi, line fi.close() preimplementationlines = list( pre_include_code_lines(database, database.translator.rtyper)) # # 1) All declarations # 2) Implementation of functions and global structures and arrays # sg = SourceGenerator(database, preimplementationlines) sg.set_strategy(targetdir) database.prepare_inline_helpers() sg.gen_readable_parts_of_source(f) # 3) start-up code print >> f gen_startupcode(f, database) f.close() if 'INSTRUMENT' in defines: fi = incfilename.open('a') n = database.instrument_ncounter print >>fi, "#define INSTRUMENT_NCOUNTER %d" % n fi.close() eci = eci.convert_sources_to_files(being_main=True) return filename, sg.getextrafiles() + list(eci.separate_module_files)
def gen_source_standalone(database, modulename, targetdir, eci, entrypointname, defines={}): assert database.standalone if isinstance(targetdir, str): targetdir = py.path.local(targetdir) filename = targetdir.join(modulename + ".c") f = filename.open("w") incfilename = targetdir.join("common_header.h") fi = incfilename.open("w") # # Header # print >> f, '#include "common_header.h"' print >> f defines["PYPY_STANDALONE"] = entrypointname for key, value in defines.items(): print >> fi, "#define %s %s" % (key, value) if sys.platform == "win32": print >> fi, "#define Py_BUILD_CORE /* avoid pulling python libs in */" print >> fi, "#define WIN32_LEAN_AND_MEAN /* winsock/winsock2 mess */" print >> fi, '#include "pyconfig.h"' eci.write_c_header(fi) print >> fi, '#include "src/g_prerequisite.h"' fi.close() preimplementationlines = list(pre_include_code_lines(database, database.translator.rtyper)) # # 1) All declarations # 2) Implementation of functions and global structures and arrays # sg = SourceGenerator(database, preimplementationlines) sg.set_strategy(targetdir) database.prepare_inline_helpers() sg.gen_readable_parts_of_source(f) # 3) start-up code print >> f gen_startupcode(f, database) f.close() if "INSTRUMENT" in defines: fi = incfilename.open("a") n = database.instrument_ncounter print >> fi, "#define INSTRUMENT_NCOUNTER %d" % n fi.close() eci = eci.convert_sources_to_files(being_main=True) files, eci = eci.get_module_files() return eci, filename, sg.getextrafiles() + list(files)
def gen_source(database, modulename, targetdir, eci, defines={}, split=False): if isinstance(targetdir, str): targetdir = py.path.local(targetdir) filename = targetdir.join(modulename + '.c') f = filename.open('w') incfilename = targetdir.join('common_header.h') fi = incfilename.open('w') # # Header # print >> f, '#include "common_header.h"' print >> f commondefs(defines) for key, value in defines.items(): print >> fi, '#define %s %s' % (key, value) eci.write_c_header(fi) print >> fi, '#include "src/g_prerequisite.h"' fi.close() if database.translator is None or database.translator.rtyper is None: preimplementationlines = [] else: preimplementationlines = list( pre_include_code_lines(database, database.translator.rtyper)) # # 1) All declarations # 2) Implementation of functions and global structures and arrays # sg = SourceGenerator(database, preimplementationlines) sg.set_strategy(targetdir, split) if split: database.prepare_inline_helpers() sg.gen_readable_parts_of_source(f) gen_startupcode(f, database) f.close() if 'INSTRUMENT' in defines: fi = incfilename.open('a') n = database.instrument_ncounter print >>fi, "#define INSTRUMENT_NCOUNTER %d" % n fi.close() eci = add_extra_files(eci) eci = eci.convert_sources_to_files(being_main=True) files, eci = eci.get_module_files() return eci, filename, sg.getextrafiles() + list(files)
def gen_source(database, modulename, targetdir, eci, defines={}, split=False): if isinstance(targetdir, str): targetdir = py.path.local(targetdir) filename = targetdir.join(modulename + '.c') f = filename.open('w') incfilename = targetdir.join('common_header.h') fi = incfilename.open('w') # # Header # print >> f, '#include "common_header.h"' print >> f commondefs(defines) for key, value in defines.items(): print >> fi, '#define %s %s' % (key, value) eci.write_c_header(fi) print >> fi, '#include "src/g_prerequisite.h"' fi.close() if database.translator is None or database.translator.rtyper is None: preimplementationlines = [] else: preimplementationlines = list( pre_include_code_lines(database, database.translator.rtyper)) # # 1) All declarations # 2) Implementation of functions and global structures and arrays # sg = SourceGenerator(database, preimplementationlines) sg.set_strategy(targetdir, split) if split: database.prepare_inline_helpers() sg.gen_readable_parts_of_source(f) gen_startupcode(f, database) f.close() if 'INSTRUMENT' in defines: fi = incfilename.open('a') n = database.instrument_ncounter print >>fi, "#define INSTRUMENT_NCOUNTER %d" % n fi.close() eci = add_extra_files(eci) eci = eci.convert_sources_to_files(being_main=True) files, eci = eci.get_module_files() return eci, filename, sg.getextrafiles() + list(files)
def gen_source(database, modulename, targetdir, eci, defines={}, split=False): assert not database.standalone if isinstance(targetdir, str): targetdir = py.path.local(targetdir) filename = targetdir.join(modulename + '.c') f = filename.open('w') incfilename = targetdir.join('common_header.h') fi = incfilename.open('w') # # Header # print >> f, '#include "common_header.h"' print >> f for key, value in defines.items(): print >> fi, '#define %s %s' % (key, value) if sys.platform == 'win32': print >> fi, '#define WIN32_LEAN_AND_MEAN /* winsock/winsock2 mess */' print >> fi, '#include "pyconfig.h"' eci.write_c_header(fi) print >> fi, '#include "src/g_prerequisite.h"' fi.close() if database.translator is None or database.translator.rtyper is None: preimplementationlines = [] else: preimplementationlines = list( pre_include_code_lines(database, database.translator.rtyper)) # # 1) All declarations # 2) Implementation of functions and global structures and arrays # sg = SourceGenerator(database, preimplementationlines) sg.set_strategy(targetdir, split) if split: database.prepare_inline_helpers() sg.gen_readable_parts_of_source(f) gen_startupcode(f, database) f.close() eci = eci.convert_sources_to_files(being_main=True) files, eci = eci.get_module_files() return eci, filename, sg.getextrafiles() + list(files)
def gen_source(database, modulename, targetdir, eci, defines={}, split=False): assert not database.standalone if isinstance(targetdir, str): targetdir = py.path.local(targetdir) filename = targetdir.join(modulename + '.c') f = filename.open('w') incfilename = targetdir.join('common_header.h') fi = incfilename.open('w') # # Header # print >> f, '#include "common_header.h"' print >> f for key, value in defines.items(): print >> fi, '#define %s %s' % (key, value) if sys.platform == 'win32': print >> fi, '#define WIN32_LEAN_AND_MEAN /* winsock/winsock2 mess */' print >> fi, '#include "pyconfig.h"' eci.write_c_header(fi) print >> fi, '#include "src/g_prerequisite.h"' fi.close() if database.translator is None or database.translator.rtyper is None: preimplementationlines = [] else: preimplementationlines = list( pre_include_code_lines(database, database.translator.rtyper)) # # 1) All declarations # 2) Implementation of functions and global structures and arrays # sg = SourceGenerator(database, preimplementationlines) sg.set_strategy(targetdir, split) if split: database.prepare_inline_helpers() sg.gen_readable_parts_of_source(f) gen_startupcode(f, database) f.close() eci = eci.convert_sources_to_files(being_main=True) files, eci = eci.get_module_files() return eci, filename, sg.getextrafiles() + list(files)
def gen_source(database, modulename, targetdir, defines={}, exports={}, symboltable=None): assert not database.standalone if isinstance(targetdir, str): targetdir = py.path.local(targetdir) filename = targetdir.join(modulename + '.c') f = filename.open('w') incfilename = targetdir.join('common_header.h') fi = incfilename.open('w') # # Header # print >> f, '#include "common_header.h"' print >> f for key, value in defines.items(): print >> fi, '#define %s %s' % (key, value) print >> fi, '#include "pyconfig.h"' for line in database.gcpolicy.pre_pre_gc_code(): print >> fi, line print >> fi, '#include "src/g_prerequisite.h"' for line in database.gcpolicy.pre_gc_code(): print >> fi, line includes, sources, include_dirs = extra_information(database) for include in includes: print >> fi, '#include <%s>' % (include,) fi.close() if database.translator is None or database.translator.rtyper is None: preimplementationlines = [] else: preimplementationlines = list( pre_include_code_lines(database, database.translator.rtyper)) # # 1) All declarations # 2) Implementation of functions and global structures and arrays # sg = SourceGenerator(database, preimplementationlines) sg.set_strategy(targetdir) sg.gen_readable_parts_of_source(f) # # Debugging info # if symboltable: print >> f print >> f, '/*******************************************************/' print >> f, '/*** Debugging info ***/' print >> f print >> f, 'static int debuginfo_offsets[] = {' for node in database.structdefnodes.values(): for expr in symboltable.generate_type_info(database, node): print >> f, '\t%s,' % expr print >> f, '\t0 };' print >> f, 'static void *debuginfo_globals[] = {' for node in database.globalcontainers(): if not isinstance(node, PyObjectNode): result = symboltable.generate_global_info(database, node) print >> f, '\t%s,' % (result,) print >> f, '\tNULL };' print >> f, '#include "src/debuginfo.h"' # # PyObject support (strange) code # pyobjmaker = database.pyobjmaker print >> f print >> f, '/***********************************************************/' print >> f, '/*** Table of global PyObjects ***/' print >> f print >> f, 'static globalobjectdef_t globalobjectdefs[] = {' for node in database.containerlist: if isinstance(node, (PyObjectNode, PyObjHeadNode)): for target in node.where_to_copy_me: print >> f, '\t{%s, "%s"},' % (target, node.exported_name) print >> f, '\t{ NULL, NULL }\t/* Sentinel */' print >> f, '};' print >> f print >> f, 'static cpyobjheaddef_t cpyobjheaddefs[] = {' for node in database.containerlist: if isinstance(node, PyObjHeadNode): print >> f, '\t{"%s", %s, %s},' % (node.exported_name, node.ptrname, node.get_setupfn_name()) print >> f, '\t{ NULL, NULL, NULL }\t/* Sentinel */' print >> f, '};' print >> f print >> f, '/***********************************************************/' print >> f, '/*** Table of functions ***/' print >> f print >> f, 'static globalfunctiondef_t globalfunctiondefs[] = {' wrappers = pyobjmaker.wrappers.items() wrappers.sort() for globalobject_name, (base_name, wrapper_name, func_doc) in wrappers: print >> f, ('\t{&%s, "%s", {"%s", (PyCFunction)%s, ' 'METH_VARARGS|METH_KEYWORDS, %s}},' % ( globalobject_name, globalobject_name, base_name, wrapper_name, func_doc and c_string_constant(func_doc) or 'NULL')) print >> f, '\t{ NULL }\t/* Sentinel */' print >> f, '};' print >> f, 'static globalfunctiondef_t *globalfunctiondefsptr = &globalfunctiondefs[0];' print >> f print >> f, '/***********************************************************/' print >> f, '/*** Frozen Python bytecode: the initialization code ***/' print >> f print >> f, 'static char *frozen_initcode[] = {"\\' bytecode, originalsource = database.pyobjmaker.getfrozenbytecode() g = targetdir.join('frozen.py').open('w') g.write(originalsource) g.close() def char_repr(c): if c in '\\"': return '\\' + c if ' ' <= c < '\x7F': return c return '\\%03o' % ord(c) for i in range(0, len(bytecode), 32): print >> f, ''.join([char_repr(c) for c in bytecode[i:i+32]])+'\\' if (i+32) % 1024 == 0: print >> f, '", "\\' print >> f, '"};' print >> f, "#define FROZEN_INITCODE_SIZE %d" % len(bytecode) print >> f # # Module initialization function # print >> f, '/***********************************************************/' print >> f, '/*** Module initialization function ***/' print >> f gen_startupcode(f, database) print >> f print >> f, 'MODULE_INITFUNC(%s)' % modulename print >> f, '{' print >> f, '\tSETUP_MODULE(%s);' % modulename for publicname, pyobjptr in exports.items(): # some fishing needed to find the name of the obj pyobjnode = database.containernodes[pyobjptr._obj] print >> f, '\tPyModule_AddObject(m, "%s", %s);' % (publicname, pyobjnode.name) print >> f, '\tcall_postsetup(m);' print >> f, '}' f.close() # # Generate a setup.py while we're at it # pypy_include_dir = autopath.this_dir f = targetdir.join('setup.py').open('w') f.write(SETUP_PY % locals()) f.close() return filename, sg.getextrafiles() + sources, include_dirs