diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-07-29 04:23:51 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:17:06 -0300 |
commit | 3c39aa5f2e05ad34e67f07b2f7262f419f9ce3b6 (patch) | |
tree | 64732f5eae7f640170bdb56aae8fbee625196b58 /generator | |
parent | 4e839b8209e31ea48b264622240b3c4939e6cefd (diff) |
Moved the generation of Python result error checking to a single function.
Diffstat (limited to 'generator')
-rw-r--r-- | generator/cppgenerator.cpp | 42 | ||||
-rw-r--r-- | generator/cppgenerator.h | 1 |
2 files changed, 16 insertions, 27 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp index 165506a14..7327e6722 100644 --- a/generator/cppgenerator.cpp +++ b/generator/cppgenerator.cpp @@ -235,14 +235,7 @@ void CppGenerator::writeToPythonFunction(QTextStream& s, const AbstractMetaClass s << INDENT << "PyObject* " PYTHON_RETURN_VAR " = Shiboken::PythonConverter< ::" << metaClass->qualifiedCppName(); s << " >::transformToPython(" CPP_SELF_VAR ");" << endl; - s << INDENT << "if (PyErr_Occurred() || !" PYTHON_RETURN_VAR ") {" << endl; - { - Indentation indentation(INDENT); - s << INDENT << "Py_XDECREF(" PYTHON_RETURN_VAR ");" << endl; - s << INDENT << "return 0;" << endl; - } - s << INDENT << '}' << endl; - + writeFunctionReturnErrorCheckSection(s); s << INDENT << "return " PYTHON_RETURN_VAR ";" << endl; s << '}' << endl; m_currentErrorCode = previousErrorCode; @@ -1258,15 +1251,7 @@ void CppGenerator::writeMethodWrapper(QTextStream& s, const AbstractMetaFunction s << endl; - s << INDENT << "if (PyErr_Occurred()" << ((hasReturnValue && !rfunc->isInplaceOperator()) ? " || !" PYTHON_RETURN_VAR : ""); - s << ") {" << endl; - { - Indentation indent(INDENT); - if (hasReturnValue && !rfunc->isInplaceOperator()) - s << INDENT << "Py_XDECREF(" PYTHON_RETURN_VAR ");" << endl; - s << INDENT << "return " << m_currentErrorCode << ';' << endl; - } - s << INDENT << '}' << endl; + writeFunctionReturnErrorCheckSection(s, hasReturnValue && !rfunc->isInplaceOperator()); if (hasReturnValue) { if (rfunc->isInplaceOperator()) { @@ -1522,6 +1507,18 @@ void CppGenerator::writeErrorSection(QTextStream& s, OverloadData& overloadData) s << INDENT << "return " << m_currentErrorCode << ';' << endl; } +void CppGenerator::writeFunctionReturnErrorCheckSection(QTextStream& s, bool hasReturnValue) +{ + s << INDENT << "if (PyErr_Occurred()" << (hasReturnValue ? " || !" PYTHON_RETURN_VAR : "") << ") {" << endl; + { + Indentation indent(INDENT); + if (hasReturnValue) + s << INDENT << "Py_XDECREF(" PYTHON_RETURN_VAR ");" << endl; + s << INDENT << "return " << m_currentErrorCode << ';' << endl; + } + s << INDENT << '}' << endl; +} + void CppGenerator::writeInvalidPyObjectCheck(QTextStream& s, const QString& pyObj) { writeInvalidPyObjectCheck(s, pyObj, m_currentErrorCode); @@ -2886,17 +2883,8 @@ void CppGenerator::writeCopyFunction(QTextStream& s, const AbstractMetaClass *me s << INDENT << "PyObject* " << PYTHON_RETURN_VAR << " = "; s << "Shiboken::Converter< ::" << metaClass->qualifiedCppName() << " >::toPython(*"; s << CPP_SELF_VAR << ");" << endl; - s << endl; - - s << INDENT << "if (PyErr_Occurred() || !" PYTHON_RETURN_VAR ") {" << endl; - { - Indentation indent(INDENT); - s << INDENT << "Py_XDECREF(" PYTHON_RETURN_VAR ");" << endl; - s << INDENT << "return 0;" << endl; - } - s << INDENT << "}" << endl; - + writeFunctionReturnErrorCheckSection(s); s << INDENT << "return " PYTHON_RETURN_VAR ";" << endl; s << "}" << endl; s << endl; diff --git a/generator/cppgenerator.h b/generator/cppgenerator.h index a324422df..8f8509030 100644 --- a/generator/cppgenerator.h +++ b/generator/cppgenerator.h @@ -57,6 +57,7 @@ private: void writeCppSelfDefinition(QTextStream& s, const AbstractMetaClass* metaClass, bool hasStaticOverload = false); void writeErrorSection(QTextStream& s, OverloadData& overloadData); + void writeFunctionReturnErrorCheckSection(QTextStream& s, bool hasReturnValue = true); /// Writes the check section for the validity of wrapped C++ objects. void writeInvalidPyObjectCheck(QTextStream& s, const QString& pyObj); |