From 2b00885d65e69cfbb5d9b24dd9fbf35a636845c0 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Thu, 29 Jan 2015 08:09:19 -0800
Subject: [PATCH] move methods package .Call logic to MethodsListDispatch

---
 .../nodes/builtin/base/ForeignFunctions.java  | 46 +++++++++----
 .../builtin/methods/MethodsListDispatch.java  | 67 +++++++++++++++++++
 2 files changed, 99 insertions(+), 14 deletions(-)
 create mode 100644 com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/methods/MethodsListDispatch.java

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ForeignFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ForeignFunctions.java
index fb6c60a2d7..5438baf902 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ForeignFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ForeignFunctions.java
@@ -32,6 +32,7 @@ import com.oracle.truffle.api.utilities.*;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.nodes.access.*;
 import com.oracle.truffle.r.nodes.builtin.*;
+import com.oracle.truffle.r.nodes.builtin.methods.*;
 import com.oracle.truffle.r.nodes.builtin.utils.*;
 import com.oracle.truffle.r.nodes.unary.*;
 import com.oracle.truffle.r.runtime.*;
@@ -411,7 +412,21 @@ public class ForeignFunctions {
             return matchName(f, "fft");
         }
 
-        // Translated from GnuR: library/methods/src/methods_list_dispatch.c
+        @SuppressWarnings("unused")
+        @Specialization(guards = "initMethodDispatch")
+        @TruffleBoundary
+        protected REnvironment initMethodDispatch(RList f, RArgsValuesAndNames args, RMissing packageName) {
+            controlVisibility();
+            Object[] argValues = args.getValues();
+            REnvironment env = (REnvironment) argValues[0];
+            // TBD what should we actually do here
+            return MethodsListDispatch.getInstance().initMethodDispatch(env);
+        }
+
+        public boolean initMethodDispatch(RList f) {
+            return matchName(f, "R_initMethodDispatch");
+        }
+
         @SuppressWarnings("unused")
         @TruffleBoundary
         @Specialization(guards = "methodsPackageMetaName")
@@ -422,18 +437,13 @@ public class ForeignFunctions {
             String prefixString = (String) argValues[0];
             String nameString = (String) argValues[1];
             String pkgString = (String) argValues[2];
-            if (pkgString.length() == 0) {
-                return String.format(".__%s__%s", prefixString, nameString);
-            } else {
-                return String.format(".__%s__%s:%s", prefixString, nameString, pkgString);
-            }
+            return MethodsListDispatch.getInstance().methodsPackageMetaName(prefixString, nameString, pkgString);
         }
 
         public boolean methodsPackageMetaName(RList f) {
             return matchName(f, "R_methodsPackageMetaName");
         }
 
-        // Translated from GnuR: library/methods/src/methods_list_dispatch.c
         @SuppressWarnings("unused")
         @TruffleBoundary
         @Specialization(guards = "getClassFromCache")
@@ -443,13 +453,7 @@ public class ForeignFunctions {
             REnvironment table = (REnvironment) argValues[1];
             String klassString = RRuntime.asString(argValues[0]);
             if (klassString != null) {
-                Object value = table.get(klassString);
-                if (value == null) {
-                    return RNull.instance;
-                } else {
-                    // TODO check PACKAGE equality
-                    return value;
-                }
+                return MethodsListDispatch.getInstance().getClassFromCache(table, klassString);
             } else {
                 throw RError.error(getEncapsulatingSourceSection(), RError.Message.INVALID_ARG_TYPE);
             }
@@ -459,6 +463,20 @@ public class ForeignFunctions {
             return matchName(f, "R_getClassFromCache");
         }
 
+        @SuppressWarnings("unused")
+        @TruffleBoundary
+        @Specialization(guards = "setMethodDispatch")
+        protected Object callSetMethodDispatch(RList f, RArgsValuesAndNames args, RMissing packageName) {
+            controlVisibility();
+            Object[] argValues = args.getValues();
+            byte onOff = (byte) argValues[0];
+            return MethodsListDispatch.getInstance().setMethodDispatch(onOff);
+        }
+
+        public boolean setMethodDispatch(RList f) {
+            return matchName(f, "R_set_method_dispatch");
+        }
+
         @Specialization
         public Object callNamedFunction(String name, RArgsValuesAndNames args, @SuppressWarnings("unused") RMissing packageName) {
             return callNamedFunctionWithPackage(name, args, null);
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/methods/MethodsListDispatch.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/methods/MethodsListDispatch.java
new file mode 100644
index 0000000000..71964e7536
--- /dev/null
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/methods/MethodsListDispatch.java
@@ -0,0 +1,67 @@
+/*
+ * This material is distributed under the GNU General Public License
+ * Version 2. You may review the terms of this license at
+ * http://www.gnu.org/licenses/gpl-2.0.html
+ *
+ * Copyright (c) 1995-2012, The R Core Team
+ * Copyright (c) 2003, The R Foundation
+ * Copyright (c) 2015, Oracle and/or its affiliates
+ *
+ * All rights reserved.
+ */
+package com.oracle.truffle.r.nodes.builtin.methods;
+
+import com.oracle.truffle.r.runtime.*;
+import com.oracle.truffle.r.runtime.data.*;
+import com.oracle.truffle.r.runtime.env.*;
+
+// Transcribed from src/library/methods/methods_list_dispatch.c
+
+public class MethodsListDispatch {
+    private static MethodsListDispatch singleton = new MethodsListDispatch();
+
+    private boolean tableDispatchOn = true;
+
+    public static MethodsListDispatch getInstance() {
+        return singleton;
+    }
+
+    public REnvironment initMethodDispatch(REnvironment env) {
+        // TODO initialize
+        return env;
+    }
+
+    public byte setMethodDispatch(byte onOff) {
+        boolean prev = tableDispatchOn;
+
+        if (onOff == RRuntime.LOGICAL_NA) {
+            return RRuntime.asLogical(prev);
+        }
+        boolean value = RRuntime.fromLogical(onOff);
+        tableDispatchOn = value;
+        if (value != prev) {
+            // TODO
+        }
+        return RRuntime.asLogical(prev);
+    }
+
+    public String methodsPackageMetaName(String prefixString, String nameString, String pkgString) {
+        if (pkgString.length() == 0) {
+            return String.format(".__%s__%s", prefixString, nameString);
+        } else {
+            return String.format(".__%s__%s:%s", prefixString, nameString, pkgString);
+        }
+    }
+
+    public Object getClassFromCache(REnvironment table, String klassString) {
+        Object value = table.get(klassString);
+        if (value == null) {
+            return RNull.instance;
+        } else {
+            // TODO check PACKAGE equality
+            return value;
+        }
+
+    }
+
+}
-- 
GitLab