Skip to content
Snippets Groups Projects
Commit 2363e1f5 authored by Adam Welc's avatar Adam Welc
Browse files

Rewritten parameter casts for readDCF builtin.

parent 07cac1b2
Branches
No related tags found
No related merge requests found
......@@ -22,6 +22,7 @@
*/
package com.oracle.truffle.r.nodes.builtin.base;
import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.*;
import static com.oracle.truffle.r.runtime.builtins.RBehavior.IO;
import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
......@@ -33,8 +34,8 @@ import java.util.Map;
import java.util.Set;
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.builtin.CastBuilder;
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
import com.oracle.truffle.r.runtime.DCF;
import com.oracle.truffle.r.runtime.RError;
......@@ -50,15 +51,20 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
@RBuiltin(name = "readDCF", kind = INTERNAL, parameterNames = {"conn", "fields", "keepwhite"}, behavior = IO)
public abstract class ReadDCF extends RBuiltinNode {
@Override
protected void createCasts(CastBuilder casts) {
casts.arg("conn").mustBe(RConnection.class);
casts.arg("fields").mustBe(stringValue()).asStringVector();
casts.arg("keepwhite").mustBe(stringValue()).asStringVector();
}
@Specialization
@TruffleBoundary
protected RStringVector doReadDCF(RConnection conn, Object fieldsObj, Object keepWhiteObj) {
RAbstractStringVector fields = fieldsObj == RNull.instance ? null : (RAbstractStringVector) RRuntime.asAbstractVector(fieldsObj);
RAbstractStringVector keepWhite = keepWhiteObj == RNull.instance ? null : (RAbstractStringVector) RRuntime.asAbstractVector(keepWhiteObj);
protected RStringVector doReadDCF(RConnection conn, RAbstractStringVector fields, RAbstractStringVector keepWhite) {
DCF dcf = null;
try (RConnection openConn = conn.forceOpen("r")) {
Set<String> keepWhiteSet = null;
if (keepWhite != null) {
if (keepWhite.getLength() > 0) {
keepWhiteSet = new HashSet<>(keepWhite.getLength());
for (int i = 0; i < keepWhite.getLength(); i++) {
keepWhiteSet.add(keepWhite.getDataAt(i));
......@@ -116,7 +122,7 @@ public abstract class ReadDCF extends RBuiltinNode {
}
private static boolean needField(String fieldName, RAbstractStringVector fields) {
if (fields == null) {
if (fields.getLength() > 0) {
return true;
}
for (int i = 0; i < fields.getLength(); i++) {
......@@ -127,9 +133,4 @@ public abstract class ReadDCF extends RBuiltinNode {
return false;
}
@SuppressWarnings("unused")
@Fallback
protected RStringVector doReadDCF(Object conn, Object fields, Object keepWhite) {
throw RError.error(this, RError.Message.INVALID_OR_UNIMPLEMENTED_ARGUMENTS);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment