[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 ¶meters, 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 ¶meters, 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