From cc5f2c8b5f5f478e83ce3565f4854dd8b7dff864 Mon Sep 17 00:00:00 2001 From: Lukas Stadler <lukas.stadler@oracle.com> Date: Wed, 17 Feb 2016 16:21:14 +0100 Subject: [PATCH] pull argument casting logic from RBuiltinNode into separate class, support casts in RExternalBuiltinNode --- .../r/nodes/builtin/base/AllNames.java | 1 + .../r/nodes/builtin/base/AsVector.java | 1 + .../truffle/r/nodes/builtin/base/DPut.java | 3 +- .../r/nodes/builtin/base/EnvFunctions.java | 1 + .../builtin/base/InfixEmulationFunctions.java | 1 + .../truffle/r/nodes/builtin/base/RowSums.java | 5 +- .../truffle/r/nodes/builtin/base/SeqLen.java | 3 +- .../r/nodes/builtin/base/Tabulate.java | 5 +- .../r/nodes/builtin/base/Traceback.java | 3 +- .../nodes/builtin/base/TrigExpFunctions.java | 3 +- .../r/nodes/builtin/base/UpdateSlot.java | 3 +- .../r/nodes/builtin/base/UpperTri.java | 3 +- .../truffle/r/nodes/builtin/base/Vector.java | 3 +- .../truffle/r/nodes/builtin/base/Warning.java | 15 +- .../r/nodes/builtin/base/WhichFunctions.java | 24 +-- .../truffle/r/nodes/builtin/CastBuilder.java | 137 ++++++++++++++++ .../truffle/r/nodes/builtin/RBuiltinNode.java | 150 +++++------------- .../r/nodes/builtin/RExternalBuiltinNode.java | 37 +++-- 18 files changed, 251 insertions(+), 147 deletions(-) create mode 100644 com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/CastBuilder.java diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AllNames.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AllNames.java index ba054b8179..0c55c77ffc 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AllNames.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AllNames.java @@ -28,6 +28,7 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.nodes.RASTUtils; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RAllNames; import com.oracle.truffle.r.runtime.RBuiltin; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsVector.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsVector.java index 62285fe54a..fae9dc955a 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsVector.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsVector.java @@ -28,6 +28,7 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; 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.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.unary.CastComplexNode; import com.oracle.truffle.r.nodes.unary.CastDoubleNode; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DPut.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DPut.java index dd3ad70342..00a9aab2a6 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DPut.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DPut.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ import java.io.IOException; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RInvisibleBuiltinNode; import com.oracle.truffle.r.runtime.RBuiltin; import com.oracle.truffle.r.runtime.RDeparse; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EnvFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EnvFunctions.java index 187c3aa229..d8e8c8ecb9 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EnvFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EnvFunctions.java @@ -40,6 +40,7 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.nodes.RRootNode; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.builtin.RInvisibleBuiltinNode; import com.oracle.truffle.r.nodes.builtin.RList2EnvNode; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/InfixEmulationFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/InfixEmulationFunctions.java index 192a974c35..1461d1e0ae 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/InfixEmulationFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/InfixEmulationFunctions.java @@ -37,6 +37,7 @@ import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode; import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode; import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.builtin.base.InfixEmulationFunctionsFactory.PromiseEvaluatorNodeGen; import com.oracle.truffle.r.nodes.function.PromiseHelperNode; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RowSums.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RowSums.java index c9d6ffe88e..95055c62f1 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RowSums.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/RowSums.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2015, Oracle and/or its affiliates + * Copyright (c) 2014, 2016, Oracle and/or its affiliates * * All rights reserved. */ @@ -13,8 +13,9 @@ package com.oracle.truffle.r.nodes.builtin.base; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.ConditionProfile; -import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.api.profiles.LoopConditionProfile; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; +import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RBuiltin; import com.oracle.truffle.r.runtime.RBuiltinKind; import com.oracle.truffle.r.runtime.RError; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/SeqLen.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/SeqLen.java index ee02e2a7c7..469b929d94 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/SeqLen.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/SeqLen.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ import static com.oracle.truffle.r.runtime.RBuiltinKind.PRIMITIVE; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.BranchProfile; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RBuiltin; import com.oracle.truffle.r.runtime.RError; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Tabulate.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Tabulate.java index 1967f2cb29..19f0915d98 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Tabulate.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Tabulate.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2015, Oracle and/or its affiliates + * Copyright (c) 2014, 2016, Oracle and/or its affiliates * * All rights reserved. */ @@ -14,8 +14,9 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.BranchProfile; -import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.api.profiles.LoopConditionProfile; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; +import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RBuiltin; import com.oracle.truffle.r.runtime.RBuiltinKind; import com.oracle.truffle.r.runtime.RError; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Traceback.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Traceback.java index 10089879fe..ea420c1b7e 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Traceback.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Traceback.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ import java.util.Arrays; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RBuiltin; import com.oracle.truffle.r.runtime.RError; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TrigExpFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TrigExpFunctions.java index 9a11b3f4a1..5d2ff68041 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TrigExpFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TrigExpFunctions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,7 @@ import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.profiles.LoopConditionProfile; import com.oracle.truffle.r.nodes.attributes.UnaryCopyAttributesNode; import com.oracle.truffle.r.nodes.attributes.UnaryCopyAttributesNodeGen; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RBuiltin; import com.oracle.truffle.r.runtime.RBuiltinKind; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateSlot.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateSlot.java index d94f0cbbfe..d2c7d2ee04 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateSlot.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateSlot.java @@ -6,7 +6,7 @@ * Copyright (c) 1995, 1996, 1997 Robert Gentleman and Ross Ihaka * Copyright (c) 1995-2014, The R Core Team * Copyright (c) 2002-2008, The R Foundation - * Copyright (c) 2015, Oracle and/or its affiliates + * Copyright (c) 2015, 2016, Oracle and/or its affiliates * * All rights reserved. */ @@ -23,6 +23,7 @@ import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.nodes.access.ConstantNode; import com.oracle.truffle.r.nodes.access.UpdateSlotNode; import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.function.ClassHierarchyNode; import com.oracle.truffle.r.nodes.function.ClassHierarchyNodeGen; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpperTri.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpperTri.java index 0b77420182..18e8daed71 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpperTri.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpperTri.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ import static com.oracle.truffle.r.runtime.RBuiltinKind.SUBSTITUTE; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.ConditionProfile; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RBuiltin; import com.oracle.truffle.r.runtime.RRuntime; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Vector.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Vector.java index 78072090e4..d4f3260a5d 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Vector.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Vector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.nodes.attributes.TypeFromModeNode; import com.oracle.truffle.r.nodes.attributes.TypeFromModeNodeGen; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RBuiltin; import com.oracle.truffle.r.runtime.RError; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Warning.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Warning.java index f61227468f..3fcd675419 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Warning.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Warning.java @@ -22,12 +22,19 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import com.oracle.truffle.api.*; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.*; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RInvisibleBuiltinNode; -import com.oracle.truffle.r.nodes.unary.*; -import com.oracle.truffle.r.runtime.*; +import com.oracle.truffle.r.nodes.unary.CastStringNode; +import com.oracle.truffle.r.nodes.unary.CastStringNodeGen; +import com.oracle.truffle.r.runtime.RBuiltin; +import com.oracle.truffle.r.runtime.RBuiltinKind; +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RErrorHandling; +import com.oracle.truffle.r.runtime.RRuntime; @RBuiltin(name = "warning", kind = RBuiltinKind.INTERNAL, parameterNames = {"call", "immediate", "nobreaks", "message"}) public abstract class Warning extends RInvisibleBuiltinNode { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/WhichFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/WhichFunctions.java index 9e4c6d981a..f3e5f4047c 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/WhichFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/WhichFunctions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,18 +22,24 @@ */ package com.oracle.truffle.r.nodes.builtin.base; +import static com.oracle.truffle.r.runtime.RBuiltinKind.INTERNAL; + +import java.util.ArrayList; + +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; -import com.oracle.truffle.r.runtime.*; -import com.oracle.truffle.r.runtime.data.*; +import com.oracle.truffle.r.runtime.RBuiltin; +import com.oracle.truffle.r.runtime.RBuiltinKind; +import com.oracle.truffle.r.runtime.RRuntime; +import com.oracle.truffle.r.runtime.data.RAttributeProfiles; +import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.RIntVector; +import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; -import com.oracle.truffle.r.runtime.ops.na.*; - -import java.util.ArrayList; - -import static com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import static com.oracle.truffle.r.runtime.RBuiltinKind.INTERNAL; +import com.oracle.truffle.r.runtime.ops.na.NACheck; /** * Encapsulates all which* as nested static classes. diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/CastBuilder.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/CastBuilder.java new file mode 100644 index 0000000000..578acde4c3 --- /dev/null +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/CastBuilder.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.truffle.r.nodes.builtin; + +import java.util.Arrays; + +import com.oracle.truffle.r.nodes.binary.BoxPrimitiveNodeGen; +import com.oracle.truffle.r.nodes.unary.CastDoubleNodeGen; +import com.oracle.truffle.r.nodes.unary.CastIntegerNodeGen; +import com.oracle.truffle.r.nodes.unary.CastLogicalNodeGen; +import com.oracle.truffle.r.nodes.unary.CastNode; +import com.oracle.truffle.r.nodes.unary.CastStringNodeGen; +import com.oracle.truffle.r.nodes.unary.CastToAttributableNodeGen; +import com.oracle.truffle.r.nodes.unary.CastToVectorNodeGen; +import com.oracle.truffle.r.nodes.unary.ChainedCastNode; +import com.oracle.truffle.r.nodes.unary.ConvertIntNodeGen; +import com.oracle.truffle.r.nodes.unary.FirstBooleanNodeGen; +import com.oracle.truffle.r.nodes.unary.FirstIntNode; +import com.oracle.truffle.r.nodes.unary.FirstStringNode; +import com.oracle.truffle.r.runtime.RError; + +public final class CastBuilder { + + private static final CastNode[] EMPTY_CASTS_ARRAY = new CastNode[0]; + + private CastNode[] casts = EMPTY_CASTS_ARRAY; + + private CastBuilder insert(int index, CastNode cast) { + if (index >= casts.length) { + casts = Arrays.copyOf(casts, index + 1); + } + if (casts[index] == null) { + casts[index] = cast; + } else { + casts[index] = new ChainedCastNode(casts[index], cast); + } + return this; + } + + public CastNode[] getCasts() { + return casts; + } + + public CastBuilder toAttributable(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation) { + return insert(index, CastToAttributableNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation)); + } + + public CastBuilder toVector(int index) { + return toVector(index, false); + } + + public CastBuilder toVector(int index, boolean nonVectorPreserved) { + return insert(index, CastToVectorNodeGen.create(nonVectorPreserved)); + } + + public CastBuilder toInteger(int index) { + return toInteger(index, false, false, false); + } + + public CastBuilder toInteger(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation) { + return insert(index, CastIntegerNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation)); + } + + public CastBuilder toDouble(int index) { + return toDouble(index, false, false, false); + } + + public CastBuilder toDouble(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation) { + return insert(index, CastDoubleNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation)); + } + + public CastBuilder toLogical(int index) { + return toLogical(index, false, false, false); + } + + public CastBuilder toLogical(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation) { + return insert(index, CastLogicalNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation)); + } + + public CastBuilder toCharacter(int index) { + return toCharacter(index, false, false, false, false); + } + + public CastBuilder toCharacter(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation, boolean emptyVectorConvertedToNull) { + return insert(index, CastStringNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation, emptyVectorConvertedToNull)); + } + + public CastBuilder boxPrimitive(int index) { + return insert(index, BoxPrimitiveNodeGen.create()); + } + + public CastBuilder custom(int index, CastNode cast) { + return insert(index, cast); + } + + public CastBuilder firstIntegerWithWarning(int index, int intNa, String name) { + insert(index, CastIntegerNodeGen.create(false, false, false)); + return insert(index, FirstIntNode.createWithWarning(RError.Message.FIRST_ELEMENT_USED, name, intNa)); + } + + public CastBuilder convertToInteger(int index) { + return insert(index, ConvertIntNodeGen.create()); + } + + public CastBuilder firstIntegerWithError(int index, RError.Message error, String name) { + insert(index, CastIntegerNodeGen.create(false, false, false)); + return insert(index, FirstIntNode.createWithError(error, name)); + } + + public CastBuilder firstStringWithError(int index, RError.Message error, String name) { + return insert(index, FirstStringNode.createWithError(error, name)); + } + + public CastBuilder firstBoolean(int index) { + return insert(index, FirstBooleanNodeGen.create()); + } +} diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinNode.java index 7056d2ce7f..4e1aee75ed 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinNode.java @@ -22,20 +22,36 @@ */ package com.oracle.truffle.r.nodes.builtin; -import java.util.*; - -import com.oracle.truffle.api.*; +import java.util.Arrays; + +import com.oracle.truffle.api.CompilerAsserts; +import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.dsl.CreateCast; +import com.oracle.truffle.api.dsl.GeneratedBy; +import com.oracle.truffle.api.dsl.NodeChild; +import com.oracle.truffle.api.dsl.NodeField; +import com.oracle.truffle.api.dsl.NodeFields; +import com.oracle.truffle.api.frame.FrameDescriptor; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.dsl.*; -import com.oracle.truffle.api.frame.*; -import com.oracle.truffle.r.nodes.access.*; -import com.oracle.truffle.r.nodes.binary.*; -import com.oracle.truffle.r.nodes.function.*; -import com.oracle.truffle.r.nodes.unary.*; -import com.oracle.truffle.r.runtime.*; -import com.oracle.truffle.r.runtime.data.*; -import com.oracle.truffle.r.runtime.env.frame.*; -import com.oracle.truffle.r.runtime.nodes.*; +import com.oracle.truffle.r.nodes.access.AccessArgumentNode; +import com.oracle.truffle.r.nodes.function.FormalArguments; +import com.oracle.truffle.r.nodes.function.RCallNode; +import com.oracle.truffle.r.nodes.unary.ApplyCastNode; +import com.oracle.truffle.r.nodes.unary.CastNode; +import com.oracle.truffle.r.runtime.ArgumentsSignature; +import com.oracle.truffle.r.runtime.RBuiltin; +import com.oracle.truffle.r.runtime.RBuiltinKind; +import com.oracle.truffle.r.runtime.VisibilityController; +import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; +import com.oracle.truffle.r.runtime.data.RBuiltinDescriptor; +import com.oracle.truffle.r.runtime.data.RMissing; +import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; +import com.oracle.truffle.r.runtime.nodes.RNode; +import com.oracle.truffle.r.runtime.nodes.RSyntaxNode; @NodeFields(value = {@NodeField(name = "builtin", type = RBuiltinFactory.class), @NodeField(name = "suppliedSignature", type = ArgumentsSignature.class)}) @NodeChild(value = "arguments", type = RNode[].class) @@ -43,103 +59,16 @@ public abstract class RBuiltinNode extends RNode implements VisibilityController public abstract Object execute(VirtualFrame frame, Object... args); - private static final CastNode[] EMPTY_CASTS_ARRAY = new CastNode[0]; - - public final class CastBuilder { - - private CastNode[] casts = EMPTY_CASTS_ARRAY; - - private CastBuilder insert(int index, CastNode cast) { - if (index >= casts.length) { - casts = Arrays.copyOf(casts, index + 1); - } - if (casts[index] == null) { - casts[index] = cast; - } else { - casts[index] = new ChainedCastNode(casts[index], cast); - } - return this; - } - - public CastBuilder toAttributable(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation) { - return insert(index, CastToAttributableNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation)); - } - - public CastBuilder toVector(int index) { - return toVector(index, false); - } - - public CastBuilder toVector(int index, boolean nonVectorPreserved) { - return insert(index, CastToVectorNodeGen.create(nonVectorPreserved)); - } - - public CastBuilder toInteger(int index) { - return toInteger(index, false, false, false); - } - - public CastBuilder toInteger(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation) { - return insert(index, CastIntegerNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation)); - } - - public CastBuilder toDouble(int index) { - return toDouble(index, false, false, false); - } - - public CastBuilder toDouble(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation) { - return insert(index, CastDoubleNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation)); - } - - public CastBuilder toLogical(int index) { - return toLogical(index, false, false, false); - } - - public CastBuilder toLogical(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation) { - return insert(index, CastLogicalNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation)); - } - - public CastBuilder toCharacter(int index) { - return toCharacter(index, false, false, false, false); - } - - public CastBuilder toCharacter(int index, boolean preserveNames, boolean dimensionsPreservation, boolean attrPreservation, boolean emptyVectorConvertedToNull) { - return insert(index, CastStringNodeGen.create(preserveNames, dimensionsPreservation, attrPreservation, emptyVectorConvertedToNull)); - } - - public CastBuilder boxPrimitive(int index) { - return insert(index, BoxPrimitiveNodeGen.create()); - } - - public CastBuilder custom(int index, CastNode cast) { - return insert(index, cast); - } - - public CastBuilder firstIntegerWithWarning(int index, int intNa, String name) { - insert(index, CastIntegerNodeGen.create(false, false, false)); - return insert(index, FirstIntNode.createWithWarning(RError.Message.FIRST_ELEMENT_USED, name, intNa)); - } - - public CastBuilder convertToInteger(int index) { - return insert(index, ConvertIntNodeGen.create()); - } - - public CastBuilder firstIntegerWithError(int index, RError.Message error, String name) { - insert(index, CastIntegerNodeGen.create(false, false, false)); - return insert(index, FirstIntNode.createWithError(error, name)); - } - - public CastBuilder firstStringWithError(int index, RError.Message error, String name) { - return insert(index, FirstStringNode.createWithError(error, name)); - } - - public CastBuilder firstBoolean(int index) { - return insert(index, FirstBooleanNodeGen.create()); - } - } - protected void createCasts(@SuppressWarnings("unused") CastBuilder casts) { // nothing to do } + public CastNode[] getCasts() { + CastBuilder builder = new CastBuilder(); + createCasts(builder); + return builder.getCasts(); + } + @CreateCast("arguments") protected RNode[] castArguments(RNode[] arguments) { CastNode[] casts = getCasts(); @@ -155,12 +84,6 @@ public abstract class RBuiltinNode extends RNode implements VisibilityController return castArguments; } - public CastNode[] getCasts() { - CastBuilder builder = new CastBuilder(); - createCasts(builder); - return builder.casts; - } - /** * @return This is the accessor to the 'suppliedArgsNames': The names that have been given to * the arguments supplied to the current function call. These are in the order as they @@ -223,8 +146,7 @@ public abstract class RBuiltinNode extends RNode implements VisibilityController public final RBuiltinNode inline(ArgumentsSignature signature, RNode[] args) { // static number of arguments - RBuiltinNode node = createNode(getBuiltin(), args, signature); - return node; + return createNode(getBuiltin(), args, signature); } protected final RBuiltin getRBuiltin() { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java index 7cd13118dd..ae77c6a5eb 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,16 +36,31 @@ public abstract class RExternalBuiltinNode extends RBaseNode { public abstract Object call(RArgsValuesAndNames args); + protected void createCasts(@SuppressWarnings("unused") CastBuilder casts) { + // nothing to do + } + + public CastNode[] getCasts() { + CastBuilder builder = new CastBuilder(); + createCasts(builder); + return builder.getCasts(); + } + // TODO: these should be in the build nodes @Child private CastLogicalNode castLogical; @Child private CastIntegerNode castInt; @Child private CastDoubleNode castDouble; @Child private CastComplexNode castComplex; @Child private CastToVectorNode castVector; + @Children private final CastNode[] argumentCasts; protected final RAttributeProfiles attrProfiles = RAttributeProfiles.create(); protected final BranchProfile errorProfile = BranchProfile.create(); + public RExternalBuiltinNode() { + this.argumentCasts = getCasts(); + } + protected byte castLogical(RAbstractVector operand) { if (castLogical == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); @@ -107,6 +122,10 @@ public abstract class RExternalBuiltinNode extends RBaseNode { } } + protected Object castArg(RArgsValuesAndNames args, int index) { + return index < argumentCasts.length && argumentCasts[index] != null ? argumentCasts[index].execute(args.getArgument(index)) : args.getArgument(index); + } + public abstract static class Arg0 extends RExternalBuiltinNode { public abstract Object execute(); @@ -123,7 +142,7 @@ public abstract class RExternalBuiltinNode extends RBaseNode { @Override public final Object call(RArgsValuesAndNames args) { checkLength(args, 1); - return execute(args.getArgument(0)); + return execute(castArg(args, 0)); } } @@ -133,7 +152,7 @@ public abstract class RExternalBuiltinNode extends RBaseNode { @Override public final Object call(RArgsValuesAndNames args) { checkLength(args, 2); - return execute(args.getArgument(0), args.getArgument(1)); + return execute(castArg(args, 0), castArg(args, 1)); } } @@ -143,7 +162,7 @@ public abstract class RExternalBuiltinNode extends RBaseNode { @Override public final Object call(RArgsValuesAndNames args) { checkLength(args, 3); - return execute(args.getArgument(0), args.getArgument(1), args.getArgument(2)); + return execute(castArg(args, 0), castArg(args, 1), castArg(args, 2)); } } @@ -153,7 +172,7 @@ public abstract class RExternalBuiltinNode extends RBaseNode { @Override public final Object call(RArgsValuesAndNames args) { checkLength(args, 4); - return execute(args.getArgument(0), args.getArgument(1), args.getArgument(2), args.getArgument(3)); + return execute(castArg(args, 0), castArg(args, 1), castArg(args, 2), castArg(args, 3)); } } @@ -163,7 +182,7 @@ public abstract class RExternalBuiltinNode extends RBaseNode { @Override public final Object call(RArgsValuesAndNames args) { checkLength(args, 5); - return execute(args.getArgument(0), args.getArgument(1), args.getArgument(2), args.getArgument(3), args.getArgument(4)); + return execute(castArg(args, 0), castArg(args, 1), castArg(args, 2), castArg(args, 3), castArg(args, 4)); } } @@ -173,7 +192,7 @@ public abstract class RExternalBuiltinNode extends RBaseNode { @Override public final Object call(RArgsValuesAndNames args) { checkLength(args, 6); - return execute(args.getArgument(0), args.getArgument(1), args.getArgument(2), args.getArgument(3), args.getArgument(4), args.getArgument(5)); + return execute(castArg(args, 0), castArg(args, 1), castArg(args, 2), castArg(args, 3), castArg(args, 4), castArg(args, 5)); } } @@ -184,7 +203,7 @@ public abstract class RExternalBuiltinNode extends RBaseNode { @Override public final Object call(RArgsValuesAndNames args) { checkLength(args, 7); - return execute(args.getArgument(0), args.getArgument(1), args.getArgument(2), args.getArgument(3), args.getArgument(4), args.getArgument(5), args.getArgument(6)); + return execute(castArg(args, 0), castArg(args, 1), castArg(args, 2), castArg(args, 3), castArg(args, 4), castArg(args, 5), castArg(args, 6)); } } @@ -195,7 +214,7 @@ public abstract class RExternalBuiltinNode extends RBaseNode { @Override public final Object call(RArgsValuesAndNames args) { checkLength(args, 8); - return execute(args.getArgument(0), args.getArgument(1), args.getArgument(2), args.getArgument(3), args.getArgument(4), args.getArgument(5), args.getArgument(6), args.getArgument(7)); + return execute(castArg(args, 0), castArg(args, 1), castArg(args, 2), castArg(args, 3), castArg(args, 4), castArg(args, 5), castArg(args, 6), castArg(args, 7)); } } } -- GitLab