aboutsummaryrefslogtreecommitdiffstats
path: root/generator
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2011-07-29 03:17:02 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:17:06 -0300
commit29183ffe770ff7738c5eebc5480ca956c4fe086f (patch)
tree23e32626c312edee178abd3d9cf7b87df6d73b64 /generator
parent34395eeb8c57f2225c7f20b9e20f9d92f2131ce7 (diff)
Improved coding style in the terrible writeStdListWrapperMethods method.
Diffstat (limited to 'generator')
-rw-r--r--generator/cppgenerator.cpp70
-rw-r--r--generator/cppgenerator.h3
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);