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