#586: exceptions on invalid element access
authorJames Bowman <no@email>
Tue, 25 Jan 2011 01:33:48 +0000 (01:33 +0000)
committerJames Bowman <no@email>
Tue, 25 Jan 2011 01:33:48 +0000 (01:33 +0000)
modules/python/cv.cpp
tests/python/test.py

index ffd35c3..ce56ab4 100644 (file)
@@ -151,7 +151,7 @@ static void translate_error_to_exception(void)
 }
 
 #define ERRCHK do { if (cvGetErrStatus() != 0) { translate_error_to_exception(); return NULL; } } while (0)
-#define ERRWRAP(F) \
+#define ERRWRAPN(F, N) \
     do { \
         try \
         { \
@@ -160,10 +160,11 @@ static void translate_error_to_exception(void)
         catch (const cv::Exception &e) \
         { \
            PyErr_SetString(opencv_error, e.err.c_str()); \
-           return NULL; \
+           return N; \
         } \
         ERRCHK; \
     } while(0)
+#define ERRWRAP(F) ERRWRAPN(F, NULL) // for most functions, exception -> NULL return
 
 /************************************************************************/
 
@@ -3139,16 +3140,16 @@ static int cvarr_SetItem(PyObject *o, PyObject *key, PyObject *v)
   }
   switch (dd.count) {
   case 1:
-    cvSet1D(cva, dd.i[0], s);
+    ERRWRAPN(cvSet1D(cva, dd.i[0], s), -1);
     break;
   case 2:
-    cvSet2D(cva, dd.i[0], dd.i[1], s);
+    ERRWRAPN(cvSet2D(cva, dd.i[0], dd.i[1], s), -1);
     break;
   case 3:
-    cvSet3D(cva, dd.i[0], dd.i[1], dd.i[2], s);
+    ERRWRAPN(cvSet3D(cva, dd.i[0], dd.i[1], dd.i[2], s), -1);
     break;
   default:
-    cvSetND(cva, dd.i, s);
+    ERRWRAPN(cvSetND(cva, dd.i, s), -1);
     // XXX - OpenCV bug? - seems as if an error in cvSetND does not set error status?
     break;
   }
index 05395af..adaa6d2 100644 (file)
@@ -968,6 +968,43 @@ class AreaTests(OpenCVTests):
         else:
             print "SKIPPING test_numpy - numpy support not built"
 
+    def test_boundscatch(self):
+        l2 = cv.CreateMat(256, 1, cv.CV_8U)
+        l2[0,0]     # should be OK
+        self.assertRaises(cv.error, lambda: l2[1,1])
+        l2[0]       # should be OK
+        self.assertRaises(cv.error, lambda: l2[299])
+        for n in range(1, 8):
+            l = cv.CreateMatND([2] * n, cv.CV_8U)
+            l[0] # should be OK
+            self.assertRaises(cv.error, lambda: l[999])
+
+            tup0 = (0,) * n
+            l[tup0] # should be OK
+            tup2 = (2,) * n
+            self.assertRaises(cv.error, lambda: l[tup2])
+
+    def test_stereo(self):
+        bm = cv.CreateStereoBMState()
+        def illegal_delete():
+            bm = cv.CreateStereoBMState()
+            del bm.preFilterType
+        def illegal_assign():
+            bm = cv.CreateStereoBMState()
+            bm.preFilterType = "foo"
+
+        self.assertRaises(TypeError, illegal_delete)
+        self.assertRaises(TypeError, illegal_assign)
+
+        left = self.get_sample("samples/c/lena.jpg", 0)
+        right = self.get_sample("samples/c/lena.jpg", 0)
+        disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
+        cv.FindStereoCorrespondenceBM(left, right, disparity, bm)
+
+        gc = cv.CreateStereoGCState(16, 2)
+        left_disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
+        right_disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
+
     def test_stereo(self):
         bm = cv.CreateStereoBMState()
         def illegal_delete():