better handling when getter doesn't return a tuple

This commit is contained in:
David Rose 2004-12-07 03:07:34 +00:00
parent 2657a91ae0
commit a642a9d756
2 changed files with 35 additions and 13 deletions

View File

@ -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);

View File

@ -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());
}