diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-07-29 03:17:02 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:17:06 -0300 |
commit | 29183ffe770ff7738c5eebc5480ca956c4fe086f (patch) | |
tree | 23e32626c312edee178abd3d9cf7b87df6d73b64 /generator | |
parent | 34395eeb8c57f2225c7f20b9e20f9d92f2131ce7 (diff) |
Improved coding style in the terrible writeStdListWrapperMethods method.
Diffstat (limited to 'generator')
-rw-r--r-- | generator/cppgenerator.cpp | 70 | ||||
-rw-r--r-- | generator/cppgenerator.h | 3 |
2 files changed, 39 insertions, 34 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp index b37f7e087..716ca6e66 100644 --- a/generator/cppgenerator.cpp +++ b/generator/cppgenerator.cpp @@ -4168,47 +4168,49 @@ void CppGenerator::writeHashFunction(QTextStream& s, const AbstractMetaClass* me void CppGenerator::writeStdListWrapperMethods(QTextStream& s, const AbstractMetaClass* metaClass) { - //len - s << "Py_ssize_t " << cpythonBaseName(metaClass->typeEntry()) << "__len__" << "(PyObject* self)" << endl << '{' << endl; - - writeInvalidPyObjectCheck(s, "self", 0); - s << endl; - - s << INDENT << metaClass->qualifiedCppName() << "& cppSelf = Shiboken::Converter< ::" << metaClass->qualifiedCppName() <<"& >::toCpp(self);" << endl; - s << INDENT << "return cppSelf.size();" << endl; - s << "}" << endl; - - //getitem - s << "PyObject* " << cpythonBaseName(metaClass->typeEntry()) << "__getitem__" << "(PyObject* self, Py_ssize_t _i)" << endl << '{' << endl; - - writeInvalidPyObjectCheck(s, "self", 0); - s << endl; + int previousErrorCode = m_currentErrorCode; + // __len__ + m_currentErrorCode = 0; + s << "Py_ssize_t " << cpythonBaseName(metaClass->typeEntry()) << "__len__(PyObject* self)" << endl; + s << '{' << endl; + writeCppSelfDefinition(s, metaClass); + s << INDENT << "return " CPP_SELF_VAR "->size();" << endl; + s << '}' << endl; - s << INDENT << metaClass->qualifiedCppName() << " &cppSelf = Shiboken::Converter< ::" << metaClass->qualifiedCppName() <<"& >::toCpp(self);" << endl; - s << INDENT << "if (_i < 0 || _i >= (Py_ssize_t) cppSelf.size()) {" << endl; - s << INDENT << INDENT << "PyErr_SetString(PyExc_IndexError, \"index out of bounds\");" << endl; - s << INDENT << INDENT << "return 0;" << endl << INDENT << "}" << endl; - s << INDENT << metaClass->qualifiedCppName() << "::iterator _item = cppSelf.begin();" << endl; + // __getitem__ + s << "PyObject* " << cpythonBaseName(metaClass->typeEntry()) << "__getitem__(PyObject* self, Py_ssize_t _i)" << endl; + s << '{' << endl; + writeCppSelfDefinition(s, metaClass); + writeIndexError(s, "index out of bounds"); + s << INDENT << metaClass->qualifiedCppName() << "::iterator _item = " CPP_SELF_VAR "->begin();" << endl; s << INDENT << "for(Py_ssize_t pos=0; pos < _i; pos++) _item++;" << endl; s << INDENT << "return Shiboken::Converter< ::" << metaClass->qualifiedCppName() << "::value_type>::toPython(*_item);" << endl; - s << "}" << endl; - - //setitem - s << "int " << cpythonBaseName(metaClass->typeEntry()) << "__setitem__" << "(PyObject* self, Py_ssize_t _i, PyObject* _value)" << endl << '{' << endl; + s << '}' << endl; - writeInvalidPyObjectCheck(s, "self", -1); - s << endl; - s << INDENT << metaClass->qualifiedCppName() << " &cppSelf = Shiboken::Converter< ::" << metaClass->qualifiedCppName() <<"& >::toCpp(self);" << endl; - s << INDENT << "if (_i < 0 || _i >= (Py_ssize_t) cppSelf.size()) {" << endl; - s << INDENT << INDENT << "PyErr_SetString(PyExc_IndexError, \"list assignment index out of range\");" << endl; - s << INDENT << INDENT << "return -1;" << endl << INDENT << "}" << endl; - s << INDENT << metaClass->qualifiedCppName() << "::iterator _item = cppSelf.begin();" << endl; + // __setitem__ + m_currentErrorCode = -1; + s << "int " << cpythonBaseName(metaClass->typeEntry()) << "__setitem__(PyObject* self, Py_ssize_t _i, PyObject* _value)" << endl; + s << '{' << endl; + writeCppSelfDefinition(s, metaClass); + writeIndexError(s, "list assignment index out of range"); + s << INDENT << metaClass->qualifiedCppName() << "::iterator _item = " CPP_SELF_VAR "->begin();" << endl; s << INDENT << "for(Py_ssize_t pos=0; pos < _i; pos++) _item++;" << endl; - s << INDENT << metaClass->qualifiedCppName() << "::value_type cppValue = Shiboken::Converter< ::" << metaClass->qualifiedCppName() << "::value_type>::toCpp(_value);" << endl; s << INDENT << "*_item = cppValue;" << endl; - s << INDENT << "return 0;"; - s << endl << "}" << endl; + s << INDENT << "return 0;" << endl; + s << '}' << endl; + + m_currentErrorCode = previousErrorCode; +} +void CppGenerator::writeIndexError(QTextStream& s, const QString& errorMsg) +{ + s << INDENT << "if (_i < 0 || _i >= (Py_ssize_t) " CPP_SELF_VAR "->size()) {" << endl; + { + Indentation indent(INDENT); + s << INDENT << "PyErr_SetString(PyExc_IndexError, \"" << errorMsg << "\");" << endl; + s << INDENT << "return " << m_currentErrorCode << ';' << endl; + } + s << INDENT << '}' << endl; } QString CppGenerator::writeReprFunction(QTextStream& s, const AbstractMetaClass* metaClass) diff --git a/generator/cppgenerator.h b/generator/cppgenerator.h index 19e8f0c50..a324422df 100644 --- a/generator/cppgenerator.h +++ b/generator/cppgenerator.h @@ -219,6 +219,9 @@ private: /// Write default implementations for sequence protocol void writeStdListWrapperMethods(QTextStream& s, const AbstractMetaClass* metaClass); + /// Helper function for writeStdListWrapperMethods. + void writeIndexError(QTextStream& s, const QString& errorMsg); + QString writeReprFunction(QTextStream& s, const AbstractMetaClass* metaClass); void writeRegisterType(QTextStream& s, const AbstractMetaClass* metaClass); |