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"
