cython-devel

changeset 719:e21391d5f23a

quick work-around for PEP 3121 implementation in Py3 beta
author Stefan Behnel <scoder@users.berlios.de>
date Thu Jun 12 09:28:56 2008 +0200 (2 years ago)
parents 006091538059
children e9362868d4c2
files Cython/Compiler/ModuleNode.py Cython/Compiler/Naming.py
line diff
1.1 --- a/Cython/Compiler/ModuleNode.py Thu Jun 12 09:21:21 2008 +0200 1.2 +++ b/Cython/Compiler/ModuleNode.py Thu Jun 12 09:28:56 2008 +0200 1.3 @@ -247,6 +247,7 @@ 1.4 self.generate_filename_init_prototype(code) 1.5 if env.has_import_star: 1.6 self.generate_import_star(env, code) 1.7 + self.generate_pymoduledef_struct(env, code) 1.8 self.generate_module_init_func(modules[:-1], env, code) 1.9 code.mark_pos(None) 1.10 self.generate_module_cleanup_func(env, code) 1.11 @@ -1516,9 +1517,17 @@ 1.12 1.13 def generate_module_init_func(self, imported_modules, env, code): 1.14 code.putln("") 1.15 - header = "PyMODINIT_FUNC init%s(void)" % env.module_name 1.16 - code.putln("%s; /*proto*/" % header) 1.17 - code.putln("%s {" % header) 1.18 + header2 = "PyMODINIT_FUNC init%s(void)" % env.module_name 1.19 + header3 = "PyMODINIT_FUNC PyInit_%s(void)" % env.module_name 1.20 + code.putln("#if PY_MAJOR_VERSION < 3") 1.21 + code.putln("%s; /*proto*/" % header2) 1.22 + code.putln(header2) 1.23 + code.putln("#else") 1.24 + code.putln("%s; /*proto*/" % header3) 1.25 + code.putln(header3) 1.26 + code.putln("#endif") 1.27 + code.putln("{") 1.28 + 1.29 code.put_var_declarations(env.temp_entries) 1.30 code.putln("%s = PyTuple_New(0); %s" % (Naming.empty_tuple, code.error_goto_if_null(Naming.empty_tuple, self.pos))); 1.31 1.32 @@ -1563,13 +1572,21 @@ 1.33 self.body.generate_execution_code(code) 1.34 1.35 if Options.generate_cleanup_code: 1.36 + # this should be replaced by the module's tp_clear in Py3 1.37 code.putln("if (__Pyx_RegisterCleanup()) %s;" % code.error_goto(self.pos)) 1.38 1.39 + code.putln("#if PY_MAJOR_VERSION < 3") 1.40 code.putln("return;") 1.41 + code.putln("#else") 1.42 + code.putln("return %s;" % env.module_cname) 1.43 + code.putln("#endif") 1.44 code.put_label(code.error_label) 1.45 code.put_var_xdecrefs(env.temp_entries) 1.46 code.putln('__Pyx_AddTraceback("%s");' % env.qualified_name) 1.47 env.use_utility_code(Nodes.traceback_utility_code) 1.48 + code.putln("#if PY_MAJOR_VERSION >= 3") 1.49 + code.putln("return NULL;") 1.50 + code.putln("#endif") 1.51 code.putln('}') 1.52 1.53 def generate_module_cleanup_func(self, env, code): 1.54 @@ -1609,7 +1626,27 @@ 1.55 1.56 def generate_filename_init_call(self, code): 1.57 code.putln("%s();" % Naming.fileinit_cname) 1.58 - 1.59 + 1.60 + def generate_pymoduledef_struct(self, env, code): 1.61 + if env.doc: 1.62 + doc = env.doc_cname 1.63 + else: 1.64 + doc = "0" 1.65 + code.putln("") 1.66 + code.putln("#if PY_MAJOR_VERSION >= 3") 1.67 + code.putln("static struct PyModuleDef %s = {" % Naming.pymoduledef_cname) 1.68 + code.putln(" PyModuleDef_HEAD_INIT,") 1.69 + code.putln(' "%s",' % env.module_name) 1.70 + code.putln(" %s, /* m_doc */" % doc) 1.71 + code.putln(" -1, /* m_size */") 1.72 + code.putln(" %s /* m_methods */," % env.method_table_cname) 1.73 + code.putln(" NULL, /* m_reload */") 1.74 + code.putln(" NULL, /* m_traverse */") 1.75 + code.putln(" NULL, /* m_clear */") 1.76 + code.putln(" NULL /* m_free */") 1.77 + code.putln("};") 1.78 + code.putln("#endif") 1.79 + 1.80 def generate_module_creation_code(self, env, code): 1.81 # Generate code to create the module object and 1.82 # install the builtins. 1.83 @@ -1617,19 +1654,28 @@ 1.84 doc = env.doc_cname 1.85 else: 1.86 doc = "0" 1.87 + code.putln("#if PY_MAJOR_VERSION < 3") 1.88 code.putln( 1.89 '%s = Py_InitModule4("%s", %s, %s, 0, PYTHON_API_VERSION);' % ( 1.90 env.module_cname, 1.91 env.module_name, 1.92 env.method_table_cname, 1.93 doc)) 1.94 + code.putln("#else") 1.95 + code.putln( 1.96 + "%s = PyModule_Create(&%s);" % ( 1.97 + env.module_cname, 1.98 + Naming.pymoduledef_cname)) 1.99 + code.putln("#endif") 1.100 code.putln( 1.101 "if (!%s) %s;" % ( 1.102 env.module_cname, 1.103 code.error_goto(self.pos))); 1.104 + code.putln("#if PY_MAJOR_VERSION < 3") 1.105 code.putln( 1.106 "Py_INCREF(%s);" % 1.107 env.module_cname) 1.108 + code.putln("#endif") 1.109 code.putln( 1.110 '%s = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME);' % 1.111 Naming.builtins_cname)
2.1 --- a/Cython/Compiler/Naming.py Thu Jun 12 09:21:21 2008 +0200 2.2 +++ b/Cython/Compiler/Naming.py Thu Jun 12 09:28:56 2008 +0200 2.3 @@ -65,6 +65,7 @@ 2.4 print_function = pyrex_prefix + "print" 2.5 print_function_kwargs = pyrex_prefix + "print_kwargs" 2.6 cleanup_cname = pyrex_prefix + "module_cleanup" 2.7 +pymoduledef_cname = pyrex_prefix + "moduledef" 2.8 optional_args_cname = pyrex_prefix + "optional_args" 2.9 no_opt_args = pyrex_prefix + "no_opt_args" 2.10 import_star = pyrex_prefix + "import_star"