diff options
author | Richard Beare <Richard.Beare@ieee.org> | 2015-06-17 20:14:40 +1000 |
---|---|---|
committer | Richard Beare <Richard.Beare@ieee.org> | 2015-08-10 09:37:04 +1000 |
commit | da1c6c60d38d0b6206200247056a2a36ac227b74 (patch) | |
tree | 4c04550317788bfbc7d083bbf1a743b39e607225 /Examples/test-suite/r/overload_method_runme.R | |
parent | 95a08b3950ea1f43846ccff11969c9179f2eeddd (diff) | |
download | swig-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.R | 4 |
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) |