From adf0bf748290244796dff38f5ad76079d5028543 Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Mon, 22 Jan 2018 13:06:27 +0100
Subject: [PATCH] Add node for 'eSoftVersion'.

---
 .../r/nodes/builtin/base/BasePackage.java     |  1 +
 .../nodes/builtin/base/DynLoadFunctions.java  | 33 ++++++++++++++++++-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java
index 0a3cf0343b..0544dabb50 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java
@@ -395,6 +395,7 @@ public class BasePackage extends RBuiltinPackage {
         add(DynLoadFunctions.GetLoadedDLLs.class, DynLoadFunctionsFactory.GetLoadedDLLsNodeGen::create);
         add(DynLoadFunctions.GetSymbolInfo.class, DynLoadFunctionsFactory.GetSymbolInfoNodeGen::create);
         add(DynLoadFunctions.IsLoaded.class, DynLoadFunctionsFactory.IsLoadedNodeGen::create);
+        add(DynLoadFunctions.ExtSoftVersion.class, DynLoadFunctionsFactory.ExtSoftVersionNodeGen::create);
         add(EncodeString.class, EncodeStringNodeGen::create);
         add(EncodingFunctions.Encoding.class, EncodingFunctionsFactory.EncodingNodeGen::create);
         add(EncodingFunctions.SetEncoding.class, EncodingFunctionsFactory.SetEncodingNodeGen::create);
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DynLoadFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DynLoadFunctions.java
index b872653b28..8eebeae3cd 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DynLoadFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DynLoadFunctions.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.nodes.builtin.base;
 
-import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.asStringVector;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.instanceOf;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.logicalValue;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.notEmpty;
@@ -35,6 +34,8 @@ import static com.oracle.truffle.r.runtime.builtins.RBehavior.READS_STATE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Cached;
@@ -48,6 +49,7 @@ 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.RNull;
+import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.ffi.DLL;
 import com.oracle.truffle.r.runtime.ffi.DLL.DLLException;
@@ -218,4 +220,33 @@ public class DynLoadFunctions {
             return DLL.isDLLInfo(externalPtr);
         }
     }
+
+    @RBuiltin(name = "eSoftVersion", kind = INTERNAL, parameterNames = {}, behavior = READS_STATE)
+    public abstract static class ExtSoftVersion extends RBuiltinNode.Arg0 {
+
+        static {
+            Casts.noCasts(ExtSoftVersion.class);
+        }
+
+        @Specialization
+        @TruffleBoundary
+        protected RStringVector getSymbolInfo() {
+            String[] data = new String[]{"zlib", "bzlib", "xz", "PCRE", "ICU", "TRE", "iconv"};
+            RStringVector names = RDataFactory.createStringVector(data, true);
+
+            Map<String, String> versionFunctionTable = new HashMap<>();
+            versionFunctionTable.put("zlib", "zlibVersion");
+            versionFunctionTable.put("bzlib", "BZ2_bzlibVersion");
+            versionFunctionTable.put("xz", "lzma_version_string");
+            versionFunctionTable.put("PCRE", "pcre_version");
+            versionFunctionTable.put("TRE", "tre_version");
+
+            // TODO
+
+            // ICU -> empty
+            // TRE mandatory
+            // iconv -> unknown
+            return RDataFactory.createStringVector(0);
+        }
+    }
 }
-- 
GitLab