[education/rkward] /: Decommission "plain generic request"

Thomas Friedrichsmeier null at kde.org
Sat May 18 13:33:40 BST 2024


Git commit 65b9b6b34c0f48dcd784b0d8448130cbedea8d75 by Thomas Friedrichsmeier.
Committed on 18/05/2024 at 12:21.
Pushed by tfry into branch 'master'.

Decommission "plain generic request"

M  +10   -0    rkward/autotests/core_test.cpp
M  +21   -49   rkward/rbackend/rkrbackend.cpp
M  +0    -2    rkward/rbackend/rkrbackend.h
M  +1    -1    rkward/rbackend/rkrinterface.cpp
M  +3    -3    rkward/rbackend/rpackages/rkward/R/base_overrides.R
M  +22   -11   rkward/rbackend/rpackages/rkward/R/internal.R
M  +1    -1    rkward/rbackend/rpackages/rkward/R/internal_graphics.R
M  +8    -6    rkward/rbackend/rpackages/rkward/R/rk.KDE_GUI-functions.R
M  +1    -1    rkward/rbackend/rpackages/rkward/R/rk.edit-functions.R
M  +7    -3    rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R
M  +4    -3    rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R
M  +1    -1    rkward/rbackend/rpackages/rkward/R/rk.print-functions.R
M  +13   -6    rkward/rbackend/rpackages/rkward/R/rk.sessionInfo.R
M  +4    -3    rkward/rbackend/rpackages/rkward/R/rk.utility-functions.R
M  +4    -4    rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R
M  +1    -1    rkward/rbackend/rpackages/rkwardtests/R/rkwardtests-internal.R
M  +1    -1    tests/rkward_application_tests.R

https://invent.kde.org/education/rkward/-/commit/65b9b6b34c0f48dcd784b0d8448130cbedea8d75

diff --git a/rkward/autotests/core_test.cpp b/rkward/autotests/core_test.cpp
index 2e6904eb0..c72be779e 100644
--- a/rkward/autotests/core_test.cpp
+++ b/rkward/autotests/core_test.cpp
@@ -260,6 +260,16 @@ private Q_SLOTS:
 			lock = false;
 		});
 		while(lock) qApp->processEvents();
+
+		// Saw a frontend crash on this idiom, once:
+		RInterface::issueCommand("x <- list(NULL, 1)", RCommand::User);
+		RInterface::whenAllFinished(this, [](RCommand*) {
+			QCOMPARE(RObjectList::getGlobalEnv()->findObject("x")->getLength(), 2);
+		});
+		RInterface::issueCommand("x[[1]] <- NULL", RCommand::User);
+		RInterface::whenAllFinished(this, [](RCommand*) {
+			QCOMPARE(RObjectList::getGlobalEnv()->findObject("x")->getLength(), 1);
+		});
 	}
 
 	void parseErrorTest() {
diff --git a/rkward/rbackend/rkrbackend.cpp b/rkward/rbackend/rkrbackend.cpp
index 61648895c..b11edfb6c 100644
--- a/rkward/rbackend/rkrbackend.cpp
+++ b/rkward/rbackend/rkrbackend.cpp
@@ -875,7 +875,8 @@ void doError (const QString &callstring) {
 	}
 }
 
-SEXP doSubstackCall (SEXP _call, SEXP _args) {
+// TODO: Pass nested/sync as a single enum value, in the first place
+SEXP doSubstackCall (SEXP _call, SEXP _args, SEXP _sync, SEXP _nested) {
 	RK_TRACE (RBACKEND);
 
 	RFn::R_CheckUserInterrupt ();
@@ -888,26 +889,20 @@ SEXP doSubstackCall (SEXP _call, SEXP _args) {
 		}
 		return ROb(R_NilValue);
 	} */
+	bool sync = RKRSupport::SEXPToInt(_sync);
+	bool nested = RKRSupport::SEXPToInt(_nested);
+	RKRBackend::RequestFlags flags = sync ? (nested ? RKRBackend::SynchronousWithSubcommands : RKRBackend::Synchronous) : RKRBackend::Asynchronous;
 
 	// For now, for simplicity, assume args are always strings, although possibly nested in lists
-	auto ret = RKRBackend::this_pointer->doRCallRequest(call, RKRSupport::SEXPToNestedStrings(_args), RKRBackend::SynchronousWithSubcommands);
+	auto ret = RKRBackend::this_pointer->doRCallRequest(call, RKRSupport::SEXPToNestedStrings(_args), flags);
 	if (!ret.warning.isEmpty()) RFn::Rf_warning("%s", RKTextCodec::toNative(ret.warning).constData());  // print warnings, first, as errors will cause a stop
 	if (!ret.error.isEmpty()) RFn::Rf_error("%s", RKTextCodec::toNative(ret.error).constData());
 
 	return RKRSupport::QVariantToSEXP(ret.ret);
 }
 
-// TODO: remove this entry point in favor of doSubstackCall
-SEXP doPlainGenericRequest (SEXP call, SEXP synchronous) {
-	RK_TRACE (RBACKEND);
-
-	RFn::R_CheckUserInterrupt ();
-
-	auto ret = RKRBackend::this_pointer->handlePlainGenericRequest(RKRSupport::SEXPToStringList(call), RKRSupport::SEXPToInt(synchronous));
-	if (!ret.warning.isEmpty()) RFn::Rf_warning("%s", RKTextCodec::toNative(ret.warning).constData());  // print warnings, first, as errors will cause a stop
-	if (!ret.error.isEmpty()) RFn::Rf_error("%s", RKTextCodec::toNative(ret.error).constData());
-
-	return RKRSupport::QVariantToSEXP(ret.ret);
+QString getLibLoc() {
+	return RKRBackendProtocolBackend::dataDir() + "/.rkward_packages/" + QString::number(RKRBackend::this_pointer->r_version / 10);
 }
 
 // Function to handle several simple calls from R code, that do not need any special arguments, or interaction with the frontend process.
@@ -939,6 +934,18 @@ SEXP doSimpleBackendCall (SEXP _call) {
 		return ROb(R_NilValue);
 	} else if (call == QStringLiteral ("tempdir")) {
 		return (RKRSupport::StringListToSEXP (QStringList (RKRBackendProtocolBackend::dataDir ())));
+	} else if (call == "home") {
+		if (list.value(1) == "home") return RKRSupport::StringListToSEXP(QStringList(RKRBackendProtocolBackend::dataDir()));
+		else if (list.value(1) == "lib") return RKRSupport::StringListToSEXP(QStringList(getLibLoc()));
+		else RK_ASSERT(false); // should have been handled in frontend
+	} else if (call == "backendSessionInfo") {
+		// Non-translatable on purpose. This is meant for posting to the bug tracker, mostly.
+		QStringList lines("Debug message file (this may contain relevant diagnostic output in case of trouble):");
+		lines.append(RKRBackendProtocolBackend::backendDebugFile());
+		lines.append(QString());
+		// NOTE: R_SVN_REVISON used to be a string, but has changed to numeric constant in R 3.0.0. QString::arg() handles both.
+		lines.append(QString("R version (compile time): %1").arg(QString(R_MAJOR "." R_MINOR " " R_STATUS " (" R_YEAR "-" R_MONTH "-" R_DAY " r%1)").arg(R_SVN_REVISION)));
+		return RKRSupport::StringListToSEXP(lines);
 	}
 
 	RK_ASSERT (false);  // Unhandled call.
@@ -1085,8 +1092,7 @@ bool RKRBackend::startR () {
 		// NOTE: Intermediate cast to void* to avoid compiler warning
 		{ "rk.check.env", (DL_FUNC) (void*) &checkEnv, 1 },
 		{ "rk.simple", (DL_FUNC) (void*) &doSimpleBackendCall, 1},
-		{ "rk.do.command", (DL_FUNC) (void*) &doSubstackCall, 2 },
-		{ "rk.do.generic.request", (DL_FUNC) (void*) &doPlainGenericRequest, 2 },
+		{ "rk.call", (DL_FUNC) (void*) &doSubstackCall, 4 },
 		{ "rk.get.structure", (DL_FUNC) (void*) &doGetStructure, 4 },
 		{ "rk.get.structure.global", (DL_FUNC) (void*) &doGetGlobalEnvStructure, 3 },
 		{ "rk.copy.no.eval", (DL_FUNC) (void*) &doCopyNoEval, 4 },
@@ -1583,40 +1589,6 @@ GenericRRequestResult RKRBackend::doRCallRequest(const QString &call, const QVar
 	return request.getResult();
 }
 
-QString getLibLoc() {
-	return RKRBackendProtocolBackend::dataDir () + "/.rkward_packages/" + QString::number (RKRBackend::this_pointer->r_version / 10);
-}
-
-GenericRRequestResult RKRBackend::handlePlainGenericRequest (const QStringList &parameters, bool synchronous) {
-	RK_TRACE (RBACKEND);
-
-	const QString call = parameters.value(0);
-	const QStringList args = parameters.mid(1);
-	if ((call == "set.output.file") && (args.value(1) == "SILENT")) {
-		return GenericRRequestResult();  // For automated testing and previews. The frontend should not be notified, here
-	} else if (call == "home") {
-		if (args.value(0) == "home") return GenericRRequestResult(RKRBackendProtocolBackend::dataDir());
-		else if (args.value(0) == "lib") return GenericRRequestResult(getLibLoc());
-	}
-
-	auto res = doRCallRequest(call, QVariant(args), synchronous ? Synchronous : Asynchronous);
-
-	if (call == "getSessionInfo") {
-		// Non-translatable on purpose. This is meant for posting to the bug tracker, mostly.
-		QStringList lines("-- Frontend --");
-		lines.append(res.ret.toStringList());
-		lines.append(QString());
-		lines.append("-- Backend --");
-		lines.append("Debug message file (this may contain relevant diagnostic output in case of trouble):");
-		lines.append(RKRBackendProtocolBackend::backendDebugFile());
-		lines.append(QString());
-		// NOTE: R_SVN_REVISON used to be a string, but has changed to numeric constant in R 3.0.0. QString::arg() handles both.
-		lines.append(QString("R version (compile time): %1").arg(QString(R_MAJOR "." R_MINOR " " R_STATUS " (" R_YEAR "-" R_MONTH "-" R_DAY " r%1)").arg(R_SVN_REVISION)));
-		res.ret = QVariant(lines);
-	}
-	return res;
-}
-
 void RKRBackend::initialize (const QString &locale_dir) {
 	RK_TRACE (RBACKEND);
 
diff --git a/rkward/rbackend/rkrbackend.h b/rkward/rbackend/rkrbackend.h
index a34cecad6..b79231576 100644
--- a/rkward/rbackend/rkrbackend.h
+++ b/rkward/rbackend/rkrbackend.h
@@ -102,8 +102,6 @@ public:
 
 /** Sends a request to the frontend and returns the result (empty in case of asynchronous requests). */
 	GenericRRequestResult doRCallRequest(const QString &call, const QVariant &args, RequestFlags flags);
-/** TODO: merge with the above. For calls that are known not to require a subcommand */
-	GenericRRequestResult handlePlainGenericRequest(const QStringList &parameters, bool synchronous);
 	RCommandProxy* fetchNextCommand ();
 
 /** The command currently being executed. */
diff --git a/rkward/rbackend/rkrinterface.cpp b/rkward/rbackend/rkrinterface.cpp
index a04ed2643..6eabda935 100644
--- a/rkward/rbackend/rkrinterface.cpp
+++ b/rkward/rbackend/rkrinterface.cpp
@@ -748,7 +748,7 @@ GenericRRequestResult RInterface::processRCallRequest (const QString &call, cons
 		}
 	} else if (call == "set.window.placement.hint") {
 		RKWorkplace::mainWorkplace ()->setWindowPlacementOverrides(arglist.value(0), arglist.value(1), arglist.value(2));
-	} else if (call == "getSessionInfo") {
+	} else if (call == "frontendSessionInfo") {
 		return GenericRRequestResult(RKSessionVars::frontendSessionInfo());
 	} else if (call == "recordCommands") {
 		RK_ASSERT(arglist.count() == 2);
diff --git a/rkward/rbackend/rpackages/rkward/R/base_overrides.R b/rkward/rbackend/rpackages/rkward/R/base_overrides.R
index 894c96655..f3b7a8709 100644
--- a/rkward/rbackend/rpackages/rkward/R/base_overrides.R
+++ b/rkward/rbackend/rpackages/rkward/R/base_overrides.R
@@ -68,7 +68,7 @@
 "q" <- function (save = "default", status = 0, runLast = TRUE, ...) {
 	# test if this is running in RKWard, otherwise pass through to the actual q()
 	if (isTRUE(.rk.inside.rkward.session())){
-		.rk.do.plain.call ("quit")
+		.rk.call("quit")
 	} else {
 		base::q(save = save, status = status, runLast = runLast)
 	}
@@ -88,7 +88,7 @@
 #' @rdname base_overrides
 "Sys.setlocale" <- function (category = "LC_ALL", locale = "", ...) {
 	if (category == "LC_ALL" || category == "LC_CTYPE" || category == "LANG") {
-		 .rk.do.plain.call ("preLocaleChange", NULL)
+		 .rk.call("preLocaleChange")
 
 		ret <- base::Sys.setlocale (category, locale, ...)
 
@@ -105,7 +105,7 @@
 #' @rdname base_overrides
 "setwd" <- function () {
 	ret <- eval (body (base::setwd))
-	.rk.do.plain.call ("wdChange", base::getwd (), synchronous=FALSE)
+	.rk.call.async("wdChange", base::getwd())
 	invisible (ret)
 }
 formals (setwd) <- formals (base::setwd)
diff --git a/rkward/rbackend/rpackages/rkward/R/internal.R b/rkward/rbackend/rpackages/rkward/R/internal.R
index ba524c1a8..6b8e38db4 100755
--- a/rkward/rbackend/rpackages/rkward/R/internal.R
+++ b/rkward/rbackend/rpackages/rkward/R/internal.R
@@ -125,18 +125,29 @@
 	}
 }
 
-".rk.do.call" <- function (x, args=NULL) {
-	x <- .Call ("rk.do.command", x, args, PACKAGE="(embedding)");
+# TODO: replace me
+".rk.do.call" <- function (command, args=NULL) {
+	x <- .Call("rk.call", command, args, TRUE, TRUE, PACKAGE="(embedding)");
 	if (is.null(x)) invisible(NULL)
 	else x
 }
 
-".rk.do.plain.call" <- function (x, args=NULL, synchronous=TRUE) {
-	.Call ("rk.do.generic.request", c (x, args), isTRUE (synchronous), PACKAGE="(embedding)")
+# Synchronous call to the frontend *without* allowing subcommands
+".rk.call" <- function(command, args=NULL) {
+	x <- .Call("rk.call", command, args, TRUE, FALSE, PACKAGE="(embedding)")
+	if (is.null(x)) invisible(NULL)
+	else x
+}
+
+# Asynchronous call to the frontend
+".rk.call.async" <- function(command, args=NULL) {
+	.Call("rk.call", command, args, FALSE, FALSE, PACKAGE="(embedding)")
+	invisible(NULL)
 }
 
-".rk.do.simple.call" <- function (x, args=NULL) {
-	.Call ("rk.simple", c (x, args), PACKAGE="(embedding)")
+# TODO: replace me
+".rk.do.simple.call" <- function(command, args=NULL) {
+	.Call("rk.simple", c(command, args), PACKAGE="(embedding)")
 }
 
 #' @export
@@ -174,7 +185,7 @@
 	new <- match (new, available$Package)	# same for new packages
 
 	# as a side effect, we update the list of known installed packages in the frontend
-	.rk.do.plain.call ("updateInstalledPackagesList", sort (unique (as.character (inst$Package))), synchronous=FALSE)
+	.rk.call.async("updateInstalledPackagesList", sort(unique(as.character(inst$Package))))
 
 	list ("available" = list (available$Package, available$Title, available$Version, available$Repository, grepl ("rkward", available$Enhances)),
 		"installed" = list (inst$Package, inst$Title, inst$Version, inst$LibPath, grepl ("rkward", inst$Enhances)),
@@ -192,7 +203,7 @@
 	enhance.rk <- ifelse(is.na(x$Enhances), FALSE, grepl("rkward", x$Enhances))
 
 	# as a side effect, we update the list of known installed packages in the frontend
-	.rk.do.plain.call ("updateInstalledPackagesList", sort (unique (as.character (x$Package))), synchronous=FALSE)
+	.rk.call.async("updateInstalledPackagesList", sort(unique(as.character(x$Package))))
 	# check for pluginmaps only in packages which enhance RKWard
 	rk.load.pluginmaps (.rk.find.package.pluginmaps(x$Package[enhance.rk]), force.add=FALSE, force.reload=FALSE)
 
@@ -317,18 +328,18 @@ assign(".rk.shadow.envs", new.env(parent=emptyenv()), envir=.rk.variables)
 	## History manipulation function (overloads for functions by the same name in package utils)
 	rk.replace.function ("loadhistory",  as.environment ("package:utils"),
 		function (file = ".Rhistory") {
-			invisible (.rk.do.plain.call ("commandHistory", c ("set", readLines (file))))
+			invisible(.rk.call("commandHistory", c("set", readLines(file))))
 		}, copy.formals = FALSE)
 
 	rk.replace.function ("savehistory",  as.environment ("package:utils"),
 		function (file = ".Rhistory") {
-			invisible (writeLines (.rk.do.plain.call ("commandHistory", "get"), file))
+			invisible(writeLines(.rk.call("commandHistory", "get"), file))
 		}, copy.formals = FALSE)
 
 	rk.replace.function ("timestamp",  as.environment ("package:utils"),
 		function (stamp = date(), prefix = "##------ ", suffix = " ------##", quiet = FALSE) {
 			stamp <- paste(prefix, stamp, suffix, sep = "")
-			.rk.do.plain.call ("commandHistory", c ("append", stamp))
+			.rk.call("commandHistory", c("append", stamp))
 			if (!quiet) cat(stamp, sep = "\n")
 			invisible(stamp)
 		}, copy.formals = FALSE)
diff --git a/rkward/rbackend/rpackages/rkward/R/internal_graphics.R b/rkward/rbackend/rpackages/rkward/R/internal_graphics.R
index 552dee918..2e9324de4 100644
--- a/rkward/rbackend/rpackages/rkward/R/internal_graphics.R
+++ b/rkward/rbackend/rpackages/rkward/R/internal_graphics.R
@@ -106,7 +106,7 @@ assign(".rk.preview.devices", list (), envir=.rk.variables)
 
 			printfile <- .rk.variables$.rk.printer.devices[[as.character (which)]]
 			if (!is.null (printfile)) {
-				rkward:::.rk.do.plain.call ("printPreview", printfile, FALSE)
+				rkward:::.rk.call.async("printPreview", printfile)
 				rkward:::.rk.variables$.rk.printer.devices[[as.character (which)]] <- NULL
 			}
 
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.KDE_GUI-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.KDE_GUI-functions.R
index b9ea9a7cf..915e8635c 100755
--- a/rkward/rbackend/rpackages/rkward/R/rk.KDE_GUI-functions.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.KDE_GUI-functions.R
@@ -213,7 +213,8 @@
     }
   }
 
-  .rk.do.plain.call ("select.list", params)
+  # NOTE: Passing all params as flat plain character vector for purely historical reasons. This could be changed.
+  .rk.call("select.list", as.character(params))
 }
 
 # file dialog
@@ -227,14 +228,15 @@
 #' @rdname rk.show.messages
 "rk.select.file" <- function(caption, initial, filter = '*', mode=c("file", "files", "dir", "newfile")) {
     mode <- match.arg(mode)
-	.rk.do.plain.call (
+    # NOTE: Passing all params as flat plain character vector for purely historical reasons. This could be changed.
+    .rk.call(
         "choosefile",
-        list(
-            if (missing (caption)) "" else caption,
-            if (missing (initial)) "" else initial,
+        as.character(c(
+            if (missing(caption)) "" else caption,
+            if (missing(initial)) "" else initial,
             filter,
             mode[1]
-        )
+        ))
     )
 }
 
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.edit-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.edit-functions.R
index cff0e1b5e..2c19eb040 100644
--- a/rkward/rbackend/rpackages/rkward/R/rk.edit-functions.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.edit-functions.R
@@ -94,5 +94,5 @@
 #' @export
 #' @rdname rk.edit
 "rk.show.html" <- function (url) {
-	invisible (.rk.do.plain.call ("showHTML", as.character (url), synchronous=FALSE));
+	.rk.call.async("showHTML", as.character(url));
 }
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R
index 9a1804fd8..87a12c40f 100644
--- a/rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R
@@ -98,7 +98,7 @@
 #' @export
 #' @rdname rk.get.tempfile.name
 "rk.get.workspace.url" <- function () {
-	res <- .rk.do.plain.call ("getWorkspaceUrl")
+	res <- .rk.call("getWorkspaceUrl")
 	if (length (res)) res
 	else NULL
 }
@@ -106,7 +106,11 @@
 #' @export
 #' @rdname rk.get.tempfile.name
 "rk.home" <- function (component="home") {
-	normalizePath (.rk.do.plain.call ("home", component))
+	if(component %in% c("home", "lib")) {
+		normalizePath(.rk.do.simple.call ("home", component))
+	} else {
+		stop("Unknown component type");
+	}
 }
 
 #' @export
@@ -221,7 +225,7 @@
 	}
 
 	# needs to come after initialization, so initialization alone does not trigger an update during startup
-	.rk.do.plain.call ("set.output.file", c (x, if (isTRUE (silent)) "SILENT" else NULL), synchronous=FALSE)
+	if (!isTRUE(silent)) .rk.call.async("set.output.file", x)
 	invisible (oldfile)
 }
 
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R
index 420bbd7d1..072f0caa6 100644
--- a/rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R
@@ -118,7 +118,7 @@
 		}
 	}
 	if (missing (pluginmap.files)) pluginmap.files <- character(0)
-	.rk.do.plain.call ("loadPluginMaps", c (ifelse (isTRUE (force.add), "force", "noforce"), ifelse (isTRUE (force.reload), "reload", "noreload"), as.character (pluginmap.files)), synchronous=FALSE)
+	.rk.call.async("loadPluginMaps", c(ifelse(isTRUE(force.add), "force", "noforce"), ifelse(isTRUE(force.reload), "reload", "noreload"), as.character(pluginmap.files)))
 }
 
 #' List of modify loaded plugins
@@ -165,7 +165,7 @@
 #' rk.set.plugin.status ("rkward::t_test", visible=FALSE)
 #' }
 "rk.list.plugins" <- function () {
-	plugs <- .rk.do.plain.call("listPlugins")
+	plugs <- .rk.call("listPlugins")
 	columns = c ("ID", "Context", "Menupath", "Label")
 	as.data.frame (matrix (plugs, ncol=length (columns), byrow=TRUE, dimnames=list (1:(length (plugs)/length (columns)), columns)), stringsAsFactors=FALSE)
 }
@@ -176,7 +176,8 @@
 	id <- as.character (id)
 	context <- rep (as.character (context), length.out=length (id))
 	visible <- rep (as.character (as.numeric (visible)), length.out=length (id))
-	.rk.do.plain.call ("setPluginStatus", c (id, context, visible))
+	# NOTE: Passing params as flat character vector for purely historical reasons. This could be changed.
+	.rk.call("setPluginStatus", c(id, context, visible))
 	invisible (NULL)
 }
 
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.print-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.print-functions.R
index 151abe6cf..362877c3a 100644
--- a/rkward/rbackend/rpackages/rkward/R/rk.print-functions.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.print-functions.R
@@ -121,7 +121,7 @@
 #' @export
 #' @rdname rk.results
 "rk.print.code" <- function(code) {
-	.rk.cat.output (.rk.do.plain.call ("highlightRCode", as.character (code)))
+	.rk.cat.output(.rk.call("highlightRCode", as.character(code)))
 }
 
 #' @export
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.sessionInfo.R b/rkward/rbackend/rpackages/rkward/R/rk.sessionInfo.R
index 8a03f0871..e4c54d4fc 100644
--- a/rkward/rbackend/rpackages/rkward/R/rk.sessionInfo.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.sessionInfo.R
@@ -7,10 +7,13 @@
 #' Gathers and prints information on the setup of the current RKWard session.
 #' In general, you should always include this information when reporting a bug
 #' in RKWard.
-#' 
+#'
 #' Typically, when reporting a bug, you should use \code{Help->Report Bug...}
 #' from the menu. Internally, this will call \code{rk.sessionInfo()}.
-#' 
+#'
+#' The returned information is untranslated, deliberately, as it is meant for
+#' pasting into the bug tracker.
+#'
 #' @return Returns the object created by \code{sessionInfo()}, invisibly. Note
 #'   that this includes only the information on the R portion of the session.
 #' @author Thomas Friedrichsmeier \email{rkward-devel@@kde.org}
@@ -23,8 +26,12 @@
 #' \dontrun{
 #' rk.sessionInfo()
 #' }
-"rk.sessionInfo" <- function () {
-	cat (.rk.do.plain.call ("getSessionInfo"), sep="\n")
-	cat ("R runtime session info:\n")
-	print (sessionInfo())
+"rk.sessionInfo" <- function() {
+	# Non-translatable on purpose. This is meant for posting to the bug tracker, mostly.
+	cat("-- Frontend --\n");
+	cat(.rk.call("frontendSessionInfo"), sep="\n")
+	cat("\n-- Backend --\n");
+	cat(.rk.do.simple.call("backendSessionInfo"), sep="\n")
+	cat("\nR runtime session info:\n")
+	print(sessionInfo())
 }
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.utility-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.utility-functions.R
index eb6078561..47e302040 100644
--- a/rkward/rbackend/rpackages/rkward/R/rk.utility-functions.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.utility-functions.R
@@ -163,7 +163,8 @@
 "rk.record.commands" <- function (filename, include.all = FALSE) {
 	if (is.null (filename)) filename = ""
 
-	res <- .rk.do.plain.call ("recordCommands", c(as.character (filename), if (include.all) "include.all" else "normal"))
+	# NOTE: Passing params as flat character vector for purely historical reasons. This could be changed.
+	res <- .rk.call("recordCommands", c(as.character(filename), if (include.all) "include.all" else "normal"))
 
 	if (!length (res)) invisible (TRUE)
 	else {
@@ -187,8 +188,8 @@
 #'
 #' @export
 #' @rdname rk.switch.frontend.language
-"rk.switch.frontend.language" <- function (LANG="C") {
-   .rk.do.plain.call ("switchLanguage", as.character (LANG))
+"rk.switch.frontend.language" <- function(LANG="C") {
+   .rk.call("switchLanguage", as.character(LANG))
 }
 
 #' Add one or more paths to the filesystem search path used in this session
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R
index 50b9e6860..3c745dffa 100644
--- a/rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R
@@ -58,7 +58,7 @@
 			description <- substitute()
 		}
 	}
-	if (missing (description)) lines <- .rk.do.plain.call ("workplace.layout", "get")
+	if (missing (description)) lines <- .rk.call("workplace.layout", "get")
 	else lines <- description
 	writeLines (lines, file)
 }
@@ -90,7 +90,7 @@
 	close <- "close"
 	if (!isTRUE (close.windows)) close <- "noclose"
 	if (!exists ("lines", inherits=FALSE)) lines <- readLines (file)
-	.rk.do.plain.call ("workplace.layout", c ("set", close, lines), synchronous=FALSE)
+	.rk.call.async("workplace.layout", c("set", close, lines))
 	invisible (NULL)
 }
 
@@ -128,8 +128,8 @@
 #' }, "attached")
 #' }
 ".rk.with.window.hints" <- function (expr, placement="", name="", style="") {
-	.rk.do.plain.call ("set.window.placement.hint", as.character (c (placement, name, style)), FALSE)
-	on.exit (.rk.do.plain.call ("set.window.placement.hint", c ("", "", ""), FALSE))
+	.rk.call.async("set.window.placement.hint", as.character(c(placement, name, style)))
+	on.exit(.rk.call.async("set.window.placement.hint", c("", "", "")))
 	eval.parent (expr)
 	invisible (NULL)
 }
diff --git a/rkward/rbackend/rpackages/rkwardtests/R/rkwardtests-internal.R b/rkward/rbackend/rpackages/rkwardtests/R/rkwardtests-internal.R
index c50f98393..f94e15492 100644
--- a/rkward/rbackend/rpackages/rkwardtests/R/rkwardtests-internal.R
+++ b/rkward/rbackend/rpackages/rkwardtests/R/rkwardtests-internal.R
@@ -277,7 +277,7 @@ rktest.initializeEnvironment <- function () {
 	rktest.replace ("rk.set.output.html.file", function (x) {
 		stopifnot(is.character(x))
 		assign(".rk.output.html.file", x, .rk.variables)
-		rkward:::.rk.do.plain.call ("set.output.file", c (x, "SILENT"), synchronous=FALSE)
+		# NOT calling: rkward:::.rk.call.async("set.output.file", x)
 	})
 	assign("initialized", TRUE, envir=.rktest.tmp.storage)
 }
diff --git a/tests/rkward_application_tests.R b/tests/rkward_application_tests.R
index 01c895350..f06a8cbf5 100644
--- a/tests/rkward_application_tests.R
+++ b/tests/rkward_application_tests.R
@@ -298,7 +298,7 @@ suite <- new ("RKTestSuite", id="rkward_application_tests",
 			sync_outfile <- function() {
 				# Manually notify frontend of current output file.  This is usually suppressed for auto-texting, but important, here, since
 				# the frontend uses this to detect, which output is active.
-				rkward:::.rk.do.plain.call ("set.output.file", c (rk.get.output.html.file()), synchronous=FALSE)
+				rkward:::.rk.call.async("set.output.file", c(rk.get.output.html.file()))
 			}
 
 			x <- rk.output()            # get active output



More information about the rkward-tracker mailing list