From edb90f2225252f39812aa897bddc265b44313fe2 Mon Sep 17 00:00:00 2001
From: Christian Humer <christian.humer@oracle.com>
Date: Thu, 16 Apr 2015 13:55:16 +0200
Subject: [PATCH] Update to the latest Graal and DSL changes.

---
 .../truffle/r/nodes/builtin/base/AsRaw.java   |  2 +-
 .../r/nodes/access/WriteVariableNode.java     | 12 ++---
 .../access/array/read/AccessArrayNode.java    |  8 +--
 .../access/array/read/GetDimNamesNode.java    |  8 +--
 .../array/read/GetMultiDimDataNode.java       | 11 ++--
 .../nodes/access/array/read/GetNamesNode.java | 16 ++----
 .../access/array/read/PositionsArrayNode.java | 14 ++---
 .../array/write/SetMultiDimDataNode.java      |  9 ++--
 .../array/write/UpdateArrayHelperNode.java    |  7 ++-
 .../r/nodes/binary/BinaryBooleanNode.java     | 53 +++++++------------
 .../r/nodes/unary/CastToContainerNode.java    |  2 -
 .../oracle/truffle/r/runtime/RRuntime.java    |  4 ++
 .../com/oracle/truffle/r/test/TestBase.java   |  4 +-
 mx.fastr/imports                              |  2 +-
 14 files changed, 67 insertions(+), 85 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsRaw.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsRaw.java
index 31fc5c2a0d..4751b4a4e6 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsRaw.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsRaw.java
@@ -73,7 +73,7 @@ public abstract class AsRaw extends RBuiltinNode {
         return (RRawVector) castRawNode.executeRaw(frame, o);
     }
 
-    public abstract RRaw executeRaw(VirtualFrame frame, Object o);
+    public abstract Object executeRaw(VirtualFrame frame, Object o);
 
     @Specialization
     protected RRawVector asRaw(RNull vector) {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java
index 61f6bcb6e0..6760bfbc25 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java
@@ -419,33 +419,29 @@ public abstract class WriteVariableNode extends RNode implements VisibilityContr
         public abstract Mode getMode();
 
         @Specialization(guards = "isLogicalKind(frame, frameSlot)")
-        protected byte doLogical(VirtualFrame frame, byte value, MaterializedFrame enclosingFrame, FrameSlot frameSlot) {
+        protected void doLogical(VirtualFrame frame, byte value, MaterializedFrame enclosingFrame, FrameSlot frameSlot) {
             controlVisibility();
             FrameSlotChangeMonitor.setByteAndInvalidate(enclosingFrameProfile.profile(enclosingFrame), frameSlot, value, true, invalidateProfile);
-            return value;
         }
 
         @Specialization(guards = "isIntegerKind(frame, frameSlot)")
-        protected int doInteger(VirtualFrame frame, int value, MaterializedFrame enclosingFrame, FrameSlot frameSlot) {
+        protected void doInteger(VirtualFrame frame, int value, MaterializedFrame enclosingFrame, FrameSlot frameSlot) {
             controlVisibility();
             FrameSlotChangeMonitor.setIntAndInvalidate(enclosingFrameProfile.profile(enclosingFrame), frameSlot, value, true, invalidateProfile);
-            return value;
         }
 
         @Specialization(guards = "isDoubleKind(frame, frameSlot)")
-        protected double doDouble(VirtualFrame frame, double value, MaterializedFrame enclosingFrame, FrameSlot frameSlot) {
+        protected void doDouble(VirtualFrame frame, double value, MaterializedFrame enclosingFrame, FrameSlot frameSlot) {
             controlVisibility();
             FrameSlotChangeMonitor.setDoubleAndInvalidate(enclosingFrameProfile.profile(enclosingFrame), frameSlot, value, true, invalidateProfile);
-            return value;
         }
 
         @Specialization
-        protected Object doObject(VirtualFrame frame, Object value, MaterializedFrame enclosingFrame, FrameSlot frameSlot) {
+        protected void doObject(VirtualFrame frame, Object value, MaterializedFrame enclosingFrame, FrameSlot frameSlot) {
             controlVisibility();
             MaterializedFrame profiledFrame = enclosingFrameProfile.profile(enclosingFrame);
             Object newValue = shareObjectValue(profiledFrame, frameSlot, storedObjectProfile.profile(value), getMode(), true);
             FrameSlotChangeMonitor.setObjectAndInvalidate(profiledFrame, frameSlot, newValue, true, invalidateProfile);
-            return value;
         }
 
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/AccessArrayNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/AccessArrayNode.java
index 8a7e10eca2..4af91ac175 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/AccessArrayNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/AccessArrayNode.java
@@ -182,7 +182,7 @@ public abstract class AccessArrayNode extends RNode {
                     int accDstDimensions, NACheck posCheck, NACheck elementCheck) {
         if (getMultiDimData == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            getMultiDimData = insert(GetMultiDimDataNodeGen.create(posCheck, elementCheck, null, null, null, null, null, null, null, null));
+            getMultiDimData = insert(GetMultiDimDataNodeGen.create(posCheck, elementCheck));
         }
         return getMultiDimData.executeMultiDimDataGet(frame, data, vector, positions, currentDimLevel, srcArrayBase, dstArrayBase, accSrcDimensions, accDstDimensions);
     }
@@ -190,15 +190,15 @@ public abstract class AccessArrayNode extends RNode {
     private RStringVector getNames(VirtualFrame frame, RAbstractVector vector, Object[] positions, int currentDimLevel, NACheck namesCheck) {
         if (getNamesNode == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            getNamesNode = insert(GetNamesNodeGen.create(namesCheck, null, null, null, null));
+            getNamesNode = insert(GetNamesNodeGen.create(namesCheck));
         }
-        return (RStringVector) getNamesNode.executeNamesGet(frame, vector, positions, currentDimLevel, RNull.instance);
+        return getNamesNode.executeNamesGet(frame, vector, positions, currentDimLevel, RNull.instance);
     }
 
     private RStringVector getDimNames(VirtualFrame frame, RList dstDimNames, RAbstractVector vector, Object[] positions, int currentSrcDimLevel, int currentDstDimLevel, NACheck namesCheck) {
         if (getDimNamesNode == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            getDimNamesNode = insert(GetDimNamesNodeGen.create(namesCheck, null, null, null, null, null));
+            getDimNamesNode = insert(GetDimNamesNodeGen.create(namesCheck));
         }
         return (RStringVector) getDimNamesNode.executeDimNamesGet(frame, dstDimNames, vector, positions, currentSrcDimLevel, currentDstDimLevel);
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetDimNamesNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetDimNamesNode.java
index ac452d85f6..c9ba342525 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetDimNamesNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetDimNamesNode.java
@@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes.access.array.read;
 import com.oracle.truffle.api.*;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.utilities.*;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.runtime.*;
@@ -32,9 +33,8 @@ import com.oracle.truffle.r.runtime.data.*;
 import com.oracle.truffle.r.runtime.data.model.*;
 import com.oracle.truffle.r.runtime.ops.na.*;
 
-@NodeChildren({@NodeChild(value = "dimNames", type = RNode.class), @NodeChild(value = "vec", type = RNode.class), @NodeChild(value = "pos", type = RNode.class),
-                @NodeChild(value = "srcDimLevel", type = RNode.class), @NodeChild(value = "dstDimLevel", type = RNode.class)})
-abstract class GetDimNamesNode extends RNode {
+@TypeSystemReference(RTypes.class)
+abstract class GetDimNamesNode extends Node {
 
     public abstract Object executeDimNamesGet(VirtualFrame frame, RList dstDimNames, RAbstractVector vector, Object[] positions, int currentSrcDimLevel, int currentDstDimLevel);
 
@@ -45,7 +45,7 @@ abstract class GetDimNamesNode extends RNode {
     private RStringVector getDimNamesRecursive(VirtualFrame frame, RList dstDimNames, RAbstractVector vector, Object[] positions, int currentSrcDimLevel, int currentDstDimLevel, NACheck namesCheck) {
         if (getDimNamesNodeRecursive == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            getDimNamesNodeRecursive = insert(GetDimNamesNodeGen.create(namesCheck, null, null, null, null, null));
+            getDimNamesNodeRecursive = insert(GetDimNamesNodeGen.create(namesCheck));
         }
         return (RStringVector) getDimNamesNodeRecursive.executeDimNamesGet(frame, dstDimNames, vector, positions, currentSrcDimLevel, currentDstDimLevel);
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetMultiDimDataNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetMultiDimDataNode.java
index 7faa952522..92a43d6548 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetMultiDimDataNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetMultiDimDataNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, 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
@@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes.access.array.read;
 import com.oracle.truffle.api.*;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.utilities.*;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.runtime.*;
@@ -32,10 +33,8 @@ import com.oracle.truffle.r.runtime.data.*;
 import com.oracle.truffle.r.runtime.data.model.*;
 import com.oracle.truffle.r.runtime.ops.na.*;
 
-@NodeChildren({@NodeChild(value = "data", type = RNode.class), @NodeChild(value = "vec", type = RNode.class), @NodeChild(value = "pos", type = RNode.class),
-                @NodeChild(value = "currDimLevel", type = RNode.class), @NodeChild(value = "srcArrayBase", type = RNode.class), @NodeChild(value = "dstArrayBase", type = RNode.class),
-                @NodeChild(value = "accSrcDimensions", type = RNode.class), @NodeChild(value = "accDstDimensions", type = RNode.class)})
-abstract class GetMultiDimDataNode extends RNode {
+@TypeSystemReference(RTypes.class)
+abstract class GetMultiDimDataNode extends Node {
 
     public abstract Object executeMultiDimDataGet(VirtualFrame frame, Object data, RAbstractVector vector, Object[] positions, int currentDimLevel, int srcArrayBase, int dstArrayBase,
                     int accSrcDimensions, int accDstDimensions);
@@ -53,7 +52,7 @@ abstract class GetMultiDimDataNode extends RNode {
                     int accDstDimensions, NACheck posCheck, NACheck elementCheck) {
         if (getMultiDimDataRecursive == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            getMultiDimDataRecursive = insert(GetMultiDimDataNodeGen.create(posCheck, elementCheck, null, null, null, null, null, null, null, null));
+            getMultiDimDataRecursive = insert(GetMultiDimDataNodeGen.create(posCheck, elementCheck));
         }
         return getMultiDimDataRecursive.executeMultiDimDataGet(frame, data, vector, positions, currentDimLevel, srcArrayBase, dstArrayBase, accSrcDimensions, accDstDimensions);
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetNamesNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetNamesNode.java
index f1efcfe76c..d93cbb5e67 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetNamesNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/GetNamesNode.java
@@ -25,17 +25,15 @@ package com.oracle.truffle.r.nodes.access.array.read;
 import com.oracle.truffle.api.*;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.utilities.*;
-import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.runtime.data.*;
 import com.oracle.truffle.r.runtime.data.model.*;
 import com.oracle.truffle.r.runtime.ops.na.*;
 
-@NodeChildren({@NodeChild(value = "vec", type = RNode.class), @NodeChild(value = "pos", type = RNode.class), @NodeChild(value = "currDimLevel", type = RNode.class),
-                @NodeChild(value = "names", type = RNode.class)})
-abstract class GetNamesNode extends RNode {
+abstract class GetNamesNode extends Node {
 
-    public abstract Object executeNamesGet(VirtualFrame frame, RAbstractVector vector, Object[] positions, int currentDimLevel, Object names);
+    public abstract RStringVector executeNamesGet(VirtualFrame frame, RAbstractVector vector, Object[] positions, int currentDimLevel, Object names);
 
     private final NACheck namesNACheck;
 
@@ -44,19 +42,15 @@ abstract class GetNamesNode extends RNode {
     private RStringVector getNamesRecursive(VirtualFrame frame, RAbstractVector vector, Object[] positions, int currentDimLevel, Object names, NACheck namesCheck) {
         if (getNamesNodeRecursive == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            getNamesNodeRecursive = insert(GetNamesNodeGen.create(namesCheck, null, null, null, null));
+            getNamesNodeRecursive = insert(GetNamesNodeGen.create(namesCheck));
         }
-        return (RStringVector) getNamesNodeRecursive.executeNamesGet(frame, vector, positions, currentDimLevel, names);
+        return getNamesNodeRecursive.executeNamesGet(frame, vector, positions, currentDimLevel, names);
     }
 
     protected GetNamesNode(NACheck namesNACheck) {
         this.namesNACheck = namesNACheck;
     }
 
-    protected GetNamesNode(GetNamesNode other) {
-        this.namesNACheck = other.namesNACheck;
-    }
-
     @Specialization
     protected RStringVector getNames(VirtualFrame frame, RAbstractVector vector, Object[] positions, int currentDimLevel, RStringVector names) {
         return getNamesInternal(frame, vector, positions, currentDimLevel, names);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/PositionsArrayNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/PositionsArrayNode.java
index 21722f10d3..d477da23d0 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/PositionsArrayNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/read/PositionsArrayNode.java
@@ -76,9 +76,9 @@ public class PositionsArrayNode extends RNode {
 
     public Object executeEval(VirtualFrame frame, Object vector, Object exact) {
         if (hasVarArg) {
-            return executeEvalVarArg(frame, vector, exact);
+            return doEvalVarArg(frame, vector, exact);
         } else {
-            return executeEvalNoVarArg(frame, vector, exact);
+            return doEvalNoVarArg(frame, vector, exact);
         }
     }
 
@@ -91,11 +91,11 @@ public class PositionsArrayNode extends RNode {
         return evaluatedElements;
     }
 
-    public Object executeEvalNoVarArg(VirtualFrame frame, Object vector, Object exact) {
+    private Object doEvalNoVarArg(VirtualFrame frame, Object vector, Object exact) {
         int length = conversionAdapter.getLength();
         Object[] evaluatedElements = explodeLoopNoVarArg(frame, positionsAdapter, length);
         length = conversionAdapter.getLength(); // could have changed
-        executeEvalInternal(frame, vector, exact, evaluatedElements, length);
+        doEvalInternal(frame, vector, exact, evaluatedElements, length);
         return conversionAdapter.getLength() == 1 ? evaluatedElements[0] : evaluatedElements;
     }
 
@@ -116,7 +116,7 @@ public class PositionsArrayNode extends RNode {
         return evaluatedElements;
     }
 
-    public Object executeEvalVarArg(VirtualFrame frame, Object vector, Object exact) {
+    private Object doEvalVarArg(VirtualFrame frame, Object vector, Object exact) {
         int length = conversionAdapter.getLength();
         Object[] evaluatedElements = explodeLoopVarArg(frame, positionsAdapter, length, promiseHelper);
         if (evaluatedElements.length != conversionAdapter.getLength()) {
@@ -124,12 +124,12 @@ public class PositionsArrayNode extends RNode {
             this.conversionAdapter = insert(new PositionsArrayConversionNodeMultiDimAdapter(this.conversionAdapter.isSubset(), evaluatedElements.length));
         }
         length = conversionAdapter.getLength(); // could have changed
-        executeEvalInternal(frame, vector, exact, evaluatedElements, length);
+        doEvalInternal(frame, vector, exact, evaluatedElements, length);
         return conversionAdapter.getLength() == 1 ? evaluatedElements[0] : evaluatedElements;
     }
 
     @ExplodeLoop
-    public void executeEvalInternal(VirtualFrame frame, Object vector, Object exact, Object[] evaluatedElements, int length) {
+    private void doEvalInternal(VirtualFrame frame, Object vector, Object exact, Object[] evaluatedElements, int length) {
         for (int i = 0; i < length; i++) {
             Object convertedOperator = conversionAdapter.executeConvert(frame, vector, evaluatedElements[i], exact, i);
             evaluatedElements[i] = conversionAdapter.executeArg(frame, vector, convertedOperator, i);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/SetMultiDimDataNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/SetMultiDimDataNode.java
index 37c3f0cafc..896998f23b 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/SetMultiDimDataNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/SetMultiDimDataNode.java
@@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes.access.array.write;
 import com.oracle.truffle.api.*;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.utilities.*;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.runtime.*;
@@ -32,10 +33,8 @@ import com.oracle.truffle.r.runtime.data.*;
 import com.oracle.truffle.r.runtime.data.model.*;
 import com.oracle.truffle.r.runtime.ops.na.*;
 
-@NodeChildren({@NodeChild(value = "val", type = RNode.class), @NodeChild(value = "vec", type = RNode.class), @NodeChild(value = "pos", type = RNode.class),
-                @NodeChild(value = "currDimLevel", type = RNode.class), @NodeChild(value = "srcArrayBase", type = RNode.class), @NodeChild(value = "dstArrayBase", type = RNode.class),
-                @NodeChild(value = "accSrcDimensions", type = RNode.class), @NodeChild(value = "accDstDimensions", type = RNode.class)})
-abstract class SetMultiDimDataNode extends RNode {
+@TypeSystemReference(RTypes.class)
+abstract class SetMultiDimDataNode extends Node {
 
     public abstract Object executeMultiDimDataSet(VirtualFrame frame, RAbstractContainer value, RAbstractVector vector, Object[] positions, int currentDimLevel, int srcArrayBase, int dstArrayBase,
                     int accSrcDimensions, int accDstDimensions);
@@ -51,7 +50,7 @@ abstract class SetMultiDimDataNode extends RNode {
                     int accSrcDimensions, int accDstDimensions, NACheck posCheck, NACheck elementCheck) {
         if (setMultiDimDataRecursive == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            setMultiDimDataRecursive = insert(SetMultiDimDataNodeGen.create(posCheck, elementCheck, this.isSubset, null, null, null, null, null, null, null, null));
+            setMultiDimDataRecursive = insert(SetMultiDimDataNodeGen.create(posCheck, elementCheck, this.isSubset));
         }
         return setMultiDimDataRecursive.executeMultiDimDataSet(frame, value, vector, positions, currentDimLevel, srcArrayBase, dstArrayBase, accSrcDimensions, accDstDimensions);
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java
index 7bb262c5da..547900ccd4 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java
@@ -234,7 +234,7 @@ public abstract class UpdateArrayHelperNode extends RNode {
                     int accSrcDimensions, int accDstDimensions, NACheck posNACheck, NACheck elementNACheck) {
         if (setMultiDimData == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            setMultiDimData = insert(SetMultiDimDataNodeGen.create(posNACheck, elementNACheck, this.isSubset, null, null, null, null, null, null, null, null));
+            setMultiDimData = insert(SetMultiDimDataNodeGen.create(posNACheck, elementNACheck, this.isSubset));
         }
         return setMultiDimData.executeMultiDimDataSet(frame, value, vector, positions, currentDimLevel, srcArrayBase, dstArrayBase, accSrcDimensions, accDstDimensions);
     }
@@ -1188,6 +1188,11 @@ public abstract class UpdateArrayHelperNode extends RNode {
         return updateSubset(v, castInteger(frame, value), recLevel, positions, vector);
     }
 
+    @Specialization(guards = {"!isObject(vector)", "isSubset", "!posNames(positions)", "multiPos(positions)"})
+    protected RAbstractIntVector updateSubset(VirtualFrame frame, Object v, RAbstractDoubleVector value, int recLevel, RIntVector positions, RAbstractIntVector vector) {
+        return updateSubset(v, castInteger(frame, value), recLevel, positions, vector);
+    }
+
     @Specialization(guards = {"!isObject(vector)", "isSubset", "!posNames(positions)", "onePosition(positions)"})
     protected Object updateSubsetOne(VirtualFrame frame, Object v, RAbstractIntVector value, int recLevel, RIntVector positions, RAbstractIntVector vector) {
         return updateRecursive(frame, v, value, vector, positions.getDataAt(0), recLevel);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanNode.java
index df13eb3c30..4541589319 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanNode.java
@@ -90,33 +90,30 @@ public abstract class BinaryBooleanNode extends RBuiltinNode {
     }
 
     @Specialization(guards = {"isEmpty(left)", "expectLogical()"})
-    protected RLogicalVector doEmptyLogical(RAbstractRawVector left, RRaw right) {
-        return RDataFactory.createLogicalVector(0);
-    }
-
-    @Specialization(guards = {"isEmpty(right)", "expectLogical()"})
-    protected RLogicalVector doEmptyLogical(RRaw left, RAbstractRawVector right) {
-        return RDataFactory.createLogicalVector(0);
-    }
-
-    @Specialization(guards = {"isEmpty(left)", "!expectLogical()"})
-    protected RAbstractRawVector doEmptyRaw(RAbstractRawVector left, RRaw right) {
-        return RDataFactory.createRawVector(0);
-    }
-
-    @Specialization(guards = {"isEmpty(right)", "!expectLogical()"})
-    protected RAbstractRawVector doEmptyRaw(RRaw left, RAbstractRawVector right) {
-        return RDataFactory.createRawVector(0);
+    protected RAbstractVector doEmptyRaw(RAbstractRawVector left, RAbstractRawVector right) {
+        if (expectLogical()) {
+            return RDataFactory.createLogicalVector(0);
+        } else {
+            return RDataFactory.createRawVector(0);
+        }
     }
 
-    @Specialization(guards = {"isEmpty(left) || isEmpty(right)", "expectLogical()"})
-    protected RLogicalVector doEmptyLogical(RAbstractRawVector left, RAbstractRawVector right) {
-        return RDataFactory.createLogicalVector(0);
+    @Specialization(guards = "isEmpty(left)")
+    protected RAbstractVector doEmpty(RAbstractVector left, Object right) {
+        if (left instanceof RAbstractRawVector) {
+            return doEmptyRaw(null, null);
+        } else {
+            return RDataFactory.createLogicalVector(0);
+        }
     }
 
-    @Specialization(guards = {"isEmpty(left) || isEmpty(right)", "!expectLogical()"})
-    protected RAbstractRawVector doEmptyRaw(RAbstractRawVector left, RAbstractRawVector right) {
-        return RDataFactory.createRawVector(0);
+    @Specialization(guards = "isEmpty(right)")
+    protected RAbstractVector doEmpty(Object left, RAbstractVector right) {
+        if (right instanceof RAbstractRawVector) {
+            return doEmptyRaw(null, null);
+        } else {
+            return RDataFactory.createLogicalVector(0);
+        }
     }
 
     // int
@@ -347,16 +344,6 @@ public abstract class BinaryBooleanNode extends RBuiltinNode {
 
     // empty vectors
 
-    @Specialization(guards = "isEmpty(left)")
-    protected RLogicalVector doEmpty(RAbstractVector left, Object right) {
-        return RDataFactory.createLogicalVector(0);
-    }
-
-    @Specialization(guards = "isEmpty(right)")
-    protected RLogicalVector doEmpty(Object left, RAbstractVector right) {
-        return RDataFactory.createLogicalVector(0);
-    }
-
     // int vector and scalar
 
     @Specialization
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastToContainerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastToContainerNode.java
index 5315747434..9d652068a0 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastToContainerNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastToContainerNode.java
@@ -31,8 +31,6 @@ import com.oracle.truffle.api.frame.*;
 
 public abstract class CastToContainerNode extends CastNode {
 
-    public abstract RAbstractContainer executeRAbstractContainer(VirtualFrame frame, Object value);
-
     public abstract Object executeObject(VirtualFrame frame, Object value);
 
     @Specialization
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java
index 72e89c4070..854d9a2f39 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntime.java
@@ -167,6 +167,8 @@ public class RRuntime {
             return RType.Character.getName();
         } else if (c == RFunction.class) {
             return RType.Function.getName();
+        } else if (c == Object.class) {
+            return RType.Any.getName();
         } else {
             throw new RuntimeException("internal error, unknown class: " + c);
         }
@@ -192,6 +194,8 @@ public class RRuntime {
             return "Raw";
         } else if (c == RString.class) {
             return "Character";
+        } else if (c == Object.class) {
+            return "Any";
         } else {
             throw new RuntimeException("internal error, unknown class: " + c);
         }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java
index 2996fd5746..40b44d65fa 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java
@@ -281,7 +281,7 @@ public class TestBase {
     /**
      * Emptied at the start of a JUnit test, each failed micro test will be added to the list.
      */
-    private static ArrayList<String> failedMicroTests;
+    private static ArrayList<String> failedMicroTests = new ArrayList<>();
 
     private static ArrayList<String> unexpectedSuccessfulMicroTests = new ArrayList<>();
 
@@ -360,7 +360,7 @@ public class TestBase {
      */
     @After
     public void afterTest() {
-        if (!failedMicroTests.isEmpty()) {
+        if (failedMicroTests != null && !failedMicroTests.isEmpty()) {
             fail(failedMicroTests.size() + " micro-test(s) failed: \n  " + new TreeSet<>(failedMicroTests));
         }
     }
diff --git a/mx.fastr/imports b/mx.fastr/imports
index 267e895975..de0f93d8e3 100644
--- a/mx.fastr/imports
+++ b/mx.fastr/imports
@@ -1 +1 @@
-graal,518ce9a36939d45be7d4460c2dae2209404818b3,http://hg.openjdk.java.net/graal/graal
+graal,e6b59c7b39919b56b74dfe97e85e1a6b98b90243,http://hg.openjdk.java.net/graal/graal
-- 
GitLab