Skip to content

Commit c4b6d94

Browse files
committed
Fix parsing of -Inf, +/-NaN
1 parent 1a4ba2b commit c4b6d94

File tree

3 files changed

+48
-7
lines changed

3 files changed

+48
-7
lines changed

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,15 +493,18 @@ public static int string2int(String s) {
493493
@TruffleBoundary
494494
public static double string2doubleNoCheck(String v, boolean exceptionOnFail) {
495495
// FIXME use R rules
496-
if ("Inf".equals(v)) {
496+
String trimmed = v.trim();
497+
if ("Inf".equals(trimmed) || "+Inf".equals(trimmed)) {
497498
return Double.POSITIVE_INFINITY;
498-
} else if ("NaN".equals(v)) {
499+
} else if ("-Inf".equals(trimmed)) {
500+
return Double.NEGATIVE_INFINITY;
501+
} else if ("NaN".equals(trimmed) || "+NaN".equals(trimmed) || "-NaN".equals(trimmed)) {
499502
return Double.NaN;
500-
} else if ("NA_real_".equals(v)) {
503+
} else if ("NA_real_".equals(trimmed)) {
501504
return DOUBLE_NA;
502505
}
503506
try {
504-
return Double.parseDouble(v);
507+
return Double.parseDouble(trimmed);
505508
} catch (NumberFormatException e) {
506509
if (hasHexPrefix(v)) {
507510
switch (v.charAt(0)) {

com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6798,6 +6798,36 @@ Time differences in hours
67986798
#if (!any(R.version$engine == "FastR")) { [1] TRUE } else { { x <- c(1, 3.5); .fastr.identity(x) == .fastr.identity(as.double(x)); } }
67996799
Error: unexpected '[' in "if (!any(R.version$engine == "FastR")) { ["
68006800

6801+
##com.oracle.truffle.r.test.builtins.TestBuiltin_asdouble.testAsDouble#
6802+
#as.double(' <<<NEWLINE>>> +Inf <<<NEWLINE>>> ')
6803+
[1] Inf
6804+
6805+
##com.oracle.truffle.r.test.builtins.TestBuiltin_asdouble.testAsDouble#
6806+
#as.double(' <<<NEWLINE>>> +NaN <<<NEWLINE>>> ')
6807+
[1] NaN
6808+
6809+
##com.oracle.truffle.r.test.builtins.TestBuiltin_asdouble.testAsDouble#
6810+
#as.double(' <<<NEWLINE>>> -Inf <<<NEWLINE>>> ')
6811+
[1] -Inf
6812+
6813+
##com.oracle.truffle.r.test.builtins.TestBuiltin_asdouble.testAsDouble#
6814+
#as.double(' <<<NEWLINE>>> -NaN <<<NEWLINE>>> ')
6815+
[1] NaN
6816+
6817+
##com.oracle.truffle.r.test.builtins.TestBuiltin_asdouble.testAsDouble#
6818+
#as.double(' <<<NEWLINE>>> Inf <<<NEWLINE>>> ')
6819+
[1] Inf
6820+
6821+
##com.oracle.truffle.r.test.builtins.TestBuiltin_asdouble.testAsDouble#
6822+
#as.double(' <<<NEWLINE>>> NaN <<<NEWLINE>>> ')
6823+
[1] NaN
6824+
6825+
##com.oracle.truffle.r.test.builtins.TestBuiltin_asdouble.testAsDouble#
6826+
#as.double('- Inf')
6827+
[1] NA
6828+
Warning message:
6829+
NAs introduced by coercion
6830+
68016831
##com.oracle.truffle.r.test.builtins.TestBuiltin_asdouble.testAsDouble#
68026832
#{ as.double("1.27") }
68036833
[1] 1.27
@@ -21250,7 +21280,7 @@ Error in f() :
2125021280
#{ f <- function() { delayedAssign("x", y); y <- 10; x } ; f() }
2125121281
[1] 10
2125221282

21253-
##com.oracle.truffle.r.test.builtins.TestBuiltin_delayedAssign.testDelayedAssign#
21283+
##com.oracle.truffle.r.test.builtins.TestBuiltin_delayedAssign.testDelayedAssign#Output.IgnoreErrorContext#
2125421284
#{ f <- function() { delayedAssign("x",y); delayedAssign("y",x); g(x, y)}; g <- function(x, y) { x + y }; f() }
2125521285
Error in g(x, y) :
2125621286
promise already under evaluation: recursive default argument reference or earlier problems?
@@ -21260,7 +21290,7 @@ Error in g(x, y) :
2126021290
Error in f() :
2126121291
promise already under evaluation: recursive default argument reference or earlier problems?
2126221292

21263-
##com.oracle.truffle.r.test.builtins.TestBuiltin_delayedAssign.testDelayedAssign#
21293+
##com.oracle.truffle.r.test.builtins.TestBuiltin_delayedAssign.testDelayedAssign#Output.IgnoreErrorContext#
2126421294
#{ f <- function() { delayedAssign("x",y); delayedAssign("y",x); paste(x, y)}; f() }
2126521295
Error in paste(x, y) :
2126621296
promise already under evaluation: recursive default argument reference or earlier problems?

com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asdouble.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1515
*
1616
* Copyright (c) 2012-2014, Purdue University
17-
* Copyright (c) 2013, 2018, Oracle and/or its affiliates
17+
* Copyright (c) 2013, 2019, Oracle and/or its affiliates
1818
*
1919
* All rights reserved.
2020
*/
@@ -201,6 +201,14 @@ public void testAsDouble() {
201201
assertEval("{ f <- function() as.double('aaa'); f() }");
202202
assertEval("{ f <- function() as.numeric('aaa'); f() }");
203203
assertEval("{ f1 <- function() {f<- function() as.double('aaa'); f()}; f1() }");
204+
205+
assertEval("as.double('\t\n Inf\t\n ')");
206+
assertEval("as.double('\t\n +Inf\t\n ')");
207+
assertEval("as.double('\t\n -Inf\t\n ')");
208+
assertEval("as.double('\t\n NaN\t\n ')");
209+
assertEval("as.double('\t\n +NaN\t\n ')");
210+
assertEval("as.double('\t\n -NaN\t\n ')");
211+
assertEval("as.double('- Inf')");
204212
}
205213

206214
@Test

0 commit comments

Comments
 (0)