Browse Source

better handling when getter doesn't return a tuple

David Rose 21 years ago
parent
commit
a642a9d756
2 changed files with 34 additions and 12 deletions
  1. 13 1
      direct/src/dcparser/dcClass.cxx
  2. 21 11
      direct/src/dcparser/dcField.cxx

+ 13 - 1
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);

+ 21 - 11
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);
+    
+    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 {
-      strm << "Value out of range on field: " << get_name()
-           << PyString_AsString(str);
+      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);
     }
-    
-    Py_DECREF(str);
-    Py_DECREF(tuple);
 
     nassert_raise(strm.str());
   }