From a642a9d7563a9fe6030d5142cb3a5376cce26b46 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 7 Dec 2004 03:07:34 +0000 Subject: [PATCH] better handling when getter doesn't return a tuple --- direct/src/dcparser/dcClass.cxx | 14 +++++++++++++- direct/src/dcparser/dcField.cxx | 34 +++++++++++++++++++++------------ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/direct/src/dcparser/dcClass.cxx b/direct/src/dcparser/dcClass.cxx index 10d0bc66ce..8998931507 100644 --- a/direct/src/dcparser/dcClass.cxx +++ b/direct/src/dcparser/dcClass.cxx @@ -620,7 +620,19 @@ pack_required_field(DCPacker &packer, PyObject *distobj, PyObject *tuple = PyTuple_New(1); PyTuple_SET_ITEM(tuple, 0, result); result = tuple; - } + + } else { + // Otherwise, it had better already be a sequence or tuple of some + // sort. + if (!PySequence_Check(result)) { + ostringstream strm; + strm << "Since dclass " << get_name() << " method " << setter_name + << " is declared to have multiple parameters, Python function " + << getter_name << " must return a list or tuple.\n"; + nassert_raise(strm.str()); + return false; + } + } // Now pack the arguments into the datagram. bool pack_ok = atom->pack_args(packer, result); diff --git a/direct/src/dcparser/dcField.cxx b/direct/src/dcparser/dcField.cxx index 1abf258e4c..3701007f0d 100644 --- a/direct/src/dcparser/dcField.cxx +++ b/direct/src/dcparser/dcField.cxx @@ -419,20 +419,30 @@ pack_args(DCPacker &packer, PyObject *sequence) const { } if (!Notify::ptr()->has_assert_failed()) { - PyObject *tuple = PySequence_Tuple(sequence); - PyObject *str = PyObject_Str(tuple); - ostringstream strm; - if (packer.had_pack_error()) { - strm << "Incorrect arguments to field: " << get_name() - << PyString_AsString(str); - } else { - strm << "Value out of range on field: " << get_name() - << PyString_AsString(str); - } - Py_DECREF(str); - Py_DECREF(tuple); + PyObject *tuple = PySequence_Tuple(sequence); + if (tuple == (PyObject *)NULL) { + PyObject *str = PyObject_Str(sequence); + nassertr(str != (PyObject *)NULL, false); + strm << "Arguments to field " << get_name() + << " not a sequence: " << PyString_AsString(str); + Py_DECREF(str); + + } else { + PyObject *str = PyObject_Str(tuple); + + if (packer.had_pack_error()) { + strm << "Incorrect arguments to field: " << get_name() + << PyString_AsString(str); + } else { + strm << "Value out of range on field: " << get_name() + << PyString_AsString(str); + } + + Py_DECREF(str); + Py_DECREF(tuple); + } nassert_raise(strm.str()); }