Skip to content
Snippets Groups Projects
Commit f02e49c8 authored by stepan's avatar stepan
Browse files

CastNodeBuilder for creating ad-hoc cast nodes

parent ecf06d6a
No related branches found
No related tags found
No related merge requests found
......@@ -51,12 +51,10 @@ import com.oracle.truffle.r.nodes.builtin.casts.PipelineStep.FilterStep;
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.fluent.ChainBuilder;
import com.oracle.truffle.r.nodes.builtin.casts.fluent.FindFirstNodeBuilder;
import com.oracle.truffle.r.nodes.builtin.casts.fluent.InitialPhaseBuilder;
import com.oracle.truffle.r.nodes.builtin.casts.fluent.PipelineBuilder;
import com.oracle.truffle.r.nodes.builtin.casts.fluent.PipelineConfigBuilder;
import com.oracle.truffle.r.nodes.builtin.casts.fluent.PreinitialPhaseBuilder;
import com.oracle.truffle.r.nodes.unary.CastNode;
import com.oracle.truffle.r.runtime.RError;
......@@ -132,7 +130,7 @@ public final class CastBuilder {
for (int i = 0; i < argumentBuilders.length; i++) {
PipelineBuilder arg = argumentBuilders[i];
if (arg != null) {
castsCache[i] = PipelineToCastNode.convert(arg.getPipelineConfig().build(), arg.getFirstStep());
castsCache[i] = arg.buildNode();
}
}
}
......@@ -220,7 +218,7 @@ public final class CastBuilder {
*/
public PreinitialPhaseBuilder<Object> arg(String argumentName) {
assert builtin != null : "arg(String) is only supported for builtins cast pipelines";
return new PreinitialPhaseBuilder<>(getBuilder(getArgumentIndex(argumentName), argumentName));
return getBuilder(getArgumentIndex(argumentName), argumentName).fluent();
}
/**
......@@ -229,7 +227,7 @@ public final class CastBuilder {
public PreinitialPhaseBuilder<Object> arg(int argumentIndex, String argumentName) {
assert argumentNames == null || argumentIndex >= 0 && argumentIndex < argumentBuilders.length : "argument index out of range";
assert argumentNames == null || argumentNames[argumentIndex].equals(argumentName) : "wrong argument name " + argumentName;
return new PreinitialPhaseBuilder<>(getBuilder(argumentIndex, argumentName));
return getBuilder(argumentIndex, argumentName).fluent();
}
/**
......@@ -238,7 +236,7 @@ public final class CastBuilder {
public PreinitialPhaseBuilder<Object> arg(int argumentIndex) {
boolean existingIndex = argumentNames != null && argumentIndex >= 0 && argumentIndex < argumentNames.length;
String name = existingIndex ? argumentNames[argumentIndex] : null;
return new PreinitialPhaseBuilder<>(getBuilder(argumentIndex, name));
return getBuilder(argumentIndex, name).fluent();
}
private PipelineBuilder getBuilder(int argumentIndex, String argumentName) {
......@@ -248,7 +246,7 @@ public final class CastBuilder {
argumentBuilders = Arrays.copyOf(argumentBuilders, argumentIndex + 1);
}
if (argumentBuilders[argumentIndex] == null) {
argumentBuilders[argumentIndex] = new PipelineBuilder(new PipelineConfigBuilder(argumentName));
argumentBuilders[argumentIndex] = new PipelineBuilder(argumentName);
}
return argumentBuilders[argumentIndex];
}
......
......@@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes.builtin.casts.fluent;
import java.util.function.Function;
import com.oracle.truffle.r.nodes.builtin.casts.Filter;
import com.oracle.truffle.r.nodes.unary.CastNode;
import com.oracle.truffle.r.runtime.RError;
import com.oracle.truffle.r.runtime.nodes.RBaseNode;
......@@ -78,4 +79,8 @@ public class ArgCastBuilder<T, THIS> {
public <R, THAT extends ArgCastBuilder<R, THAT>> THAT alias(Function<THIS, THAT> aliaser) {
return aliaser.apply((THIS) this);
}
public CastNode buildCastNode() {
return builder.buildNode();
}
}
/*
* Copyright (c) 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
* 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.casts.fluent;
/**
* Can be used to construct a cast node outside of the FastR builtins framework. The cast node can
* be then used to cast anything, not only arguments.
*/
public final class CastNodeBuilder {
public static PreinitialPhaseBuilder<Object> newCastBuilder(String argName) {
return new PipelineBuilder(argName).fluent();
}
public static PreinitialPhaseBuilder<Object> newCastBuilder() {
return newCastBuilder("");
}
}
......@@ -35,6 +35,8 @@ 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.unary.CastNode;
import com.oracle.truffle.r.runtime.RError.Message;
import com.oracle.truffle.r.runtime.RType;
import com.oracle.truffle.r.runtime.nodes.RBaseNode;
......@@ -49,25 +51,16 @@ public final class PipelineBuilder {
private final PipelineConfigBuilder pcb;
private ChainBuilder<?> chainBuilder;
public PipelineBuilder(PipelineConfigBuilder pcb) {
this.pcb = pcb;
public PipelineBuilder(String argumentName) {
this.pcb = new PipelineConfigBuilder(argumentName);
}
// TODO: can be package private once the legacy API is removed
public void append(PipelineStep<?, ?> step) {
if (chainBuilder == null) {
chainBuilder = new ChainBuilder<>(step);
} else {
chainBuilder.addStep(step);
}
public CastNode buildNode() {
return PipelineToCastNode.convert(pcb.build(), getFirstStep());
}
public PipelineConfigBuilder getPipelineConfig() {
return pcb;
}
public PipelineStep<?, ?> getFirstStep() {
return chainBuilder != null ? chainBuilder.getFirstStep() : null;
public PreinitialPhaseBuilder<Object> fluent() {
return new PreinitialPhaseBuilder<>(this);
}
public void appendBoxPrimitive() {
......@@ -138,4 +131,20 @@ public final class PipelineBuilder {
private static MessageData createMessage(RBaseNode callObj, Message message, Object[] messageArgs) {
return message == null ? null : new MessageData(callObj, message, messageArgs);
}
PipelineConfigBuilder getPipelineConfig() {
return pcb;
}
private PipelineStep<?, ?> getFirstStep() {
return chainBuilder != null ? chainBuilder.getFirstStep() : null;
}
private void append(PipelineStep<?, ?> step) {
if (chainBuilder == null) {
chainBuilder = new ChainBuilder<>(step);
} else {
chainBuilder.addStep(step);
}
}
}
......@@ -46,10 +46,7 @@ public final class PipelineConfigBuilder {
private MessageData missingMsg;
private MessageData nullMsg;
// TODO: to be removed with legacy API
private boolean wasLegacyAsVectorCall = false;
public PipelineConfigBuilder(String argumentName) {
PipelineConfigBuilder(String argumentName) {
this.argumentName = argumentName;
defaultError = new MessageData(null, RError.Message.INVALID_ARGUMENT, argumentName);
defaultWarning = defaultError;
......@@ -59,14 +56,6 @@ public final class PipelineConfigBuilder {
return new PipelineConfig(argumentName, defaultError, defaultWarning, missingMapper, nullMapper, missingMsg, nullMsg);
}
public void setWasLegacyAsVectorCall() {
wasLegacyAsVectorCall = true;
}
public boolean wasLegacyAsVectorCall() {
return wasLegacyAsVectorCall;
}
void setDefaultError(MessageData defaultError) {
this.defaultError = defaultError;
}
......
......@@ -42,7 +42,7 @@ import com.oracle.truffle.r.runtime.nodes.RBaseNode;
*/
public final class PreinitialPhaseBuilder<T> extends InitialPhaseBuilder<T> {
public PreinitialPhaseBuilder(PipelineBuilder pipelineBuilder) {
PreinitialPhaseBuilder(PipelineBuilder pipelineBuilder) {
super(pipelineBuilder);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment