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 ba054b81793a648e5aab36d6be246434f8f99811..0c55c77ffc9372cf120ad79828e35eb5eab8abb6 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 62285fe54ab19737cb375b5790e4e9c4dcfaf225..fae9dc955abcae4d183ed94c551bd3654d3029c1 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 dd3ad70342611fa4eb240b74a1c82a6f45f7babd..00a9aab2a6e6a61b4601e16eb7689a65b91df65b 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 187c3aa22916af9f29304040bfe009d9a9963d7d..d8e8c8ecb9e426ca0b7799152333f43f42888650 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 192a974c355c3ec227ecacd8d3f955ee1d682ea2..1461d1e0aeb7fce7aec342e008f8a009a1d89466 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 c9d6ffe88ec5a4f45643920f227b66e30ed2c0dc..95055c62f162a1dee0986f62cee9455e5dc38e16 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 ee02e2a7c7398e7c4cc8e25a8c46b4cdd1174f89..469b929d942e3bc5e79b50c57047e29d0da3b87d 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 1967f2cb29cebc0eaafa923ca91a2a9b5b7982f7..19f0915d9808bdf345d39951d469a7f74e05b6b6 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 10089879fee419d3e4937354b4fe783a7d06c452..ea420c1b7ee101b039aced7155e65c99948a2d42 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 9a11b3f4a14cf913022932198a023f8b8ca2da5c..5d2ff680418dfdf7448d265e575613210e3c6bc5 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 d94f0cbbfec8ec32bbe0e02619a62e6a14a57b6e..d2c7d2ee04ce7ef6a0935554b058121aede69ad8 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 0b774201825d5b1c86a42ad6c2e842176e947fa4..18e8daed71c6e87ac4107e20de875cd0c6d8d95d 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 78072090e49d4ead08f2c84111259b17af87fbc3..d4f3260a5d53795f3a4fbf1a82edceac204084da 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 f61227468f3dc3d98e3dc21231bccd04529640e5..3fcd675419d8f8b35f3f6e4d93d583c6c7d29771 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 9e4c6d981acaddb52e6f5db4ac03279e4530268c..f3e5f4047c9ac9dfb1290d1b68962e301105e8dd 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 0000000000000000000000000000000000000000..578acde4c3d0def51ed9201c732d4185713d245a --- /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 7056d2ce7f45e88219ee7f54c93b464f88e0f208..4e1aee75ed59dc99303033511e008f3781017519 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 7cd13118ddde3ebc478ace3f3fe83bb5211341ac..ae77c6a5eb10f2a422591f3ff6cbbcb4fbce2086 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)); } } }