From 9007d7b455c28be0d23b0f49706b3c25e8c7650c Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Tue, 10 Oct 2017 12:04:55 +0200
Subject: [PATCH] fix whitespace differences in warning messages with
 options(warn=1), more thorough search for current frame in
 Utils.getActualCurrentFrame

---
 .../truffle/r/runtime/RErrorHandling.java     |   2 +-
 .../com/oracle/truffle/r/runtime/Utils.java   |  12 +-
 .../truffle/r/test/ExpectedTestOutput.test    | 110 ++++++++++++++++--
 .../r/test/builtins/TestBuiltin_warning.java  |   4 +-
 4 files changed, 118 insertions(+), 10 deletions(-)

diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java
index 5b78bfd0da..fd95e657f4 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java
@@ -767,7 +767,7 @@ public class RErrorHandling {
         // (is 74 a given percentage of console width?)
         if (preamble.length() + 1 + message.length() >= 74) {
             // +1 is for the extra space following the colon
-            return preamble + " \n  " + message;
+            return preamble + "\n  " + message;
         } else {
             return preamble + " " + message;
         }
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 5dc6ed5264..7f88737630 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
@@ -475,7 +475,17 @@ public final class Utils {
             // Truffle/R system has started
             return null;
         }
-        return RArguments.unwrap(frameInstance.getFrame(FrameAccess.MATERIALIZE));
+        Frame frame = RArguments.unwrap(frameInstance.getFrame(FrameAccess.MATERIALIZE));
+        if (!RArguments.isRFrame(frame)) {
+            return Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<Frame>() {
+                @Override
+                public Frame visitFrame(FrameInstance instance) {
+                    Frame current = RArguments.unwrap(instance.getFrame(FrameAccess.MATERIALIZE));
+                    return RArguments.isRFrame(current) ? current : null;
+                }
+            });
+        }
+        return frame;
     }
 
     private static final class TracebackVisitor implements FrameInstanceVisitor<Frame> {
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 fa331b0089..30c1a0d1c3 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
@@ -642,11 +642,11 @@ Error: no slot of name "foo" for this object of class "classRepresentation"
 #{ getClass("ClassUnionRepresentation")@virtual }
 [1] FALSE
 
-##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.ImplementationError#
+##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.SideEffects#
 #{ setClass("foo", contains="numeric"); x<-new("foo"); res<-slot(x, ".Data"); removeClass("foo"); res }
 numeric(0)
 
-##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.ImplementationError#
+##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.SideEffects#
 #{ setClass("foo", contains="numeric"); x<-new("foo"); res<-x@.Data; removeClass("foo"); res }
 numeric(0)
 
@@ -1269,7 +1269,7 @@ $vectors
 NULL
 
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa4#Ignored.Unimplemented#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa4#
 #argv <- list('S', structure(c(1, 0, 0, 0, 0, 1.4142135623731, 0, 0, 0, 0, 1.73205080756888, 0, 0, 0, 0, 2), .Dim = c(4L, 4L), Dimnames = list(character(0), character(0))), c(2, 1.73205080756888, 1.4142135623731, 1), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L)), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))
 $d
 [1] 2.000000 1.732051 1.414214 1.000000
@@ -1327,7 +1327,7 @@ $vt
 #argv <- list(structure(c(1, 1, 3, 3), .Dim = c(2L, 2L)), 'O'); .Internal(La_dgecon(argv[[1]], argv[[2]]))
 [1] 0
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa8#Ignored.Unimplemented#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa8#
 #argv <- list('N', structure(c(-4, 0, 0, 0, 0, 0, 0, -406.725, 41.7955066364795, 0, 0, 0, 0, 0, -1550.79375, 381.717151319926, 49.8228991342168, 0, 0, 0, 0, -1277.325, 224.617432123818, -31.1858918860748, -282.060212912726, 0, 0, 0, -1042.675, 125.261805546114, -29.9849484767744, 164.425554254677, -170.353263600129, 0, 0, -469.696, 26.3795103523805, 4.19691803785862, -3.18974110831568, 0.0462484557378925, 1.46320172717486, 0, -7818, 18.2758880432689, 1.77525956575195, -1.45298766739792, -0.449176219307484, -0.281900648530911, -0.669305080560524), .Dim = c(7L, 7L), .Dimnames = list(c('1947', '1948', '1949', '1950', '1951', '1952', '1953'), c('(Intercept)', 'GNP.deflator', 'GNP', 'Unemployed', 'Armed.Forces', 'Population', 'Year'))), c(8164.12940108939, 457.24498274114, 324.584423503013, 134.312174464868, 4.95553195929945, 1.41954832076337, 0.000342370904183799), structure(0, .Dim = c(1L, 1L)), structure(0, .Dim = c(1L, 1L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))
 $d
 [1] 8.164129e+03 4.572450e+02 3.245844e+02 1.343122e+02 4.955532e+00
@@ -7417,7 +7417,7 @@ In matrix(1:4, 3, 2) :
 [2,]    3    4
 [3,]    5    6
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#Ignored.ReferenceError#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#
 #{ matrix(1i,10,10) }
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,] 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i  0+1i
@@ -7503,7 +7503,7 @@ In matrix(c(1, 2, 3, 4), 3, 2) :
  [9,] 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i
 [10,] 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#Ignored.ReferenceError#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#
 #{ matrix(c(1i,NA),10,10) }
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,] 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i  0+1i
@@ -22762,7 +22762,7 @@ FALSE
 #argv <- list(c(0.00508571428571428, 0.876285714285715), structure(1L, class = c('terminal', 'connection')), 69); .Internal(dput(argv[[1]], argv[[2]], argv[[3]]))
 c(0.00508571428571428, 0.876285714285715)
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_dqr.testdqrcf#Ignored.OutputFormatting#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_dqr.testdqrcf#
 #.Fortran(.F_dqrcf, 1, 1L, 1L, 1, 1, 1L, 1, 1L)
 [[1]]
 [1] 1
@@ -24901,6 +24901,89 @@ NULL
 Warning message:
 In formals(argv[[1]]) : argument is not a function
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#.Internal(format(.GlobalEnv,FALSE,NA,0,0,3,TRUE,NA,'.'))
+[1] "<environment: R_GlobalEnv>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=-10)
+[1] "1.1e+00"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=FALSE)
+[1] "1.1"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=TRUE)
+[1] "1.1e+00"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=c(-10, 1))
+Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L,  :
+  invalid 'scientific' argument
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=c(TRUE, FALSE))
+Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L,  :
+  invalid 'scientific' argument
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.6000085, digits=7)
+[1] "1.600008"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.6001095, digits=7)
+[1] "1.60011"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.60085, digits=5)
+[1] "1.6009"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#Ignored.OutputFormatting#
+#format(1.6011095, digits=7)
+[1] "1.601109"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(4.125e-04, digits=3)
+[1] "0.000412"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(4.135e-04, digits=3)
+[1] "0.000414"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(7)
+[1] "7"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(7.42)
+[1] "7.42"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(9.999999995, digits=10)
+[1] "9.999999995"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(9.999999999995, digits=13); format(9.999999999995, digits=11)
+[1] "9.999999999995"
+[1] "10"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(c(7,42))
+[1] " 7" "42"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(c(7.42,42.7))
+[1] " 7.42" "42.70"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(c(7.42,42.7,NA))
+[1] " 7.42" "42.70" "   NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(c(9.99951, 13.1), digits=4)
+[1] "10.0" "13.1"
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testformat1#Output.IgnoreErrorMessage#
 #argv <- list(structure(c(0, 72.7, 56.4, 72.7, 0, 63.3, 56.4, 63.3, 0), .Dim = c(3L, 3L), .Dimnames = list(c('Girth', 'Height', 'Volume'), c('Girth', 'Height', 'Volume'))), FALSE, 7L, 0L, NULL, 3L, TRUE, NA, "."); .Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]], argv[[9]], , argv[[9]]))
 Error in .Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]],  :
@@ -69312,6 +69395,11 @@ In sum(argv[[1]]) : integer overflow - use sum(as.numeric(.))
 #sum( );
 [1] 0
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_summary.testSummary#
+#summary(c(1.601,1.616))
+   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
+  1.601   1.605   1.609   1.609   1.612   1.616
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_summary.testsummary1#Ignored.OutputFormatting#
 #argv <- structure(list(object = structure(c(4L, 4L, 4L, 4L, 4L,     3L, 4L, 4L, 4L, 4L, 3L, 4L, 3L, 4L, 4L, 4L, 4L, 2L, 4L, 3L,     4L, 4L, 4L, 2L), .Dim = c(6L, 4L), .Dimnames = structure(list(c('25-34',     '35-44', '45-54', '55-64', '65-74', '75+'), c('0-39g/day',     '40-79', '80-119', '120+')), .Names = c('', '')), class = 'table')),     .Names = 'object');do.call('summary', argv)
 Number of cases in table: 88
@@ -74127,6 +74215,14 @@ In f() : foo
 Warning message:
 In f() : foo
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_warning.testwarning#
+#options(warn=1); f <- function() warning('foo'); f()
+Warning in f() : foo
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_warning.testwarning#
+#options(warn=1); f <- function() warning('foo'); f2 <- function() f(); f2()
+Warning in f() : foo
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_warning.testwarning#
 #warning('foo')
 Warning message:
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java
index 32105348fa..bfdb68d4c6 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2014, Purdue University
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -22,6 +22,8 @@ public class TestBuiltin_warning extends TestBase {
     public void testwarning() {
         assertEval("warning('foo')");
         assertEval("f <- function() warning('foo'); f()");
+        assertEval("options(warn=1); f <- function() warning('foo'); f()");
         assertEval("f <- function() warning('foo'); f2 <- function() f(); f2()");
+        assertEval("options(warn=1); f <- function() warning('foo'); f2 <- function() f(); f2()");
     }
 }
-- 
GitLab