Revision: 19339
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19339
Author:   kjym3
Date:     2009-03-20 23:42:59 +0100 (Fri, 20 Mar 2009)

Log Message:
-----------
Improvements in error handling at Python-C++ boundaries.
Also exported the Operators.chain() function.

Modified Paths:
--------------
    
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/BPy_Operators.cpp

Modified: 
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/BPy_Operators.cpp
===================================================================
--- 
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/BPy_Operators.cpp
        2009-03-20 22:41:27 UTC (rev 19338)
+++ 
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/BPy_Operators.cpp
        2009-03-20 22:42:59 UTC (rev 19339)
@@ -19,6 +19,7 @@
 static void Operators___dealloc__(BPy_Operators *self);
 
 static PyObject * Operators_select(BPy_Operators* self, PyObject *args);
+static PyObject * Operators_chain(BPy_Operators* self, PyObject *args);
 static PyObject * Operators_bidirectionalChain(BPy_Operators* self, PyObject 
*args);
 static PyObject * Operators_sequentialSplit(BPy_Operators* self, PyObject 
*args);
 static PyObject * Operators_recursiveSplit(BPy_Operators* self, PyObject 
*args);
@@ -32,6 +33,8 @@
 static PyMethodDef BPy_Operators_methods[] = {
        {"select", ( PyCFunction ) Operators_select, METH_VARARGS | 
METH_STATIC, 
        "select operator"},
+       {"chain", ( PyCFunction ) Operators_chain, METH_VARARGS | METH_STATIC,
+        "chain operator"},
        {"bidirectionalChain", ( PyCFunction ) Operators_bidirectionalChain, 
METH_VARARGS | METH_STATIC,
         "bidirectionalChain operator"},
        {"sequentialSplit", ( PyCFunction ) Operators_sequentialSplit, 
METH_VARARGS | METH_STATIC,
@@ -157,13 +160,18 @@
 {
        PyObject *obj = 0;
 
-       if(!(   PyArg_ParseTuple(args, "O", &obj) && 
-                       BPy_UnaryPredicate1D_Check(obj) && 
((BPy_UnaryPredicate1D *) obj)->up1D )) {
-               cout << "ERROR: Operators_select" << endl;
-               Py_RETURN_NONE;
+       if ( !PyArg_ParseTuple(args, "O!", &UnaryPredicate1D_Type, &obj) )
+               return NULL;
+       if ( !((BPy_UnaryPredicate1D *) obj)->up1D ) {
+               PyErr_SetString(PyExc_TypeError, "Operators.select(): 1st 
argument: invalid UnaryPredicate1D object");
+               return NULL;
        }
 
-       Operators::select(*( ((BPy_UnaryPredicate1D *) obj)->up1D ));
+       if (Operators::select(*( ((BPy_UnaryPredicate1D *) obj)->up1D )) < 0) {
+               if (!PyErr_Occurred())
+                       PyErr_SetString(PyExc_RuntimeError, "Operators.select() 
failed");
+               return NULL;
+       }
 
        Py_RETURN_NONE;
 }
@@ -174,25 +182,42 @@
 {
        PyObject *obj1 = 0, *obj2 = 0, *obj3 = 0;
 
-       if(!(   PyArg_ParseTuple(args, "OO|O", &obj1, &obj2, &obj3) && 
-                       BPy_ChainingIterator_Check(obj1) && 
((BPy_ChainingIterator *) obj1)->c_it &&
-                       BPy_UnaryPredicate1D_Check(obj2) && 
((BPy_UnaryPredicate1D *) obj2)->up1D )) {
-               cout << "ERROR: Operators_chain" << endl;
-               Py_RETURN_NONE;
+       if ( !PyArg_ParseTuple(args, "O!O!|O!", &ChainingIterator_Type, &obj1,
+                                                                               
    &UnaryPredicate1D_Type, &obj2,
+                                                                               
    &UnaryFunction1DVoid_Type, &obj3) )
+               return NULL;
+       if ( !((BPy_ChainingIterator *) obj1)->c_it ) {
+               PyErr_SetString(PyExc_TypeError, "Operators.chain(): 1st 
argument: invalid ChainingIterator object");
+               return NULL;
        }
+       if ( !((BPy_UnaryPredicate1D *) obj2)->up1D ) {
+               PyErr_SetString(PyExc_TypeError, "Operators.chain(): 2nd 
argument: invalid UnaryPredicate1D object");
+               return NULL;
+       }
 
        if( !obj3 ) {
                
-               Operators::chain(       *( ((BPy_ChainingIterator *) 
obj1)->c_it ),
-                                                       *( 
((BPy_UnaryPredicate1D *) obj2)->up1D )  );
+               if (Operators::chain(   *( ((BPy_ChainingIterator *) 
obj1)->c_it ),
+                                                               *( 
((BPy_UnaryPredicate1D *) obj2)->up1D )  ) < 0) {
+                       if (!PyErr_Occurred())
+                               PyErr_SetString(PyExc_RuntimeError, 
"Operators.chain() failed");
+                       return NULL;
+               }
                                                        
-       } else if( BPy_UnaryFunction1DVoid_Check(obj3) && 
((BPy_UnaryFunction1DVoid *) obj3)->uf1D_void ) {
+       } else {
                
+               if ( !((BPy_UnaryFunction1DVoid *) obj3)->uf1D_void ) {
+                       PyErr_SetString(PyExc_TypeError, "Operators.chain(): 
3rd argument: invalid UnaryFunction1DVoid object");
+                       return NULL;
+               }
+               if (Operators::chain(   *( ((BPy_ChainingIterator *) 
obj1)->c_it ),
+                                                               *( 
((BPy_UnaryPredicate1D *) obj2)->up1D ),
+                                                               *( 
((BPy_UnaryFunction1DVoid *) obj3)->uf1D_void )  ) < 0) {
+                       if (!PyErr_Occurred())
+                               PyErr_SetString(PyExc_RuntimeError, 
"Operators.chain() failed");
+                       return NULL;
+               }
                
-               Operators::chain(       *( ((BPy_ChainingIterator *) 
obj1)->c_it ),
-                                                       *( 
((BPy_UnaryPredicate1D *) obj2)->up1D ),
-                                                       *( 
((BPy_UnaryFunction1DVoid *) obj3)->uf1D_void )  );
-               
        }
        
        Py_RETURN_NONE;
@@ -202,21 +227,34 @@
 {
        PyObject *obj1 = 0, *obj2 = 0;
 
-       if(!(   PyArg_ParseTuple(args, "O|O", &obj1, &obj2) && 
-                       BPy_ChainingIterator_Check(obj1) && 
((BPy_ChainingIterator *) obj1)->c_it )) {
-               cout << "ERROR: Operators_bidirectionalChain" << endl;
-               Py_RETURN_NONE;
+       if( !PyArg_ParseTuple(args, "O!|O!", &ChainingIterator_Type, &obj1, 
&UnaryPredicate1D_Type, &obj2) )
+               return NULL;
+       if ( !((BPy_ChainingIterator *) obj1)->c_it ) {
+               PyErr_SetString(PyExc_TypeError, 
"Operators.bidirectionalChain(): 1st argument: invalid ChainingIterator 
object");
+               return NULL;
        }
-       
+
        if( !obj2 ) {
 
-               Operators::bidirectionalChain(  *( ((BPy_ChainingIterator *) 
obj1)->c_it ) );
+               if (Operators::bidirectionalChain(      *( 
((BPy_ChainingIterator *) obj1)->c_it ) ) < 0) {
+                       if (!PyErr_Occurred())
+                               PyErr_SetString(PyExc_RuntimeError, 
"Operators.bidirectionalChain() failed");
+                       return NULL;
+               }
                                                        
-       } else if( BPy_UnaryPredicate1D_Check(obj2) && ((BPy_UnaryPredicate1D 
*) obj2)->up1D ) {
+       } else {
+
+               if ( !((BPy_UnaryPredicate1D *) obj2)->up1D ) {
+                       PyErr_SetString(PyExc_TypeError, 
"Operators.bidirectionalChain(): 2nd argument: invalid UnaryPredicate1D 
object");
+                       return NULL;
+               }
+               if (Operators::bidirectionalChain(      *( 
((BPy_ChainingIterator *) obj1)->c_it ),
+                                                                               
        *( ((BPy_UnaryPredicate1D *) obj2)->up1D ) ) < 0) {
+                       if (!PyErr_Occurred())
+                               PyErr_SetString(PyExc_RuntimeError, 
"Operators.bidirectionalChain() failed");
+                       return NULL;
+               }
                
-               Operators::bidirectionalChain(  *( ((BPy_ChainingIterator *) 
obj1)->c_it ),
-                                                                               
*( ((BPy_UnaryPredicate1D *) obj2)->up1D )  );
-               
        }
        
        Py_RETURN_NONE;
@@ -225,26 +263,44 @@
 PyObject * Operators_sequentialSplit(BPy_Operators* self, PyObject *args)
 {
        PyObject *obj1 = 0, *obj2 = 0;
-       float f3 = 0.0;
+       float f = 0.0;
 
-       if(!(   PyArg_ParseTuple(args, "O|Of", &obj1, &obj2, &f3) && 
-                       BPy_UnaryPredicate0D_Check(obj1) && 
((BPy_UnaryPredicate0D *) obj1)->up0D )) {
-               cout << "ERROR: Operators_sequentialSplit" << endl;
-               Py_RETURN_NONE;
+       if( !PyArg_ParseTuple(args, "O!|Of", &UnaryPredicate0D_Type, &obj1, 
&obj2, &f) )
+               return NULL;
+       if ( !((BPy_UnaryPredicate0D *) obj1)->up0D ) {
+               PyErr_SetString(PyExc_TypeError, "Operators.sequentialSplit(): 
1st argument: invalid UnaryPredicate0D object");
+               return NULL;
        }
-       
+
        if( obj2 && BPy_UnaryPredicate0D_Check(obj2) ) {
                
-               Operators::sequentialSplit(     *( ((BPy_UnaryPredicate0D *) 
obj1)->up0D ),
+               if ( !((BPy_UnaryPredicate0D *) obj2)->up0D ) {
+                       PyErr_SetString(PyExc_TypeError, 
"Operators.sequentialSplit(): 2nd argument: invalid UnaryPredicate0D object");
+                       return NULL;
+               }
+               if (Operators::sequentialSplit( *( ((BPy_UnaryPredicate0D *) 
obj1)->up0D ),
                                                                                
*( ((BPy_UnaryPredicate0D *) obj2)->up0D ),
-                                                                               
f3 );
-                       
+                                                                               
f ) < 0) {
+                       if (!PyErr_Occurred())
+                               PyErr_SetString(PyExc_RuntimeError, 
"Operators.sequentialSplit() failed");
+                       return NULL;
+               }
+
        } else {
                
-               float f = ( obj2 && PyFloat_Check(obj2) ) ? 
PyFloat_AsDouble(obj2) : 0.0;
+               if ( obj2 ) {
+                       if ( !PyFloat_Check(obj2) ) {
+                               PyErr_SetString(PyExc_TypeError, 
"Operators.sequentialSplit(): invalid 2nd argument");
+                               return NULL;
+                       }
+                       f = PyFloat_AsDouble(obj2);
+               }
+               if (Operators::sequentialSplit( *( ((BPy_UnaryPredicate0D *) 
obj1)->up0D ), f ) < 0) {
+                       if (!PyErr_Occurred())
+                               PyErr_SetString(PyExc_RuntimeError, 
"Operators.sequentialSplit() failed");
+                       return NULL;
+               }
                
-               Operators::sequentialSplit( *( ((BPy_UnaryPredicate0D *) 
obj1)->up0D ), f );
-               
        }
        
        Py_RETURN_NONE;
@@ -253,30 +309,55 @@
 PyObject * Operators_recursiveSplit(BPy_Operators* self, PyObject *args)
 {
        PyObject *obj1 = 0, *obj2 = 0, *obj3 = 0;
-       float f4 = 0.0;
+       float f = 0.0;
 
-       if(!(   PyArg_ParseTuple(args, "OO|Of", &obj1, &obj2, &obj3, &f4) && 
-                       BPy_UnaryFunction0DDouble_Check(obj1) && 
((BPy_UnaryFunction0DDouble *) obj1)->uf0D_double )) {
-               cout << "ERROR: Operators_recursiveSplit" << endl;
-               Py_RETURN_NONE;
+       if ( !PyArg_ParseTuple(args, "O!O|Of", &UnaryFunction0DDouble_Type, 
&obj1, &obj2, &obj3, &f) )
+               return NULL;
+       if ( !((BPy_UnaryFunction0DDouble *) obj1)->uf0D_double ) {
+               PyErr_SetString(PyExc_TypeError, "Operators.recursiveSplit(): 
1st argument: invalid UnaryFunction0DDouble object");
+               return NULL;
        }
        
-       if( BPy_UnaryPredicate1D_Check(obj2) && ((BPy_UnaryPredicate1D *) 
obj2)->up1D ) {
-               
-               float f = ( obj3 && PyFloat_Check(obj3) ) ? 
PyFloat_AsDouble(obj3) : 0.0;
-                               
-               Operators::recursiveSplit(      *( ((BPy_UnaryFunction0DDouble 
*) obj1)->uf0D_double ),
-                                                                       *( 
((BPy_UnaryPredicate1D *) obj2)->up1D ),
-                                                                       f );
+       if ( BPy_UnaryPredicate1D_Check(obj2) ) {
+
+               if ( !((BPy_UnaryPredicate1D *) obj2)->up1D ) {
+                       PyErr_SetString(PyExc_TypeError, 
"Operators.recursiveSplit(): 2nd argument: invalid UnaryPredicate1D object");
+                       return NULL;
+               }
+               if ( obj3 ) {
+                       if ( !PyFloat_Check(obj3) ) {
+                               PyErr_SetString(PyExc_TypeError, 
"Operators.recursiveSplit(): invalid 3rd argument");
+                               return NULL;
+                       }
+                       f = PyFloat_AsDouble(obj3);
+               }
+               if (Operators::recursiveSplit(  *( ((BPy_UnaryFunction0DDouble 
*) obj1)->uf0D_double ),
+                                                                               
*( ((BPy_UnaryPredicate1D *) obj2)->up1D ),
+                                                                               
f ) < 0) {
+                       if (!PyErr_Occurred())
+                               PyErr_SetString(PyExc_RuntimeError, 
"Operators.recursiveSplit() failed");
+                       return NULL;
+               }
        
-       } else if(      BPy_UnaryPredicate0D_Check(obj2) && 
((BPy_UnaryPredicate0D *) obj2)->up0D &&
-                               BPy_UnaryPredicate1D_Check(obj3) && 
((BPy_UnaryPredicate1D *) obj3)->up1D    ) {
-               
-               Operators::recursiveSplit(      *( ((BPy_UnaryFunction0DDouble 
*) obj1)->uf0D_double ),
-                                                                       *( 
((BPy_UnaryPredicate0D *) obj2)->up0D ),
-                                                                       *( 
((BPy_UnaryPredicate1D *) obj3)->up1D ),
-                                                                       f4 );
+       } else {
 
+               if ( !BPy_UnaryPredicate0D_Check(obj2) || 
!((BPy_UnaryPredicate0D *) obj2)->up0D ) {
+                       PyErr_SetString(PyExc_TypeError, 
"Operators.recursiveSplit(): invalid 2nd argument");
+                       return NULL;
+               }
+               if ( !BPy_UnaryPredicate1D_Check(obj3) || 
!((BPy_UnaryPredicate1D *) obj3)->up1D ) {
+                       PyErr_SetString(PyExc_TypeError, 
"Operators.recursiveSplit(): invalid 3rd argument");
+                       return NULL;
+               }

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to