From 4066c40aa679fe31da0b1c77b367de4dee5f586b Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Mon, 13 Jun 2016 16:28:05 +0200
Subject: [PATCH] make usages of ROptions.getValue able to deal with scalar
 values

---
 .../truffle/r/engine/shell/RCommand.java      |  6 +-
 .../truffle/r/nodes/builtin/base/Cat.java     |  2 +-
 .../nodes/builtin/base/PrettyPrinterNode.java | 23 +-----
 .../builtin/base/printer/PrintParameters.java |  1 -
 .../builtin/helpers/BrowserInteractNode.java  |  5 +-
 .../oracle/truffle/r/runtime/RRuntime.java    | 71 ++++++++++---------
 6 files changed, 43 insertions(+), 65 deletions(-)

diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java
index 60a35920fe..3aa57b14a1 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java
@@ -53,8 +53,8 @@ import com.oracle.truffle.r.nodes.builtin.base.Quit;
 import com.oracle.truffle.r.runtime.BrowserQuitException;
 import com.oracle.truffle.r.runtime.RCmdOptions;
 import com.oracle.truffle.r.runtime.RInternalError;
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RInternalSourceDescriptions;
+import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.Utils;
 import com.oracle.truffle.r.runtime.Utils.DebugExitException;
 import com.oracle.truffle.r.runtime.context.ConsoleHandler;
@@ -65,7 +65,6 @@ import com.oracle.truffle.r.runtime.context.Engine.ParseException;
 import com.oracle.truffle.r.runtime.context.RContext;
 import com.oracle.truffle.r.runtime.context.RContext.ContextKind;
 import com.oracle.truffle.r.runtime.data.RLogicalVector;
-import com.oracle.truffle.r.runtime.data.RStringVector;
 
 import jline.console.ConsoleReader;
 import jline.console.UserInterruptException;
@@ -299,7 +298,6 @@ public class RCommand {
     }
 
     private static String getContinuePrompt() {
-        RStringVector continuePrompt = (RStringVector) RRuntime.asAbstractVector(RContext.getInstance().stateROptions.getValue("continue"));
-        return continuePrompt.getDataAt(0);
+        return RRuntime.asString(RRuntime.asAbstractVector(RContext.getInstance().stateROptions.getValue("continue")));
     }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Cat.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Cat.java
index b8d845a5a5..95f0ee80fd 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Cat.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Cat.java
@@ -102,7 +102,7 @@ public abstract class Cat extends RBuiltinNode {
         checkFillLength(fill);
         int fillWidth = -1;
         if (RRuntime.fromLogical(fill.getDataAt(0))) {
-            fillWidth = ((RIntVector) RContext.getInstance().stateROptions.getValue("width")).getDataAt(0);
+            fillWidth = RRuntime.asInteger(RContext.getInstance().stateROptions.getValue("width"));
         }
         return output(args, conn, sepVec, fillWidth, checkLabels(labels), append);
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrettyPrinterNode.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrettyPrinterNode.java
index 981eb21454..3e8e95790e 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrettyPrinterNode.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrettyPrinterNode.java
@@ -471,27 +471,8 @@ public abstract class PrettyPrinterNode extends RNode {
     }
 
     private static int getMaxPrintLength() {
-        int maxPrint = -1; // infinity
-        Object maxPrintObj = RContext.getInstance().stateROptions.getValue("max.print");
-        if (maxPrintObj != null) {
-
-            if (maxPrintObj instanceof Integer) {
-                return (int) maxPrintObj;
-            } else if (maxPrintObj instanceof Double) {
-                return RRuntime.double2int(((double) maxPrintObj));
-            } else if (maxPrintObj instanceof RAbstractVector) {
-                RAbstractVector maxPrintVec = (RAbstractVector) maxPrintObj;
-                if (maxPrintVec.getLength() > 0) {
-                    if (maxPrintObj instanceof RAbstractIntVector) {
-                        maxPrint = ((RAbstractIntVector) maxPrintVec).getDataAt(0);
-                    }
-                    if (maxPrintObj instanceof RAbstractDoubleVector) {
-                        maxPrint = RRuntime.double2int(((RAbstractDoubleVector) maxPrintVec).getDataAt(0));
-                    }
-                }
-            }
-        }
-        return maxPrint;
+        int maxPrint = RRuntime.asInteger(RContext.getInstance().stateROptions.getValue("max.print"));
+        return RRuntime.isNA(maxPrint) ? -1 : maxPrint;
     }
 
     private String printVector(RAbstractVector vector, String[] values, boolean isStringVector, boolean isRawVector) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintParameters.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintParameters.java
index a19d481dcc..bcd3fdf41d 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintParameters.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintParameters.java
@@ -129,7 +129,6 @@ public final class PrintParameters {
     }
 
     public static int getDefaultMaxPrint() {
-        RRuntime.asInteger(RContext.getInstance().stateROptions.getValue("max.print"));
         int max = RRuntime.asInteger(RContext.getInstance().stateROptions.getValue("max.print"));
         if (max == RRuntime.INT_NA || max < 0) {
             max = 99999;
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java
index cbfb84aa0f..8bc20600a9 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/BrowserInteractNode.java
@@ -38,7 +38,6 @@ import com.oracle.truffle.r.runtime.context.ConsoleHandler;
 import com.oracle.truffle.r.runtime.context.Engine.ParseException;
 import com.oracle.truffle.r.runtime.context.RContext;
 import com.oracle.truffle.r.runtime.data.RIntVector;
-import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RPairList;
 import com.oracle.truffle.r.runtime.data.RStringVector;
@@ -87,8 +86,8 @@ public abstract class BrowserInteractNode extends RNode {
                     input = input.trim();
                 }
                 if (input == null || input.length() == 0) {
-                    RLogicalVector browserNLdisabledVec = (RLogicalVector) RContext.getInstance().stateROptions.getValue("browserNLdisabled");
-                    if (!RRuntime.fromLogical(browserNLdisabledVec.getDataAt(0))) {
+                    byte browserNLdisabledVec = RRuntime.asLogicalObject(RContext.getInstance().stateROptions.getValue("browserNLdisabled"));
+                    if (!RRuntime.fromLogical(browserNLdisabledVec)) {
                         input = lastEmptyLineCommand;
                     }
                 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java
index 9d60e49c9b..e568055e0e 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java
@@ -24,20 +24,21 @@ import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.r.runtime.data.RAttributable;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RDouble;
-import com.oracle.truffle.r.runtime.data.RDoubleVector;
 import com.oracle.truffle.r.runtime.data.RFunction;
-import com.oracle.truffle.r.runtime.data.RIntVector;
 import com.oracle.truffle.r.runtime.data.RInteger;
 import com.oracle.truffle.r.runtime.data.RLogical;
-import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RRaw;
 import com.oracle.truffle.r.runtime.data.RString;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.RTypedValue;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
 
@@ -794,40 +795,40 @@ public class RRuntime {
     }
 
     /**
-     * Java equivalent of GnuR asInteger fur use outside Truffle boundary. TODO support for warnings
+     * Java equivalent of GnuR asLogical for use outside Truffle boundary. TODO support for warnings
+     */
+    public static byte asLogicalObject(Object objArg) {
+        Object obj = asAbstractVector(objArg);
+        if (obj instanceof RAbstractIntVector) {
+            return int2logical(((RAbstractIntVector) obj).getDataAt(0));
+        } else if (obj instanceof RAbstractDoubleVector) {
+            return double2logical(((RAbstractDoubleVector) obj).getDataAt(0));
+        } else if (obj instanceof RAbstractLogicalVector) {
+            return ((RAbstractLogicalVector) obj).getDataAt(0);
+        } else if (obj instanceof RAbstractComplexVector) {
+            return complex2logical(((RAbstractComplexVector) obj).getDataAt(0));
+        } else if (obj instanceof RAbstractStringVector) {
+            return string2logical(((RAbstractStringVector) obj).getDataAt(0));
+        } else {
+            return LOGICAL_NA;
+        }
+    }
+
+    /**
+     * Java equivalent of GnuR asInteger for use outside Truffle boundary. TODO support for warnings
      */
     public static int asInteger(Object objArg) {
         Object obj = asAbstractVector(objArg);
-        if (obj instanceof RIntVector) {
-            int v = ((RIntVector) obj).getDataAt(0);
-            return v;
-        } else if (obj instanceof RDoubleVector) {
-            double d = ((RDoubleVector) obj).getDataAt(0);
-            if (isNAorNaN(d)) {
-                return INT_NA;
-            } else {
-                return (int) d;
-            }
-        } else if (obj instanceof RLogicalVector) {
-            byte v = ((RLogicalVector) obj).getDataAt(0);
-            if (isNA(v)) {
-                return INT_NA;
-            } else {
-                return v;
-            }
-        } else if (obj instanceof RComplexVector) {
-            RComplex v = ((RComplexVector) obj).getDataAt(0);
-            if (isNAorNaN(v.getRealPart()) || isNAorNaN(v.getImaginaryPart())) {
-                return INT_NA;
-            } else {
-                return (int) v.getRealPart();
-            }
-        } else if (obj instanceof RStringVector) {
-            try {
-                return Integer.parseInt(((RStringVector) obj).getDataAt(0));
-            } catch (NumberFormatException ex) {
-                return INT_NA;
-            }
+        if (obj instanceof RAbstractIntVector) {
+            return ((RAbstractIntVector) obj).getDataAt(0);
+        } else if (obj instanceof RAbstractDoubleVector) {
+            return double2int(((RAbstractDoubleVector) obj).getDataAt(0));
+        } else if (obj instanceof RAbstractLogicalVector) {
+            return logical2int(((RAbstractLogicalVector) obj).getDataAt(0));
+        } else if (obj instanceof RAbstractComplexVector) {
+            return complex2int(((RAbstractComplexVector) obj).getDataAt(0));
+        } else if (obj instanceof RAbstractStringVector) {
+            return string2int(((RAbstractStringVector) obj).getDataAt(0));
         } else {
             return INT_NA;
         }
-- 
GitLab