Revision: 539
http://rpy.svn.sourceforge.net/rpy/?rev=539&view=rev
Author: lgautier
Date: 2008-05-30 02:23:36 -0700 (Fri, 30 May 2008)
Log Message:
-----------
Added back the R to Python exception forwarding.
(not sure the exception string is forwarded)
Modified Paths:
--------------
branches/rpy_nextgen/rpy/rinterface/rinterface.c
branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py
Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-05-30 09:18:53 UTC
(rev 538)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-05-30 09:23:36 UTC
(rev 539)
@@ -92,8 +92,8 @@
static const int maxValidSexpType = 99;
static char **validSexpType;
-//FIXME: see the details of error handling
-static PyObject *ErrorObject;
+static SEXP GetErrMessage_SEXP;
+static PyObject *RPyExc_RuntimeError = NULL;
//FIXME: see the details of interruption
/* Indicates whether the R interpreter was interrupted by a SIGINT */
@@ -146,7 +146,7 @@
PyObject *function;
if ( PyArg_ParseTuple(args, "O:console",
- &function)) {
+ &function)) {
if (!PyCallable_Check(function)) {
PyErr_SetString(PyExc_TypeError, "parameter must be callable");
@@ -159,7 +159,7 @@
Py_INCREF(Py_None);
result = Py_None;
} else {
- PyErr_SetString(PyExc_TypeError, "The only parameter should be a
callable.");
+ PyErr_SetString(PyExc_TypeError, "The parameter should be a callable.");
}
return result;
@@ -190,6 +190,7 @@
//return NULL;
}
+ printf("--->\n");
result = PyEval_CallObject(writeConsoleCallback, arglist);
Py_DECREF(arglist);
@@ -252,6 +253,9 @@
RPY_SEXP(baseNameSpaceEnv) = R_BaseNamespace;
RPY_SEXP(na_string) = NA_STRING;
+ GetErrMessage_SEXP = findVar(install("geterrmessage"),
+ R_BaseNamespace);
+
PyObject *res = PyInt_FromLong(status);
#ifdef RPY_VERBOSE
@@ -288,6 +292,7 @@
Rf_endEmbeddedR((int)fatal);
RPY_SEXP(globalEnv) = R_EmptyEnv;
RPY_SEXP(baseNameSpaceEnv) = R_EmptyEnv;
+ GetErrMessage_SEXP = R_NilValue;
//FIXME: Is it possible to reinitialize R later ?
//Py_XDECREF(embeddedR_isInitialized);
@@ -304,12 +309,12 @@
-static PyObject*
+static void
EmbeddedR_exception_from_errmessage(void)
{
- //FIXME: sort the error message thing geterrmessage
- PyErr_SetString(ErrorObject, "Error.");
- return NULL;
+ char *message = CHARACTER_VALUE(eval(GetErrMessage_SEXP,
+ R_GlobalEnv));
+ PyErr_SetString(RPyExc_RuntimeError, message);
}
@@ -750,7 +755,8 @@
UNPROTECT(2);
if (! res_R) {
- PyErr_Format(PyExc_RuntimeError, "Error while running R code");
+ EmbeddedR_exception_from_errmessage();
+ //PyErr_Format(PyExc_RuntimeError, "Error while running R code");
return NULL;
}
@@ -1700,7 +1706,6 @@
char *name;
SEXP rho_R = R_GlobalEnv, res;
PyObject rho;
- PyObject *ErrorObject;
if (!PyArg_ParseTuple(args, "s", &name, &rho)) {
return NULL;
@@ -1921,20 +1926,24 @@
);
PyModule_AddObject(m, "initOptions", initOptions);
+
+
PyModule_AddObject(m, "Sexp", (PyObject *)&Sexp_Type);
PyModule_AddObject(m, "SexpClosure", (PyObject *)&ClosureSexp_Type);
PyModule_AddObject(m, "SexpVector", (PyObject *)&VectorSexp_Type);
PyModule_AddObject(m, "SexpEnvironment", (PyObject *)&EnvironmentSexp_Type);
PyModule_AddObject(m, "SexpS4", (PyObject *)&S4Sexp_Type);
- //FIXME: clean the exception stuff
- if (ErrorObject == NULL) {
- ErrorObject = PyErr_NewException("rinterface.error", NULL, NULL);
- if (ErrorObject == NULL)
+
+ if (RPyExc_RuntimeError == NULL) {
+ RPyExc_RuntimeError = PyErr_NewException("rinterface.RRuntimeError",
+ NULL, NULL);
+ if (RPyExc_RuntimeError == NULL)
return;
}
- Py_INCREF(ErrorObject);
- PyModule_AddObject(m, "RobjectNotFound", ErrorObject);
+
+ Py_INCREF(RPyExc_RuntimeError);
+ PyModule_AddObject(m, "RRuntimeError", RPyExc_RuntimeError);
embeddedR_isInitialized = Py_False;
Py_INCREF(Py_False);
@@ -1947,10 +1956,7 @@
globalEnv = (PySexpObject *)Sexp_new(&EnvironmentSexp_Type,
Py_None, Py_None);
RPY_SEXP(globalEnv) = R_EmptyEnv;
- //SexpObject *sObj = globalEnv->sObj;
- //SEXP sexp = sObj->sexp;
- //sexp = R_EmptyEnv;
- //(globalEnv->sObj)->sexp = R_EmptyEnv;
+
if (PyDict_SetItemString(d, "globalEnv", (PyObject *)globalEnv) < 0)
return;
//FIXME: DECREF ?
@@ -1959,7 +1965,8 @@
baseNameSpaceEnv = (PySexpObject*)Sexp_new(&EnvironmentSexp_Type,
Py_None, Py_None);
RPY_SEXP(baseNameSpaceEnv) = R_EmptyEnv;
- if (PyDict_SetItemString(d, "baseNameSpaceEnv", (PyObject
*)baseNameSpaceEnv) < 0)
+ if (PyDict_SetItemString(d, "baseNameSpaceEnv",
+ (PyObject *)baseNameSpaceEnv) < 0)
return;
/* //FIXME: DECREF ? */
/* Py_DECREF(baseNameSpaceEnv); */
Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py
2008-05-30 09:18:53 UTC (rev 538)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py
2008-05-30 09:23:36 UTC (rev 539)
@@ -26,7 +26,7 @@
def testRError(self):
sum = rinterface.baseNameSpaceEnv["sum"]
letters = rinterface.baseNameSpaceEnv["letters"]
- self.assertRaises(RuntimeError, sum, letters)
+ self.assertRaises(rinterface.RRuntimeError, sum, letters)
def testClosureEnv(self):
parse = rinterface.baseNameSpaceEnv["parse"]
@@ -34,7 +34,7 @@
rinterface.STRSXP))
fun = rinterface.baseNameSpaceEnv["eval"](exp)
vec = rinterface.baseNameSpaceEnv["letters"]
- self.assertRaises(RuntimeError, fun, vec)
+ self.assertRaises(rinterface.RRuntimeError, fun, vec)
fun.closureEnv()["y"] = rinterface.SexpVector([1, ],
rinterface.INTSXP)
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list