summaryrefslogtreecommitdiff
path: root/Examples/test-suite/r/overload_method_runme.R
diff options
context:
space:
mode:
authorRichard Beare <Richard.Beare@ieee.org>2015-06-17 20:14:40 +1000
committerRichard Beare <Richard.Beare@ieee.org>2015-08-10 09:37:04 +1000
commitda1c6c60d38d0b6206200247056a2a36ac227b74 (patch)
tree4c04550317788bfbc7d083bbf1a743b39e607225 /Examples/test-suite/r/overload_method_runme.R
parent95a08b3950ea1f43846ccff11969c9179f2eeddd (diff)
downloadswig-da1c6c60d38d0b6206200247056a2a36ac227b74.tar.gz
This is a modification to support use of tricky enumerations in R. It
includes the addition of a _runme for an existing test - preproc_constants that was previously not run. That tests includes a preprocessor based setting of an enumeration which is ignored by the existing r enumeration infrastructure. The new version correctly reports the enumeration value as 4 - previous versions set it to 0. Traditional enumerations are unchanged. The approach used to deal with these enumerations is similar to that of other languages, and requires a call to a C function at runtime to return the enumeration value. The previous approach figured out the values statically and this is still used where possible. The need for a runtime call leads to changes in when swig code is used in packages - see below. One test that previously passed now fails - namely the R sourcing of preproc_constants.R, as the enumeration code requires the shared library, which isn't loaded by that script. There is also a modification to the way the R _runme.R files are used. The call to R CMD BATCH now includes a --args option that indicates the source folder for the unittest.R file, and the first couple of lines of the _runme.R files deal with correctly locating this. Out of source tests now run correctly. This work was motivated by problems generating the SimpleITK binding, specifically with some of the more complex enumerations. This approach does have some issues wrt to code in packages, but I can't see an alternative. The problem with packages is that the R code setting up the enumeration structures requires the shared library so that the C functions returning enumeration values can be called. The enumeration setup code thus needs to be moved to the package initialisation section. For SimpleITK I do this using an R script, which I think is an acceptable solution. The core part of the process is the following function. I dump all the enumeration stuff into a .onload function. This is only necessary if some of the enumerations are tricky. splitSwigFile <- function(filename, onloadfile, mainfile) { p1 <- parse(file=filename) getdefineEnum <- function(X) { return (is.call(X) & (X[[1]]=="defineEnumeration")) } dd <- sapply(p1, getdefineEnum) enums <- p1[dd] enums <- unlist(lapply(enums, deparse)) enums <- c(".onLoad <- function(libname, pkgname) {", enums, "}") everythingelse <- p1[!dd] everythingelse <- unlist(lapply(everythingelse, deparse)) writeLines(everythingelse, mainfile) writeLines(enums, onloadfile) }
Diffstat (limited to 'Examples/test-suite/r/overload_method_runme.R')
-rw-r--r--Examples/test-suite/r/overload_method_runme.R4
1 files changed, 3 insertions, 1 deletions
diff --git a/Examples/test-suite/r/overload_method_runme.R b/Examples/test-suite/r/overload_method_runme.R
index afb590a74..790f3df10 100644
--- a/Examples/test-suite/r/overload_method_runme.R
+++ b/Examples/test-suite/r/overload_method_runme.R
@@ -1,4 +1,6 @@
-source("unittest.R")
+clargs <- commandArgs(trailing=TRUE)
+source(file.path(clargs[1], "unittest.R"))
+
dyn.load(paste("overload_method", .Platform$dynlib.ext, sep=""))
source("overload_method.R")
cacheMetaData(1)