From b902697896b5612b5cb32489bca509f184d91b92 Mon Sep 17 00:00:00 2001 From: Zbynek Slajchrt <zbynek.slajchrt@oracle.com> Date: Wed, 8 Feb 2017 12:15:04 +0100 Subject: [PATCH] Coercion steps in CP allows specifying the message caller object --- .../truffle/r/nodes/builtin/CastBuilder.java | 46 +++++++++++++++-- .../r/nodes/builtin/casts/PipelineStep.java | 13 +++-- .../builtin/casts/PipelineToCastNode.java | 14 ++--- .../casts/fluent/InitialPhaseBuilder.java | 51 +++++++++++++++---- .../builtin/casts/fluent/PipelineBuilder.java | 15 +++--- .../truffle/r/nodes/unary/CastBaseNode.java | 14 +++-- .../r/nodes/unary/CastComplexNode.java | 5 ++ .../r/nodes/unary/CastDoubleBaseNode.java | 11 ++-- .../truffle/r/nodes/unary/CastDoubleNode.java | 9 +++- .../r/nodes/unary/CastIntegerBaseNode.java | 11 ++-- .../r/nodes/unary/CastIntegerNode.java | 15 ++++-- .../r/nodes/unary/CastLogicalBaseNode.java | 7 ++- .../r/nodes/unary/CastLogicalNode.java | 7 ++- 13 files changed, 172 insertions(+), 46 deletions(-) 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 index 4d4279b45d..98aedf151d 100644 --- 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 @@ -321,26 +321,50 @@ public final class CastBuilder { return new CoercionStep<>(RType.Integer, false); } + public static <T> PipelineStep<T, Integer> asInteger(RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Integer, false, false, false, false, true, messageCallerObj); + } + public static <T> PipelineStep<T, RAbstractIntVector> asIntegerVector() { return new CoercionStep<>(RType.Integer, true); } + public static <T> PipelineStep<T, RAbstractIntVector> asIntegerVector(RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Integer, true, false, false, false, true, messageCallerObj); + } + public static <T> PipelineStep<T, RAbstractIntVector> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - return new CoercionStep<>(RType.Integer, true, preserveNames, preserveDimensions, preserveAttributes); + return new CoercionStep<>(RType.Integer, true, preserveNames, preserveDimensions, preserveAttributes, true, null); + } + + public static <T> PipelineStep<T, RAbstractIntVector> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Integer, true, preserveNames, preserveDimensions, preserveAttributes, true, messageCallerObj); } public static <T> PipelineStep<T, Double> asDouble() { return new CoercionStep<>(RType.Double, false); } + public static <T> PipelineStep<T, Double> asDouble(RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Double, false, false, false, false, true, messageCallerObj); + } + public static <T> PipelineStep<T, RAbstractDoubleVector> asDoubleVector() { return new CoercionStep<>(RType.Double, true); } + public static <T> PipelineStep<T, RAbstractDoubleVector> asDoubleVector(RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Double, true, false, false, false, true, messageCallerObj); + } + public static <T> PipelineStep<T, RAbstractDoubleVector> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { return new CoercionStep<>(RType.Double, true, preserveNames, preserveDimensions, preserveAttributes); } + public static <T> PipelineStep<T, RAbstractDoubleVector> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Double, true, preserveNames, preserveDimensions, preserveAttributes, true, messageCallerObj); + } + public static <T> PipelineStep<T, String> asString() { return new CoercionStep<>(RType.Character, false); } @@ -357,6 +381,10 @@ public final class CastBuilder { return new CoercionStep<>(RType.Complex, true); } + public static <T> PipelineStep<T, RAbstractComplexVector> asComplex(RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Complex, false, false, false, false, true, messageCallerObj); + } + public static <T> PipelineStep<T, RAbstractRawVector> asRawVector() { return new CoercionStep<>(RType.Raw, true); } @@ -365,12 +393,24 @@ public final class CastBuilder { return new CoercionStep<>(RType.Logical, false); } + public static <T> PipelineStep<T, Byte> asLogical(RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Logical, false, false, false, false, true, messageCallerObj); + } + public static <T> PipelineStep<T, RAbstractLogicalVector> asLogicalVector() { return new CoercionStep<>(RType.Logical, true); } + public static <T> PipelineStep<T, RAbstractLogicalVector> asLogicalVector(RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Logical, true, false, false, false, true, messageCallerObj); + } + public static <T> PipelineStep<T, RAbstractLogicalVector> asLogicalVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - return new CoercionStep<>(RType.Logical, true, preserveNames, preserveDimensions, preserveAttributes, false); + return new CoercionStep<>(RType.Logical, true, preserveNames, preserveDimensions, preserveAttributes, false, null); + } + + public static <T> PipelineStep<T, RAbstractLogicalVector> asLogicalVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { + return new CoercionStep<>(RType.Logical, true, preserveNames, preserveDimensions, preserveAttributes, true, messageCallerObj); } public static PipelineStep<Byte, Boolean> asBoolean() { @@ -382,7 +422,7 @@ public final class CastBuilder { } public static <T> PipelineStep<T, RAbstractVector> asVector(boolean preserveNonVector) { - return new CoercionStep<>(RType.Any, true, false, false, false, preserveNonVector); + return new CoercionStep<>(RType.Any, true, false, false, false, preserveNonVector, null); } /** diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineStep.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineStep.java index b4285ff050..e6bbe5e5a4 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineStep.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineStep.java @@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes.builtin.casts; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.RAttributable; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; /** * Represents a single step in the cast pipeline. {@code PipelineStep}, {@code Mapper} and @@ -206,6 +207,7 @@ public abstract class PipelineStep<T, R> { public final boolean preserveNames; public final boolean preserveDimensions; public final boolean preserveAttributes; + public final RBaseNode messageCallObj; /** * Whether RNull/RMissing should be preserved, or converted to an empty list. @@ -218,26 +220,31 @@ public abstract class PipelineStep<T, R> { public final boolean vectorCoercion; public CoercionStep(RType type, boolean vectorCoercion) { - this(type, vectorCoercion, false, false, false, true); + this(type, vectorCoercion, false, false, false, true, null); } public CoercionStep(RType type, boolean vectorCoercion, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - this(type, vectorCoercion, preserveNames, preserveDimensions, preserveAttributes, true); + this(type, vectorCoercion, preserveNames, preserveDimensions, preserveAttributes, true, null); } - public CoercionStep(RType type, boolean vectorCoercion, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean preserveNonVector) { + public CoercionStep(RType type, boolean vectorCoercion, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean preserveNonVector, RBaseNode messageCallObj) { this.type = type; this.vectorCoercion = vectorCoercion; this.preserveNames = preserveNames; this.preserveAttributes = preserveAttributes; this.preserveDimensions = preserveDimensions; this.preserveNonVector = preserveNonVector; + this.messageCallObj = messageCallObj; } public RType getType() { return type; } + public RBaseNode getMessageCallObj() { + return messageCallObj; + } + @Override public <D> D accept(PipelineStepVisitor<D> visitor) { return visitor.visit(this); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineToCastNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineToCastNode.java index 6d99e4f2ed..09f6591a27 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineToCastNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineToCastNode.java @@ -420,19 +420,19 @@ public final class PipelineToCastNode { RType type = step.getType(); switch (type) { case Integer: - return step.vectorCoercion ? CastIntegerNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes) - : CastIntegerBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes); + return step.vectorCoercion ? CastIntegerNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, step.getMessageCallObj()) + : CastIntegerBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, step.getMessageCallObj()); case Double: - return step.vectorCoercion ? CastDoubleNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes) - : CastDoubleBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes); + return step.vectorCoercion ? CastDoubleNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, step.getMessageCallObj()) + : CastDoubleBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, step.getMessageCallObj()); case Character: return step.vectorCoercion ? CastStringNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes) : CastStringBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes); case Logical: - return step.vectorCoercion ? CastLogicalNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes) - : CastLogicalBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes); + return step.vectorCoercion ? CastLogicalNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, step.getMessageCallObj()) + : CastLogicalBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, step.getMessageCallObj()); case Complex: - return CastComplexNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes); + return CastComplexNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, step.getMessageCallObj()); case Raw: return CastRawNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes); case Any: diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java index 68a83118a1..58fe88bbdc 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java @@ -34,6 +34,7 @@ import com.oracle.truffle.r.runtime.data.RRaw; import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; @@ -174,29 +175,53 @@ public class InitialPhaseBuilder<T> extends ArgCastBuilder<T, InitialPhaseBuilde } public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - pipelineBuilder().appendAsVector(RType.Integer, preserveNames, preserveDimensions, preserveAttributes); + return asIntegerVector(preserveNames, preserveDimensions, preserveAttributes, null); + } + + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { + pipelineBuilder().appendAsVector(RType.Integer, preserveNames, preserveDimensions, preserveAttributes, messageCallerObj); return new CoercedPhaseBuilder<>(pipelineBuilder(), Integer.class); } + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(RBaseNode messageCallerObj) { + return asIntegerVector(false, false, false, messageCallerObj); + } + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector() { return asIntegerVector(false, false, false); } public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - pipelineBuilder().appendAsVector(RType.Double, preserveNames, preserveDimensions, preserveAttributes); + return asDoubleVector(preserveNames, preserveDimensions, preserveAttributes, null); + } + + public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { + pipelineBuilder().appendAsVector(RType.Double, preserveNames, preserveDimensions, preserveAttributes, messageCallerObj); return new CoercedPhaseBuilder<>(pipelineBuilder(), Double.class); } + public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(RBaseNode messageCallerObj) { + return asDoubleVector(false, false, false, messageCallerObj); + } + public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector() { return asDoubleVector(false, false, false); } - public CoercedPhaseBuilder<RAbstractDoubleVector, Byte> asLogicalVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - pipelineBuilder().appendAsVector(RType.Logical, preserveNames, preserveDimensions, preserveAttributes); + public CoercedPhaseBuilder<RAbstractLogicalVector, Byte> asLogicalVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { + pipelineBuilder().appendAsVector(RType.Logical, preserveNames, preserveDimensions, preserveAttributes, messageCallerObj); return new CoercedPhaseBuilder<>(pipelineBuilder(), Byte.class); } - public CoercedPhaseBuilder<RAbstractDoubleVector, Byte> asLogicalVector() { + public CoercedPhaseBuilder<RAbstractLogicalVector, Byte> asLogicalVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + return asLogicalVector(preserveNames, preserveDimensions, preserveAttributes, null); + } + + public CoercedPhaseBuilder<RAbstractLogicalVector, Byte> asLogicalVector(RBaseNode messageCallerObj) { + return asLogicalVector(false, false, false, messageCallerObj); + } + + public CoercedPhaseBuilder<RAbstractLogicalVector, Byte> asLogicalVector() { return asLogicalVector(false, false, false); } @@ -210,10 +235,18 @@ public class InitialPhaseBuilder<T> extends ArgCastBuilder<T, InitialPhaseBuilde } public CoercedPhaseBuilder<RAbstractComplexVector, RComplex> asComplexVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - pipelineBuilder().appendAsVector(RType.Complex, preserveNames, preserveDimensions, preserveAttributes); + return asComplexVector(preserveNames, preserveDimensions, preserveAttributes, null); + } + + public CoercedPhaseBuilder<RAbstractComplexVector, RComplex> asComplexVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { + pipelineBuilder().appendAsVector(RType.Complex, preserveNames, preserveDimensions, preserveAttributes, messageCallerObj); return new CoercedPhaseBuilder<>(pipelineBuilder(), RComplex.class); } + public CoercedPhaseBuilder<RAbstractComplexVector, RComplex> asComplexVector(RBaseNode messageCallerObj) { + return asComplexVector(false, false, false, messageCallerObj); + } + public CoercedPhaseBuilder<RAbstractComplexVector, RComplex> asComplexVector() { return asComplexVector(false, false, false); } @@ -228,17 +261,17 @@ public class InitialPhaseBuilder<T> extends ArgCastBuilder<T, InitialPhaseBuilde } public CoercedPhaseBuilder<RAbstractVector, Object> asVector() { - pipelineBuilder().appendAsVector(false, false, false, true); + pipelineBuilder().appendAsVector(false, false, false, true, null); return new CoercedPhaseBuilder<>(pipelineBuilder(), Object.class); } public CoercedPhaseBuilder<RAbstractVector, Object> asVector(boolean preserveNonVector) { - pipelineBuilder().appendAsVector(false, false, false, preserveNonVector); + pipelineBuilder().appendAsVector(false, false, false, preserveNonVector, null); return new CoercedPhaseBuilder<>(pipelineBuilder(), Object.class); } public CoercedPhaseBuilder<RAbstractVector, Object> asVectorPreserveAttrs(boolean preserveNonVector) { - pipelineBuilder().appendAsVector(false, false, true, preserveNonVector); + pipelineBuilder().appendAsVector(false, false, true, preserveNonVector, null); return new CoercedPhaseBuilder<>(pipelineBuilder(), Object.class); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java index b660585cb2..c5f4ba8394 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java @@ -25,7 +25,6 @@ package com.oracle.truffle.r.nodes.builtin.casts.fluent; import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; -import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.casts.Filter; import com.oracle.truffle.r.nodes.builtin.casts.Mapper; import com.oracle.truffle.r.nodes.builtin.casts.MessageData; @@ -39,9 +38,9 @@ import com.oracle.truffle.r.nodes.builtin.casts.PipelineStep.FindFirstStep; import com.oracle.truffle.r.nodes.builtin.casts.PipelineStep.MapIfStep; import com.oracle.truffle.r.nodes.builtin.casts.PipelineStep.MapStep; import com.oracle.truffle.r.nodes.builtin.casts.PipelineStep.NotNAStep; +import com.oracle.truffle.r.nodes.builtin.casts.PipelineToCastNode; import com.oracle.truffle.r.nodes.builtin.casts.analysis.ForwardedValuesAnalyser; import com.oracle.truffle.r.nodes.builtin.casts.analysis.ForwardingAnalysisResult; -import com.oracle.truffle.r.nodes.builtin.casts.PipelineToCastNode; import com.oracle.truffle.r.nodes.unary.CastNode; import com.oracle.truffle.r.runtime.RError.Message; import com.oracle.truffle.r.runtime.RType; @@ -82,13 +81,17 @@ public final class PipelineBuilder { append(new AttributableCoercionStep<>(preserveNames, preserveDimensions, preserveAttributes)); } - public void appendAsVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean preserveNonVector) { - append(new CoercionStep<>(RType.Any, true, preserveNames, preserveDimensions, preserveAttributes, preserveNonVector)); + public void appendAsVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean preserveNonVector, RBaseNode messageCallerObj) { + append(new CoercionStep<>(RType.Any, true, preserveNames, preserveDimensions, preserveAttributes, preserveNonVector, messageCallerObj)); } - public void appendAsVector(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + public void appendAsVector(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { assert type == RType.Integer || type == RType.Double || type == RType.Complex || type == RType.Character || type == RType.Logical || type == RType.Raw; - append(new CoercionStep<>(type, true, preserveNames, preserveDimensions, preserveAttributes)); + append(new CoercionStep<>(type, true, preserveNames, preserveDimensions, preserveAttributes, true, messageCallerObj)); + } + + public void appendAsVector(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + appendAsVector(type, preserveNames, preserveDimensions, preserveAttributes, null); } public void appendNotNA(Object naReplacement, RBaseNode callObj, Message message, Object[] messageArgs) { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java index 860e646188..1f77dc7c61 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, 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 @@ -43,6 +43,7 @@ import com.oracle.truffle.r.runtime.data.RTypedValue; import com.oracle.truffle.r.runtime.data.RVector; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; import com.oracle.truffle.r.runtime.env.REnvironment; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; public abstract class CastBaseNode extends CastNode { @@ -59,13 +60,20 @@ public abstract class CastBaseNode extends CastNode { private final boolean preserveDimensions; private final boolean preserveAttributes; - protected CastBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + protected final RBaseNode messageCallObj; + + protected CastBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallObj) { this.preserveNames = preserveNames; this.preserveDimensions = preserveDimensions; this.preserveAttributes = preserveAttributes; if (preserveDimensions) { getDimNamesNode = GetDimNamesAttributeNode.create(); } + this.messageCallObj = messageCallObj == null ? this : messageCallObj; + } + + protected CastBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + this(preserveNames, preserveDimensions, preserveAttributes, null); } public boolean preserveNames() { @@ -84,7 +92,7 @@ public abstract class CastBaseNode extends CastNode { protected RError throwCannotCoerceListError(String type) { listCoercionErrorBranch.enter(); - throw RError.error(this, RError.Message.LIST_COERCION, type); + throw RError.error(messageCallObj, RError.Message.LIST_COERCION, type); } protected int[] getPreservedDimensions(RAbstractContainer operand) { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java index 00a0678e90..ac4c7257d2 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java @@ -45,6 +45,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; import com.oracle.truffle.r.runtime.ops.na.NACheck; import com.oracle.truffle.r.runtime.ops.na.NAProfile; @@ -62,6 +63,10 @@ public abstract class CastComplexNode extends CastBaseNode { public abstract Object executeComplex(Object o); + protected CastComplexNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { + super(preserveNames, preserveDimensions, preserveAttributes, messageCallerObj); + } + protected CastComplexNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { super(preserveNames, preserveDimensions, preserveAttributes); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleBaseNode.java index 86b4afa030..eee5c32934 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleBaseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleBaseNode.java @@ -33,6 +33,7 @@ import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RRaw; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; import com.oracle.truffle.r.runtime.ops.na.NACheck; import com.oracle.truffle.r.runtime.ops.na.NAProfile; @@ -42,8 +43,12 @@ public abstract class CastDoubleBaseNode extends CastBaseNode { protected final NAProfile naProfile = NAProfile.create(); protected final BranchProfile warningBranch = BranchProfile.create(); + protected CastDoubleBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallObj) { + super(preserveNames, preserveDimensions, preserveAttributes, messageCallObj); + } + protected CastDoubleBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - super(preserveNames, preserveDimensions, preserveAttributes); + this(preserveNames, preserveDimensions, preserveAttributes, null); } @Override @@ -86,7 +91,7 @@ public abstract class CastDoubleBaseNode extends CastBaseNode { double result = naCheck.convertComplexToDouble(operand, false); if (operand.getImaginaryPart() != 0.0) { warningBranch.enter(); - RError.warning(this, RError.Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION); + RError.warning(messageCallObj, RError.Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION); } return result; } @@ -106,7 +111,7 @@ public abstract class CastDoubleBaseNode extends CastBaseNode { double result = RRuntime.string2doubleNoCheck(operand); if (RRuntime.isNA(result)) { warningBranch.enter(); - RError.warning(this, RError.Message.NA_INTRODUCED_COERCION); + RError.warning(messageCallObj, RError.Message.NA_INTRODUCED_COERCION); } return result; } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java index 497b3d0927..3b98bd3901 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java @@ -43,6 +43,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; public abstract class CastDoubleNode extends CastDoubleBaseNode { @@ -50,6 +51,10 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode { super(preserveNames, preserveDimensions, preserveAttributes); } + protected CastDoubleNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallerObj) { + super(preserveNames, preserveDimensions, preserveAttributes, messageCallerObj); + } + @Child private CastDoubleNode recursiveCastDouble; private Object castDoubleRecursive(Object o) { @@ -117,7 +122,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode { ddata[i] = doubleValue; } if (warning) { - RError.warning(this, RError.Message.NA_INTRODUCED_COERCION); + RError.warning(messageCallObj, RError.Message.NA_INTRODUCED_COERCION); } RDoubleVector ret = RDataFactory.createDoubleVector(ddata, !seenNA, getPreservedDimensions(operand), getPreservedNames(operand)); preserveDimensionNames(operand, ret); @@ -141,7 +146,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode { } if (warning) { warningBranch.enter(); - RError.warning(this, RError.Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION); + RError.warning(messageCallObj, RError.Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION); } return vectorCopy(operand, ddata, naCheck.neverSeenNA()); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerBaseNode.java index 9f715e3836..14766f8e64 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerBaseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerBaseNode.java @@ -34,6 +34,7 @@ import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RRaw; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; import com.oracle.truffle.r.runtime.ops.na.NACheck; public abstract class CastIntegerBaseNode extends CastBaseNode { @@ -47,6 +48,10 @@ public abstract class CastIntegerBaseNode extends CastBaseNode { super(preserveNames, preserveDimensions, preserveAttributes); } + protected CastIntegerBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallObj) { + super(preserveNames, preserveDimensions, preserveAttributes, messageCallObj); + } + @Override protected final RType getTargetType() { return RType.Integer; @@ -55,7 +60,7 @@ public abstract class CastIntegerBaseNode extends CastBaseNode { protected Object castIntegerRecursive(Object o) { if (recursiveCastInteger == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - recursiveCastInteger = insert(CastIntegerNodeGen.create(preserveNames(), preserveDimensions(), preserveAttributes())); + recursiveCastInteger = insert(CastIntegerNodeGen.create(preserveNames(), preserveDimensions(), preserveAttributes(), messageCallObj)); } return recursiveCastInteger.executeInt(o); } @@ -87,7 +92,7 @@ public abstract class CastIntegerBaseNode extends CastBaseNode { int result = naCheck.convertComplexToInt(operand, false); if (operand.getImaginaryPart() != 0.0) { warningBranch.enter(); - RError.warning(this, RError.Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION); + RError.warning(messageCallObj, RError.Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION); } return result; } @@ -102,7 +107,7 @@ public abstract class CastIntegerBaseNode extends CastBaseNode { int result = RRuntime.string2intNoCheck(operand); if (RRuntime.isNA(result)) { warningBranch.enter(); - RError.warning(this, RError.Message.NA_INTRODUCED_COERCION); + RError.warning(messageCallObj, RError.Message.NA_INTRODUCED_COERCION); } return result; } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java index 28966f1ed7..796d7b5569 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java @@ -42,6 +42,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; import com.oracle.truffle.r.runtime.ops.na.NAProfile; public abstract class CastIntegerNode extends CastIntegerBaseNode { @@ -52,6 +53,10 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { super(preserveNames, preserveDimensions, preserveAttributes); } + protected CastIntegerNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallObj) { + super(preserveNames, preserveDimensions, preserveAttributes, messageCallObj); + } + public abstract Object executeInt(int o); public abstract Object executeInt(double o); @@ -118,7 +123,7 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { } if (warning) { warningBranch.enter(); - RError.warning(this, RError.Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION); + RError.warning(messageCallObj, RError.Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION); } return vectorCopy(operand, idata, naCheck.neverSeenNA()); } @@ -149,7 +154,7 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { idata[i] = intValue; } if (warning) { - RError.warning(this, RError.Message.NA_INTRODUCED_COERCION); + RError.warning(messageCallObj, RError.Message.NA_INTRODUCED_COERCION); } return vectorCopy(operand, idata, !seenNA); } @@ -221,14 +226,14 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { } public static CastIntegerNode create() { - return CastIntegerNodeGen.create(true, true, true); + return CastIntegerNodeGen.create(true, true, true, null); } public static CastIntegerNode createNonPreserving() { - return CastIntegerNodeGen.create(false, false, false); + return CastIntegerNodeGen.create(false, false, false, null); } public static CastIntegerNode createPreserveNames() { - return CastIntegerNodeGen.create(false, false, false); + return CastIntegerNodeGen.create(false, false, false, null); } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalBaseNode.java index 03ea9e3eb6..d9883e2f08 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalBaseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalBaseNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RRaw; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; import com.oracle.truffle.r.runtime.ops.na.NACheck; public abstract class CastLogicalBaseNode extends CastBaseNode { @@ -37,6 +38,10 @@ public abstract class CastLogicalBaseNode extends CastBaseNode { super(preserveNames, preserveDimensions, preserveAttributes); } + protected CastLogicalBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallObj) { + super(preserveNames, preserveDimensions, preserveAttributes, messageCallObj); + } + @Override protected final RType getTargetType() { return RType.Logical; diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java index e104daf67c..7cd9f32a97 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, 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 @@ -41,6 +41,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; +import com.oracle.truffle.r.runtime.nodes.RBaseNode; import com.oracle.truffle.r.runtime.ops.na.NAProfile; public abstract class CastLogicalNode extends CastLogicalBaseNode { @@ -50,6 +51,10 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode { @Child private CastLogicalNode recursiveCastLogical; @Child private InheritsCheckNode inheritsFactorCheck; + protected CastLogicalNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, RBaseNode messageCallObj) { + super(preserveNames, preserveDimensions, preserveAttributes, messageCallObj); + } + protected CastLogicalNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { super(preserveNames, preserveDimensions, preserveAttributes); } -- GitLab