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 246682bb7f1b3923f2340b7a5f4d887feb889b80..dfc372a3ed7589e2c18b15a986297e123783fa2e 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 a0e3caa5659487e3fd021c13191e4756a508ce73..14fa5968ae185f36753702ceeff1ba52718fdb24 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 d161c6383775de582b12f109d93730547cc9aede..081c587999d6d92b74275099bb64fcc3eafeca0a 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); + } }