Revision: 467
          http://rpy.svn.sourceforge.net/rpy/?rev=467&view=rev
Author:   lgautier
Date:     2008-03-27 14:11:17 -0700 (Thu, 27 Mar 2008)

Log Message:
-----------
- fixed invalid return type for SexpVector's __setitem__
(solving a number a number issues)
- figured out trouble with some unit tests

Modified Paths:
--------------
    branches/rpy_nextgen/rpy/rinterface/rinterface.c
    branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py

Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/rinterface.c    2008-03-27 20:11:59 UTC 
(rev 466)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c    2008-03-27 21:11:17 UTC 
(rev 467)
@@ -746,49 +746,48 @@
 }
 
 /* a[i] = val */
-static PyObject *
+static int
 VectorSexp_ass_item(PyObject *object, Py_ssize_t i, PyObject *val)
 {
-  PyObject* res;
   R_len_t i_R;
 
   /* R is still with int for indexes */
   if (i >= R_LEN_T_MAX) {
     PyErr_Format(PyExc_IndexError, "Index value exceeds what R can handle.");
-    return NULL;
+    return -1;
   }
 
   SEXP *sexp = &(((SexpObject *)object)->sexp);
   if (i >= GET_LENGTH(*sexp)) {
     PyErr_Format(PyExc_IndexError, "Index out of range.");
-    return NULL;
+    return -1;
   }
 
   if (! sexp) {
     PyErr_Format(PyExc_ValueError, "NULL SEXP.");
-    return NULL;
+    return -1;
   }
 
   int is_SexpObject = PyObject_TypeCheck(val, &Sexp_Type);
   if (! is_SexpObject) {
     PyErr_Format(PyExc_ValueError, "Any new value must be of "
                 "type 'Sexp_Type'.");
-    return NULL;
+    return -1;
   }
   SEXP *sexp_val = &(((SexpObject *)val)->sexp);
   if (! sexp_val) {
     PyErr_Format(PyExc_ValueError, "NULL SEXP.");
-    return NULL;
+    return -1;
   }
 
   if (TYPEOF(*sexp_val) != TYPEOF(*sexp)) {
     PyErr_Format(PyExc_ValueError, "The type for the new value cannot be 
different.");
-    return NULL;
+    return -1;
   }
 
   if ((TYPEOF(*sexp_val) != VECSXP) & (LENGTH(*sexp_val) != 1)) {
     PyErr_Format(PyExc_ValueError, "The new value must be of length 1.");
-    return NULL;
+    return -1;
   }
 
   i_R = (R_len_t)i;
@@ -814,10 +813,10 @@
   default:
     PyErr_Format(PyExc_ValueError, "cannot handle type %d", 
                 TYPEOF(*sexp));
-    res = NULL;
+    return -1;
     break;
   }
-  return res;
+  return 0;
 }
 
 static PySequenceMethods VectorSexp_sequenceMethods = {

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py        
2008-03-27 20:11:59 UTC (rev 466)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py        
2008-03-27 21:11:17 UTC (rev 467)
@@ -22,13 +22,14 @@
         isLogical = rinterface.globalEnv.get("is.logical")
         ok = isLogical(sexp)[0]
         self.assertTrue(ok)
+        self.assertTrue(sexp[0])
 
         sexp = rinterface.SexpVector(["a", ], rinterface.LGLSXP)
-        isNA = rinterface.globalEnv.get("is.na")
-        ok = isNA(sexp)[0]
+        isLogical = rinterface.globalEnv.get("is.logical")
+        ok = isLogical(sexp)[0]
         self.assertTrue(ok)
+        self.assertTrue(sexp[0])
 
-
     def testNewInt(self):
         sexp = rinterface.SexpVector([1, ], rinterface.INTSXP)
         isInteger = rinterface.globalEnv.get("is.integer")
@@ -63,10 +64,9 @@
         ok = isCharacter(sexp)[0]
         self.assertTrue(ok)
 
-        #FIXME: elucidate what is happening here
         sexp = rinterface.SexpVector([1, ], rinterface.STRSXP)
-        isNA = rinterface.globalEnv.get("is.na")
-        ok = isNA(sexp)[0]
+        isCharacter = rinterface.globalEnv.get("is.character")
+        ok = isCharacter(sexp)[0]
         self.assertTrue(ok)
 
     def testNewVector(self):
@@ -81,8 +81,7 @@
         
 
     def testNew_InvalidType(self):
-        self.assertTrue(False)
-        #FIXME
+        self.assertTrue(False) #FIXME: invalid type causes a segfault
         self.assertRaises(ValueError, rinterface.SexpVector, [1, ], -1)
 
     def testGetItem(self):
@@ -106,12 +105,13 @@
     def testAssignItemDifferentType(self):
         c_R = rinterface.globalEnv.get("c")
         myVec = c_R(rinterface.SexpVector([0, 1, 2, 3, 4, 5], 
rinterface.INTSXP))
+        #import pdb; pdb.set_trace()
         self.assertRaises(ValueError, myVec.__setitem__, 0, 
rinterface.SexpVector(["a", ], rinterface.STRSXP))
         
     def testAssignItemOutOfBound(self):
         c_R = rinterface.globalEnv.get("c")
         myVec = c_R(rinterface.SexpVector([0, 1, 2, 3, 4, 5], 
rinterface.INTSXP))
-        self.assertRaises(ValueError, myVec.__setitem__, 10, 
rinterface.SexpVector([1, ], rinterface.INTSXP))
+        self.assertRaises(IndexError, myVec.__setitem__, 10, 
rinterface.SexpVector([1, ], rinterface.INTSXP))
 
     def testAssignItemInt(self):
         c_R = rinterface.globalEnv.get("c")


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
rpy-list mailing list
rpy-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpy-list

Reply via email to