[Rpy] SF.net SVN: rpy:[624] branches/rpy_nextgen/rpy/rinterface/rinterface.c

2008-08-09 Thread lgautier
Revision: 624
  http://rpy.svn.sourceforge.net/rpy/?rev=624&view=rev
Author:   lgautier
Date: 2008-08-09 18:08:45 + (Sat, 09 Aug 2008)

Log Message:
---
Catch attempts at creating vectors while R is not initialized
(no longer segfault)

Modified Paths:
--
branches/rpy_nextgen/rpy/rinterface/rinterface.c

Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c
===
--- branches/rpy_nextgen/rpy/rinterface/rinterface.c2008-08-08 18:49:58 UTC 
(rev 623)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c2008-08-09 18:08:45 UTC 
(rev 624)
@@ -305,9 +305,6 @@
 
 
 /* --- Initialize and terminate an embedded R --- */
-/* Should having multiple threads of R become possible, 
- * useful routines could appear here...
- */
 static PyObject* EmbeddedR_init(PyObject *self) 
 {
 
@@ -1485,6 +1482,12 @@
   printf("%p: VectorSexp initializing...\n", self);
 #endif 
 
+  if (! (embeddedR_status & RPY_R_INITIALIZED)) {
+PyErr_Format(PyExc_RuntimeError, 
+"R must be initialized before any instance can be created.");
+return -1;
+  }
+
   PyObject *object;
   int sexptype = -1;
   PyObject *copy;


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 the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
___
rpy-list mailing list
rpy-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpy-list


[Rpy] SF.net SVN: rpy:[625] branches/rpy_nextgen

2008-08-09 Thread lgautier
Revision: 625
  http://rpy.svn.sourceforge.net/rpy/?rev=625&view=rev
Author:   lgautier
Date: 2008-08-09 18:50:36 + (Sat, 09 Aug 2008)

Log Message:
---
- R string vectors can now be built from Python unicode objects
- fixed tests (ending-reinitializing R causes trouble)

Modified Paths:
--
branches/rpy_nextgen/NEWS
branches/rpy_nextgen/rpy/rinterface/rinterface.c
branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py
branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py
branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py

Modified: branches/rpy_nextgen/NEWS
===
--- branches/rpy_nextgen/NEWS   2008-08-09 18:08:45 UTC (rev 624)
+++ branches/rpy_nextgen/NEWS   2008-08-09 18:50:36 UTC (rev 625)
@@ -8,6 +8,9 @@
 
 - :func:`setReadConsole`: specify Python callback for console input
 
+- R string vectors can now be built from Python unicode objects
+
+
 Changes
 ---
 
@@ -28,7 +31,9 @@
 
 - Handling of negative indexes for :class:`SexpVector`'s :meth:`__getitem__` 
and :meth:`__setitem__` was missing
 
+- Trying to create an instance of :class:`SexpVector` before initializing R 
raises a RuntimeException (used to segfault)
 
+
 Release 2.0.0a2
 ===
 

Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c
===
--- branches/rpy_nextgen/rpy/rinterface/rinterface.c2008-08-09 18:08:45 UTC 
(rev 624)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c2008-08-09 18:50:36 UTC 
(rev 625)
@@ -2013,6 +2013,7 @@
 newSEXP(PyObject *object, int rType)
 {
   SEXP sexp;
+  SEXP str_R; /* used whenever there a string / unicode */
   PyObject *seq_object, *item; 
 
 #ifdef RPY_VERBOSE
@@ -2071,7 +2072,7 @@
   case STRSXP:
 for (i = 0; i < length; ++i) {
   if((item = PyObject_Str(PySequence_Fast_GET_ITEM(seq_object, i {
-   SEXP str_R = mkChar(PyString_AS_STRING(item));
+   str_R = mkChar(PyString_AS_STRING(item));
if (!str_R) {
  Py_DECREF(item);
  PyErr_NoMemory();
@@ -2081,6 +2082,17 @@
Py_DECREF(item);
SET_STRING_ELT(sexp, i, str_R);
   }
+  else if ((item = PyObject_Unicode(PySequence_Fast_GET_ITEM(seq_object, 
i {
+   str_R = mkChar(PyUnicode_AS_DATA(item));
+   if (!str_R) {
+ Py_DECREF(item);
+ PyErr_NoMemory();
+ sexp = NULL;
+ break;
+   }
+   Py_DECREF(item);
+   SET_STRING_ELT(sexp, i, str_R);
+  }
   else {
PyErr_Clear();
SET_STRING_ELT(sexp, i, NA_STRING);

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py
===
--- branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py 2008-08-09 
18:08:45 UTC (rev 624)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py 2008-08-09 
18:50:36 UTC (rev 625)
@@ -24,7 +24,9 @@
 self.assertEquals(yes.strip(), res[0])
 rinterface.setReadConsole(rinterface.consoleRead)
 
+#FIXME: end and initializing again causes currently a lot a trouble...
 def testCallErrorWhenEndedR(self):
+self.assertTrue(False) # worked when tested, but calling endEmbeddedR 
causes trouble
 t = rinterface.baseNameSpaceEnv['date']
 rinterface.endEmbeddedR(1)
 self.assertRaises(RuntimeError, t)

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py
===
--- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py   
2008-08-09 18:08:45 UTC (rev 624)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py   
2008-08-09 18:50:36 UTC (rev 625)
@@ -54,11 +54,15 @@
 
 
 
-def testRcall(self):
-ad = rlc.ArgsDict((('a', rinterface.SexpVector([2, ], 
rinterface.INTSXP)), 
-   ('b', rinterface.SexpVector([1, ], 
rinterface.INTSXP)),
-   (None, rinterface.SexpVector([5, ], 
rinterface.INTSXP)),
-   ('c', rinterface.SexpVector([0, ], 
rinterface.INTSXP
+def testRcallArgsDict(self):
+ad = rlc.ArgsDict((('a', rinterface.SexpVector([2, ], 
+   rinterface.INTSXP)), 
+   ('b', rinterface.SexpVector([1, ], 
+   rinterface.INTSXP)),
+   (None, rinterface.SexpVector([5, ], 
+rinterface.INTSXP)),
+   ('c', rinterface.SexpVector([0, ], 
+   rinterface.INTSXP
 
 mylist = rinterface.baseNameSpaceEnv['list'].rcall(ad.items())
 

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py
=