From 8c9a0264cdd3e2207739404aaa95efe7ad6962d0 Mon Sep 17 00:00:00 2001 From: Laurent Gautier Date: Sat, 7 Jan 2023 14:26:09 -0500 Subject: [PATCH] Fix segfault when calling rinternalize and R not initialized. (#972) This is fixing issue #971. --- NEWS | 4 ++++ rpy2/rinterface.py | 2 ++ rpy2/tests/rinterface/test_noinitialization.py | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/NEWS b/NEWS index 089eca7f6..61014e4c9 100644 --- a/NEWS +++ b/NEWS @@ -19,6 +19,10 @@ Bugs fixed - With the "R magic", converters in a local namespace were inadvertently skipped (the local namespace was not searched). +- Calling :func:`rpy2.rinterface.rternalize` before the embedded R is + initialized was ending with a segfault. It is now raising an + :class:`rpy2.rinterface_lib/embedded/RNotReady` (issue #971). + Changes ------- diff --git a/rpy2/rinterface.py b/rpy2/rinterface.py index 948e7b65e..752d02405 100644 --- a/rpy2/rinterface.py +++ b/rpy2/rinterface.py @@ -1201,6 +1201,8 @@ def foo(x, *, y, z): :return: A wrapped R object that can be use like any other rpy2 object. """ + if not embedded.isinitialized(): + raise embedded.RNotReadyError('The embedded R is not yet initialized.') if function is None: return functools.partial(rternalize, signature=signature) diff --git a/rpy2/tests/rinterface/test_noinitialization.py b/rpy2/tests/rinterface/test_noinitialization.py index 253079e9f..440b4081a 100644 --- a/rpy2/tests/rinterface/test_noinitialization.py +++ b/rpy2/tests/rinterface/test_noinitialization.py @@ -28,3 +28,9 @@ def test_assert_isready(): def test_assert_environment_geitem(): with pytest.raises(embedded.RNotReadyError): sexp.globalenv['x'] + +@pytest.mark.skipif(embedded.rpy2_embeddedR_isinitialized, + reason='Can only be tested before R is initialized.') +def test_assert_rternalize(): + with pytest.raises(embedded.RNotReadyError): + rinterface.rternalize(lambda x: x)