From 0c6cf42f1b5826a681ed830443990b3b8272f290 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Tue, 20 Jun 2017 17:20:20 +0200
Subject: [PATCH] various fixes in oldClass and oldClass<-

---
 .../r/nodes/builtin/base/BasePackage.java     |  2 +-
 .../base/{GetOldClass.java => OldClass.java}  | 33 ++++++-------------
 .../r/nodes/builtin/base/UpdateOldClass.java  |  6 ++++
 3 files changed, 17 insertions(+), 24 deletions(-)
 rename com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/{GetOldClass.java => OldClass.java} (67%)

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 246682bb7f..dfc372a3ed 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
@@ -475,7 +475,6 @@ public class BasePackage extends RBuiltinPackage {
         add(GetFunctions.Get.class, GetFunctionsFactory.GetNodeGen::create);
         add(GetFunctions.Get0.class, GetFunctionsFactory.Get0NodeGen::create);
         add(GetFunctions.MGet.class, GetFunctionsFactory.MGetNodeGen::create);
-        add(GetOldClass.class, GetOldClassNodeGen::create);
         add(OptionsFunctions.GetOption.class, OptionsFunctionsFactory.GetOptionNodeGen::create);
         add(GetText.class, GetTextNodeGen::create);
         add(Getwd.class, GetwdNodeGen::create);
@@ -586,6 +585,7 @@ public class BasePackage extends RBuiltinPackage {
         add(NamespaceFunctions.RegisterNamespace.class, NamespaceFunctionsFactory.RegisterNamespaceNodeGen::create);
         add(NamespaceFunctions.UnregisterNamespace.class, NamespaceFunctionsFactory.UnregisterNamespaceNodeGen::create);
         add(NormalizePath.class, NormalizePathNodeGen::create);
+        add(OldClass.class, OldClassNodeGen::create);
         add(OnExit.class, OnExitNodeGen::create);
         add(OptionsFunctions.Options.class, OptionsFunctionsFactory.OptionsNodeGen::create);
         add(Order.class, OrderNodeGen::create);
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GetOldClass.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OldClass.java
similarity index 67%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GetOldClass.java
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OldClass.java
index a0e3caa565..14fa5968ae 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GetOldClass.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OldClass.java
@@ -25,50 +25,37 @@ package com.oracle.truffle.r.nodes.builtin.base;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 
-import com.oracle.truffle.api.dsl.Cached;
+import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetClassAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
-import com.oracle.truffle.r.nodes.function.ClassHierarchyNode;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
-import com.oracle.truffle.r.runtime.data.RFunction;
+import com.oracle.truffle.r.runtime.data.RAttributable;
 import com.oracle.truffle.r.runtime.data.RNull;
-import com.oracle.truffle.r.runtime.data.RSymbol;
-import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 
 @RBuiltin(name = "oldClass", kind = PRIMITIVE, parameterNames = {"x"}, behavior = PURE)
-public abstract class GetOldClass extends RBuiltinNode.Arg1 {
+public abstract class OldClass extends RBuiltinNode.Arg1 {
 
     private final ConditionProfile isObjectProfile = ConditionProfile.createBinaryProfile();
     @Child private GetClassAttributeNode getClassNode = GetClassAttributeNode.create();
 
     static {
-        Casts.noCasts(GetOldClass.class);
+        Casts.noCasts(OldClass.class);
     }
 
     @Specialization
-    protected Object getOldClass(RAbstractContainer arg,
-                    @Cached("createWithImplicit()") ClassHierarchyNode hierarchy) {
-        if (isObjectProfile.profile(getClassNode.isObject(arg))) {
-            return hierarchy.execute(arg);
+    protected Object getOldClass(RAttributable arg) {
+        Object clazz = getClassNode.execute(arg);
+        if (isObjectProfile.profile(clazz != null)) {
+            return clazz;
         } else {
             return RNull.instance;
         }
     }
 
-    @Specialization
-    protected Object getOldClass(@SuppressWarnings("unused") RSymbol arg) {
-        return RNull.instance;
-    }
-
-    @Specialization
-    protected Object getOldClass(@SuppressWarnings("unused") RFunction arg) {
-        return RNull.instance;
-    }
-
-    @Specialization
-    protected Object getOldClass(@SuppressWarnings("unused") RNull arg) {
+    @Fallback
+    protected Object getOldClass(@SuppressWarnings("unused") Object arg) {
         return RNull.instance;
     }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java
index d161c63837..081c587999 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java
@@ -33,6 +33,7 @@ import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetClass
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.unary.CastStringNode;
 import com.oracle.truffle.r.nodes.unary.CastStringNodeGen;
+import com.oracle.truffle.r.runtime.RError.Message;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RNull;
@@ -89,4 +90,9 @@ public abstract class UpdateOldClass extends RBuiltinNode.Arg2 {
         setClassAttributeNode.reset(result);
         return result;
     }
+
+    @Specialization
+    protected Object setOldClass(@SuppressWarnings("unused") RNull arg, @SuppressWarnings("unused") Object className) {
+        throw error(Message.INVALID_NULL_LHS);
+    }
 }
-- 
GitLab