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