Revision: 645
http://rpy.svn.sourceforge.net/rpy/?rev=645&view=rev
Author: lgautier
Date: 2008-08-28 07:14:29 +0000 (Thu, 28 Aug 2008)
Log Message:
-----------
- fixed crash when calling enclos() on SexpEnvironment with R not
initialized (bug report #2078176)
- fixed possible crash when calling frame() on SexpEnvironment with R
not initialized
- fixed CObject destructor
Modified Paths:
--------------
branches/rpy_nextgen/rpy/rinterface/rinterface.c
Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-08-25 09:52:23 UTC
(rev 644)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-08-28 07:14:29 UTC
(rev 645)
@@ -448,33 +448,40 @@
staticforward PyTypeObject Sexp_Type;
-static void
-Sexp_clear(PySexpObject *self)
+void SexpObject_clear(SexpObject *sexpobj)
{
- RPY_DECREF(self);
+
+ (*sexpobj).count--;
+
#ifdef RPY_VERBOSE
printf("Python:%p / R:%p -- sexp count is %i...",
- self, RPY_SEXP(self), RPY_COUNT(self));
+ self, sexpobj->sexp, sexpobj->count);
#endif
-
- if ((RPY_COUNT(self) == 0) && RPY_SEXP(self)) {
+ if (((*sexpobj).count == 0) && (*sexpobj).sexp) {
#ifdef RPY_VERBOSE
printf("freeing SEXP resources...");
#endif
- if (RPY_SEXP(self) != R_NilValue) {
+ if (sexpobj->sexp != R_NilValue) {
#ifdef RPY_DEBUG_PRESERVE
- printf(" Sexp_clear: R_ReleaseObject( %p )\n", RPY_SEXP(self));
+ printf(" Sexp_clear: R_ReleaseObject( %p )\n", sexpobj->sexp);
#endif
- R_ReleaseObject(RPY_SEXP(self));
+ R_ReleaseObject(sexpobj->sexp);
}
- PyMem_Free(self->sObj);
+ PyMem_Free(sexpobj);
////self->ob_type->tp_free((PyObject*)self);
#ifdef RPY_VERBOSE
printf("done.\n");
#endif
- }
+ }
+}
+static void
+Sexp_clear(PySexpObject *self)
+{
+
+ SexpObject_clear(self->sObj);
+
}
@@ -609,17 +616,24 @@
This method corresponds to the macro NAMED.\n\
See the R-extensions manual for further details.");
+void SexpObject_CObject_destroy(void *cobj)
+{
+ SexpObject* sexpobj_ptr = (SexpObject *)cobj;
+ SexpObject_clear(sexpobj_ptr);
+}
+
static PyObject*
Sexp_sexp_get(PyObject *self, void *closure)
{
- SEXP sexp = RPY_SEXP(((PySexpObject*)self));
+ PySexpObject* rpyobj = (PySexpObject*)self;
- if (! sexp) {
+ if (! RPY_SEXP(rpyobj)) {
PyErr_Format(PyExc_ValueError, "NULL SEXP.");
return NULL;;
}
-
- PyObject *res = PyCObject_FromVoidPtr(sexp, NULL);
+
+ RPY_INCREF(rpyobj);
+ PyObject *res = PyCObject_FromVoidPtr(&rpyobj, SexpObject_CObject_destroy);
return res;
}
@@ -873,6 +887,7 @@
//env_R = R_GlobalContext;
}
+ /* From Alexander's original code: */
/* Enable our handler for SIGINT inside the R
interpreter. Otherwise, we cannot stop R calculations, since
SIGINT is only processed between Python bytecodes. Also, save the
@@ -1733,6 +1748,11 @@
static PyObject*
EnvironmentSexp_frame(PyObject *self)
{
+ if (! (embeddedR_status & RPY_R_INITIALIZED)) {
+ PyErr_Format(PyExc_RuntimeError,
+ "R must be initialized before environments can be accessed.");
+ return NULL;
+ }
SEXP res_R = NULL;
PySexpObject *res;
res_R = FRAME(RPY_SEXP((PySexpObject *)self));
@@ -1745,6 +1765,11 @@
static PyObject*
EnvironmentSexp_enclos(PyObject *self)
{
+ if (! (embeddedR_status & RPY_R_INITIALIZED)) {
+ PyErr_Format(PyExc_RuntimeError,
+ "R must be initialized before environments can be accessed.");
+ return NULL;
+ }
SEXP res_R = NULL;
PySexpObject *res;
res_R = ENCLOS(RPY_SEXP((PySexpObject *)self));
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list