diff options
author | Hugo Parente Lima <hugo.pl@gmail.com> | 2011-09-16 18:24:56 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:17:15 -0300 |
commit | 0b1f8df512047c6ace60701180ec1e4f6e97484e (patch) | |
tree | 6ed9d3410038fd37d600f548d0f8df5be111a55a /generator | |
parent | cbfebc05a591a2370c3fad044e7a45a305c8ba4a (diff) |
Port module initialization to Python3.
Diffstat (limited to 'generator')
-rw-r--r-- | generator/cppgenerator.cpp | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp index 2a1badf0e..985bcce91 100644 --- a/generator/cppgenerator.cpp +++ b/generator/cppgenerator.cpp @@ -2836,7 +2836,19 @@ void CppGenerator::writeTypeAsNumberDefinition(QTextStream& s, const AbstractMet foreach (const QString& nbName, m_nbFuncs.keys()) { if (nb[nbName].isEmpty()) continue; - s << INDENT << baseName << "_Type.super.as_number." << m_nbFuncs[nbName] << " = " << nb[nbName] << ';' << endl; + + // bool is special because the field name differs on Python 2 and 3 (nb_nonzero vs nb_bool) + // so a shiboken macro is used. + if (nbName == "bool") { + s << INDENT << "SBK_NB_BOOL(" << baseName << "_Type.super.as_number) = " << nb[nbName] << ';' << endl; + } else { + bool excludeFromPy3K = nbName == "__div__" || nbName == "__idiv__"; + if (excludeFromPy3K) + s << "#ifndef IS_PY3K" << endl; + s << INDENT << baseName << "_Type.super.as_number." << m_nbFuncs[nbName] << " = " << nb[nbName] << ';' << endl; + if (excludeFromPy3K) + s << "#endif" << endl; + } } if (!nb["__div__"].isEmpty()) s << INDENT << baseName << "_Type.super.as_number.nb_true_divide = " << nb["__div__"] << ';' << endl; @@ -3702,7 +3714,7 @@ void CppGenerator::writeGetattroFunction(QTextStream& s, const AbstractMetaClass s << INDENT << "if (meth)" << endl; { Indentation indent(INDENT); - s << INDENT << "return PyFunction_Check(meth) ? PyMethod_New(meth, " PYTHON_SELF_VAR ", (PyObject*)" PYTHON_SELF_VAR "->ob_type) : " << getattrFunc << ';' << endl; + s << INDENT << "return PyFunction_Check(meth) ? SBK_PyMethod_New(meth, " PYTHON_SELF_VAR ") : " << getattrFunc << ';' << endl; } } s << INDENT << '}' << endl; @@ -3917,10 +3929,28 @@ void CppGenerator::finishGeneration() s << " #define SBK_EXPORT_MODULE" << endl; s << "#endif" << endl << endl; + s << "#ifdef IS_PY3K" << endl; + s << "static struct PyModuleDef moduledef = {" << endl; + s << " /* m_base */ PyModuleDef_HEAD_INIT," << endl; + s << " /* m_name */ \"" << moduleName() << "\"," << endl; + s << " /* m_doc */ 0," << endl; + s << " /* m_size */ -1," << endl; + s << " /* m_methods */ " << moduleName() << "_methods," << endl; + s << " /* m_reload */ 0," << endl; + s << " /* m_traverse */ 0," << endl; + s << " /* m_clear */ 0," << endl; + s << " /* m_free */ 0" << endl; + s << "};" << endl << endl; + s << " #define SBK_MODULE_INIT_ERROR 0" << endl; + s << "extern \"C\" SBK_EXPORT_MODULE PyObject* PyInit_" << moduleName() << "()" << endl; + s << "#else" << endl; + s << " #define SBK_MODULE_INIT_ERROR" << endl; s << "extern \"C\" SBK_EXPORT_MODULE void init" << moduleName() << "()" << endl; + s << "#endif" << endl; + s << '{' << endl; - ErrorCode errorCode(""); + ErrorCode errorCode("SBK_MODULE_INIT_ERROR"); // module inject-code target/beginning if (!snips.isEmpty()) { writeCodeSnips(s, snips, CodeSnip::Beginning, TypeSystem::TargetLangCode); @@ -3935,7 +3965,7 @@ void CppGenerator::finishGeneration() s << INDENT << "if (requiredModule.isNull())" << endl; { Indentation indentation(INDENT); - s << INDENT << "return;" << endl; + s << INDENT << "SBK_MODULE_INIT_ERROR;" << endl; } s << INDENT << cppApiVariableName(requiredModule) << " = Shiboken::Module::getTypes(requiredModule);" << endl; } @@ -3946,8 +3976,12 @@ void CppGenerator::finishGeneration() s << INDENT << "static PyTypeObject* cppApi[" << "SBK_" << moduleName() << "_IDX_COUNT" << "];" << endl; s << INDENT << cppApiVariableName() << " = cppApi;" << endl << endl; + s << "#ifdef IS_PY3K" << endl; + s << INDENT << "PyObject* module = Shiboken::Module::create(\"" << moduleName() << "\", &moduledef);" << endl; + s << "#else" << endl; s << INDENT << "PyObject* module = Shiboken::Module::create(\"" << moduleName() << "\", "; - s << moduleName() << "_methods);" << endl << endl; + s << moduleName() << "_methods);" << endl; + s << "#endif" << endl << endl; s << INDENT << "// Initialize classes in the type system" << endl; s << classPythonDefines; @@ -4023,8 +4057,9 @@ void CppGenerator::finishGeneration() s << INDENT << "PySide::registerCleanupFunction(cleanTypesAttributes);" << endl; } - - + s << "#ifdef IS_PY3K" << endl; + s << INDENT << "return module;" << endl; + s << "#endif" << endl; s << '}' << endl << endl; } |