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
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list