Revision: 464
          http://rpy.svn.sourceforge.net/rpy/?rev=464&view=rev
Author:   lgautier
Date:     2008-03-24 02:04:24 -0700 (Mon, 24 Mar 2008)

Log Message:
-----------
- implemented __iter__ for SexpEnvironment
- added PROTECT/UNPROTECT for __len__

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

Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/rinterface.c    2008-03-23 22:08:42 UTC 
(rev 463)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c    2008-03-24 09:04:24 UTC 
(rev 464)
@@ -1017,8 +1017,10 @@
     PyErr_Format(PyExc_ValueError, "The environment has NULL SEXP.");
     return -1;
   }
-  SEXP symbols = R_lsInternal(rho_R, TRUE);
+  SEXP symbols;
+  PROTECT(symbols = R_lsInternal(rho_R, TRUE));
   Py_ssize_t len = (Py_ssize_t)GET_LENGTH(symbols);
+  UNPROTECT(1);
   return len;
 }
 
@@ -1028,6 +1030,26 @@
   (objobjargproc)EnvironmentSexp_ass_subscript  /* mp_ass_subscript */
 };
 
+static PyObject* 
+EnvironmentSexp_iter(PyObject *sexpEnvironment)
+{
+  SEXP rho_R = ((SexpObject *)sexpEnvironment)->sexp;
+
+  if (! rho_R) {
+    PyErr_Format(PyExc_ValueError, "The environment has NULL SEXP.");
+    return NULL;
+  }
+  SEXP symbols;
+  PROTECT(symbols = R_lsInternal(rho_R, TRUE));
+  SexpObject *seq = newSexpObject(symbols);
+  Py_INCREF(seq);
+  UNPROTECT(1);
+ 
+  PyObject *it = PyObject_GetIter((PyObject *)seq);
+  Py_DECREF(seq);
+  return it;
+}
+
 PyDoc_STRVAR(EnvironmentSexp_Type_doc,
 "R object that is an environment.\
  R environments can be seen as similar to Python\
@@ -1073,7 +1095,7 @@
         0,                      /*tp_clear*/
         0,                      /*tp_richcompare*/
         0,                      /*tp_weaklistoffset*/
-        0,                      /*tp_iter*/
+        EnvironmentSexp_iter,                      /*tp_iter*/
         0,                      /*tp_iternext*/
         EnvironmentSexp_methods,           /*tp_methods*/
         0,                      /*tp_members*/

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py   
2008-03-23 22:08:42 UTC (rev 463)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py   
2008-03-24 09:04:24 UTC (rev 464)
@@ -54,6 +54,16 @@
         env["b"] = rinterface.SexpVector([123, ], rinterface.INTSXP)
         self.assertEquals(2, len(env))
 
+    def testIter(self):
+        newEnv = rinterface.globalEnv.get("new.env")
+        env = newEnv()
+        env["a"] = rinterface.SexpVector([123, ], rinterface.INTSXP)
+        env["b"] = rinterface.SexpVector([456, ], rinterface.INTSXP)
+        symbols = [x for x in env]
+        self.assertEquals(2, len(symbols))
+        for s in ["a", "b"]:
+            self.assertTrue(s in symbols)
+
 def suite():
     suite = 
unittest.TestLoader().loadTestsFromTestCase(SexpEnvironmentTestCase)
     return suite


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

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
rpy-list mailing list
rpy-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpy-list

Reply via email to