Revision: 472
          http://rpy.svn.sourceforge.net/rpy/?rev=472&view=rev
Author:   lgautier
Date:     2008-03-28 14:00:07 -0700 (Fri, 28 Mar 2008)

Log Message:
-----------
Fix __setitem__ for STRSXP vectors.

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-28 20:35:53 UTC 
(rev 471)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c    2008-03-28 21:00:07 UTC 
(rev 472)
@@ -790,6 +790,7 @@
     return -1;
   }
 
+  SEXP sexp_copy;
   i_R = (R_len_t)i;
   switch (TYPEOF(*sexp)) {
   case REALSXP:
@@ -805,10 +806,12 @@
     (COMPLEX_POINTER(*sexp))[i_R] = (COMPLEX_POINTER(*sexp_val))[0];
     break;
   case STRSXP:
-    SET_STRING_ELT(*sexp, i_R, *sexp_val);
+    SET_STRING_ELT(*sexp, i_R, STRING_ELT(*sexp_val, 0));
     break;
   case VECSXP:
-    SET_VECTOR_ELT(*sexp, i_R, *sexp_val);
+    PROTECT(sexp_copy = Rf_duplicate(*sexp_val));
+    SET_VECTOR_ELT(*sexp, i_R, sexp_copy);
+    UNPROTECT(1);
     break;
   default:
     PyErr_Format(PyExc_ValueError, "cannot handle type %d", 

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py        
2008-03-28 20:35:53 UTC (rev 471)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py        
2008-03-28 21:00:07 UTC (rev 472)
@@ -168,8 +168,10 @@
         self.assertTrue(myVec[2][0][0] == "a")
         
     def testAssignItemString(self):
-        letters_R = rinterface.globalEnv.get("letters")
-        #letters_R[0] = rinterface.SexpVector(["z", ], rinterface.STRSXP)
+        letters_R = rinterface.SexpVector("abcdefghij", rinterface.STRSXP)
+        self.assertRaises(ValueError, letters_R.__setitem__, 0, 
rinterface.SexpVector([1, ], rinterface.INTSXP))
+
+        letters_R[0] = rinterface.SexpVector(["z", ], rinterface.STRSXP)
         #import pdb; pdb.set_trace()
         self.assertTrue(letters_R[0] == "z") #FIXME: segfault when assigning 
value
 


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