From 73bf5d8c892c7603498b97fabb89680e87dda543 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Wed, 5 Nov 2014 13:58:56 -0800
Subject: [PATCH] implement .Machine

---
 .../com/oracle/truffle/r/engine/REngine.java  |  2 +-
 .../r/nodes/builtin/base/BaseVariables.java   | 41 ++++++++++++++++++-
 2 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
index 61dc78f376..ec84baa9ed 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
@@ -86,6 +86,7 @@ public final class REngine implements RContext.Engine {
         Locale.setDefault(Locale.ROOT);
         FastROptions.initialize();
         Load_RFFIFactory.initialize();
+        RAccuracyInfo.initialize();
         singleton.crashOnFatalError = crashOnFatalErrorArg;
         singleton.builtinLookup = RBuiltinPackages.getInstance();
         singleton.context = RContext.setRuntimeState(singleton, commandArgs, consoleHandler, new RASTHelperImpl(), headless);
@@ -95,7 +96,6 @@ public final class REngine implements RContext.Engine {
         singleton.evalFunction = singleton.lookupBuiltin("eval");
         RPackageVariables.initializeBase();
         RVersionInfo.initialize();
-        RAccuracyInfo.initialize();
         RRNG.initialize();
         TempDirPath.initialize();
         LibPaths.initialize();
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BaseVariables.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BaseVariables.java
index ae0cc149cb..7fac75c41f 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BaseVariables.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BaseVariables.java
@@ -40,7 +40,7 @@ import com.oracle.truffle.r.runtime.env.REnvironment.*;
 public class BaseVariables implements RPackageVariables.Handler {
     // @formatter:off
     private static final String[] VARS = new String[]{
-        ".AutoloadEnv", ".BaseNamespaceEnv", ".GlobalEnv", ".Platform", ".Library", ".LibrarySite"
+        ".AutoloadEnv", ".BaseNamespaceEnv", ".GlobalEnv", ".Machine", ".Platform", ".Library", ".LibrarySite"
     };
     // @formatter:on
 
@@ -50,6 +50,7 @@ public class BaseVariables implements RPackageVariables.Handler {
     };
     // @formatter:on
 
+    // @formatter:off
     private int initialized = -1;
 
     public BaseVariables() {
@@ -77,6 +78,9 @@ public class BaseVariables implements RPackageVariables.Handler {
                         String[] platformData = new String[]{"unix", File.separator, ".so", "unknown", "little", "source", File.pathSeparator, ""};
                         value = RDataFactory.createList(platformData, RDataFactory.createStringVector(PLATFORM_NAMES, RDataFactory.COMPLETE_VECTOR));
                         break;
+                    case ".Machine":
+                        value = createMachine();
+                        break;
                     default:
                         continue;
                 }
@@ -110,4 +114,39 @@ public class BaseVariables implements RPackageVariables.Handler {
         initialized++;
     }
 
+    private static final String[] MACHINE_NAMES = new String[] {
+        "double.eps",            "double.neg.eps",        "double.xmin",
+        "double.xmax",           "double.base",           "double.digits",
+        "double.rounding",       "double.guard",          "double.ulp.digits",
+        "double.neg.ulp.digits", "double.exponent",       "double.min.exp",
+        "double.max.exp",        "integer.max",           "sizeof.long",
+        "sizeof.longlong",       "sizeof.longdouble",     "sizeof.pointer"
+    };
+    // @formatter:on
+
+    private static RList createMachine() {
+        Object[] values = new Object[MACHINE_NAMES.length];
+        RAccuracyInfo acc = RAccuracyInfo.get();
+        values[0] = acc.eps;
+        values[1] = acc.epsneg;
+        values[2] = acc.xmin;
+        values[3] = acc.xmax;
+        values[4] = acc.ibeta;
+        values[5] = acc.it;
+        values[6] = acc.irnd;
+        values[7] = acc.ngrd;
+        values[8] = acc.machep;
+        values[9] = acc.negep;
+        values[10] = acc.iexp;
+        values[11] = acc.minexp;
+        values[12] = acc.maxexp;
+        values[13] = Integer.MAX_VALUE;
+        // TODO platform specific
+        values[14] = 8;
+        values[15] = 8;
+        values[16] = 16;
+        values[17] = 8;
+        return RDataFactory.createList(values, RDataFactory.createStringVector(MACHINE_NAMES, RDataFactory.COMPLETE_VECTOR));
+    }
+
 }
-- 
GitLab