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