diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java index d1432ee475bb9ad690ebd2e7ee58f7c4464ef6d5..79152550b9fa1d292b20e134f0182470f1179629 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java @@ -1368,6 +1368,11 @@ public class GrepFunctions { } for (int i = 0; i < x.getLength(); i++) { String data = x.getDataAt(i); + assert data != null; + if (data.length() == 0) { + result[i] = RDataFactory.createEmptyStringVector(); + continue; + } String currentSplit = splits[i % splits.length]; if (currentSplit.isEmpty()) { result[i] = na.check(data) ? RDataFactory.createNAStringVector() : emptySplitIntl(data); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java index 6ee205844bd96447969fb7d8106d26b4ec65afb9..7f0f565864333a0f12351be442344a3a9cf3769f 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java @@ -79,6 +79,7 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.context.RContext; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.RExternalPtr; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RNull; @@ -698,6 +699,11 @@ public class CallAndExternalFunctions { return callRFFINode.execute(new NativeCallInfo(symbol, func, rns.getDllInfo()), args.getArguments()); } + @Specialization + protected Object callNamedFunctionWithPackage(RExternalPtr symbol, RArgsValuesAndNames args, @SuppressWarnings("unused") RMissing packageName) { + return callRFFINode.execute(new NativeCallInfo("", symbol.getAddr(), null), args.getArguments()); + } + @SuppressWarnings("unused") @Fallback protected Object dotCallFallback(Object symbol, Object args, Object packageName) { diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java index 5d3c31feba257afdbfd70dbc0da57b7c367a7f19..174c4c56c6c0fecea9aa0966809facb587ff91a7 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java @@ -324,7 +324,11 @@ public final class Utils { Path truePath = currentPath.resolve(p); if (keepRelative) { // relativize it (it was relative to start with) - return currentPath.relativize(truePath).toString(); + if (".".equals(path) || "..".equals(path)) { + return path; + } else { + return currentPath.relativize(truePath).toString(); + } } else { return truePath.toString(); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index 53b3c3e5b88cbec974e1986a42fff73b204d163d..4cfca94bd60c8d88820d84ae69e88bea57b778c6 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -43736,6 +43736,11 @@ character(0) #argv <- structure(list(path = '/tmp/RtmpagC9oa/Pkgs/exNSS4'), .Names = 'path');do.call('path.expand', argv) [1] "/tmp/RtmpagC9oa/Pkgs/exNSS4" +##com.oracle.truffle.r.test.builtins.TestBuiltin_pathexpand.testpathexpand6# +#path.expand('.'); wd <- getwd(); tryCatch({ setwd('/tmp'); path.expand('.') }, finally = { setwd(wd) }) +[1] "." +[1] "." + ##com.oracle.truffle.r.test.builtins.TestBuiltin_plus_Date.testplus_Date1# #argv <- structure(list(e1 = structure(1, units = 'days', class = 'difftime'), e2 = structure(14579, class = 'Date')), .Names = c('e1', 'e2'));do.call('+.Date', argv) [1] "2009-12-02" @@ -65895,6 +65900,15 @@ Error: unexpected '}' in "{ .Internal(strrep(, '') }" [1] "" "" +##com.oracle.truffle.r.test.builtins.TestBuiltin_strsplit.testStrSplit# +#strsplit(c('','a , b'), '[[:space:]]*,[[:space:]]*') +[[1]] +character(0) + +[[2]] +[1] "a" "b" + + ##com.oracle.truffle.r.test.builtins.TestBuiltin_strsplit.testStrSplit# #strsplit(c('1', ''), c('1', ''), fixed=FALSE) [[1]] diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_pathexpand.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_pathexpand.java index 0b873424d18b832deaa51e573156d5bd30148e69..13330f9079da2aabd25459dc2f52150348b75cec 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_pathexpand.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_pathexpand.java @@ -37,6 +37,11 @@ public class TestBuiltin_pathexpand extends TestBase { assertEval("argv <- structure(list(path = '/tmp/RtmpagC9oa/Pkgs/exNSS4'), .Names = 'path');do.call('path.expand', argv)"); } + @Test + public void testpathexpand6() { + assertEval("path.expand('.'); wd <- getwd(); tryCatch({ setwd('/tmp'); path.expand('.') }, finally = { setwd(wd) })"); + } + @Test public void testArgsValidation() { assertEval("path.expand(NULL)"); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java index f06f1669ca542addb832b1f4b26154654006cc2e..dd40c57132e6884495892cf0b5f644f696b001c1 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java @@ -142,6 +142,7 @@ public class TestBuiltin_strsplit extends TestBase { assertEval("strsplit(c('1', 'b'), c('1', 'b'), fixed=FALSE)"); assertEval("strsplit(c('a1a', 'a1b'), c('1', '1'), fixed=FALSE)"); assertEval("strsplit(c('a1a', 'a1b'), '1', fixed=FALSE)"); + assertEval("strsplit(c('','a , b'), '[[:space:]]*,[[:space:]]*')"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java index b0e6a808ccdeaac61afbcfd20e90945d6478c942..5d1d166160c6db4a8ccd366c71c83ee9493faeb3 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java @@ -360,8 +360,11 @@ public class TestJavaInterop extends TestBase { assertEvalFastR("tc <- .fastr.java.class('" + TestNamesClass.class.getName() + "'); names(tc$staticField)", "NULL"); assertEvalFastR("tc <- .fastr.java.class('" + TestNamesClass.class.getName() + "'); names(tc$staticMethod)", "NULL"); assertEvalFastR("tc <- .fastr.java.class('" + TestNamesClass.class.getName() + "'); t <- .fastr.interop.new(tc); sort(names(t))", "c('field', 'method', 'staticField', 'staticMethod')"); - assertEvalFastR("cl <- .fastr.java.class('java.util.Collections'); em<-cl$EMPTY_MAP; names(em)", "NULL"); - assertEvalFastR("tc <- .fastr.java.class('" + TestNamesClassMap.class.getName() + "'); to <- .fastr.interop.new(tc); sort(names(to$m()))", "c('one', 'two')"); + // Note: The following two tests fails on Solaris. It seems that the Java interop on + // Solaris treats the two inner classes SimpleImmutableEntry and SimpleEntry of + // java.util.AbstractMap as if they were members. + assertEvalFastR(Ignored.ImplementationError, "cl <- .fastr.java.class('java.util.Collections'); em<-cl$EMPTY_MAP; names(em)", "NULL"); + assertEvalFastR(Ignored.ImplementationError, "tc <- .fastr.java.class('" + TestNamesClassMap.class.getName() + "'); to <- .fastr.interop.new(tc); sort(names(to$m()))", "c('one', 'two')"); } @Test