From 55278cca32c6c55dff1fe1e0ba3a785a7279189f Mon Sep 17 00:00:00 2001
From: Tomas Stupka <tomas.stupka@oracle.com>
Date: Mon, 20 Nov 2017 16:01:04 +0100
Subject: [PATCH] - handle HAS_KEYS and IS_INSTANTIABLE in
 RAbstractVectorFactory - simplify MR tests

---
 .../interop/RAbstractVectorAccessFactory.java |  20 +++
 .../r/test/engine/interop/AbstractMRTest.java | 161 ++++++++++--------
 .../engine/interop/ActiveBindingMRTest.java   |  10 --
 .../r/test/engine/interop/ListMRTest.java     |  12 +-
 .../interop/RArgsValuesAndNamesMRTest.java    |  13 +-
 .../r/test/engine/interop/RComplexMRTest.java |  15 --
 .../r/test/engine/interop/RDoubleMRTest.java  |  10 --
 .../engine/interop/REnvironmentMRTest.java    |  12 +-
 .../test/engine/interop/RFunctionMRTest.java  |   5 -
 .../r/test/engine/interop/RIntegerMRTest.java |  10 --
 .../engine/interop/RInteropScalarMRTest.java  |  10 --
 .../test/engine/interop/RLanguageMRTest.java  |   5 -
 .../r/test/engine/interop/RRawMRTest.java     |  15 --
 .../test/engine/interop/RS4ObjectMRTest.java  |   2 +-
 .../r/test/engine/interop/VectorMRTest.java   |  16 --
 mx.fastr/suite.py                             |   2 +-
 16 files changed, 133 insertions(+), 185 deletions(-)

diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java
index 0ac20c8270..c3824b5e0f 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java
@@ -245,6 +245,16 @@ public final class RAbstractVectorAccessFactory implements Factory26 {
         });
     }
 
+    @Override
+    public CallTarget accessIsInstantiable() {
+        return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
+            @Override
+            public Object execute(VirtualFrame frame) {
+                return false;
+            }
+        });
+    }
+
     @Override
     public CallTarget accessIsBoxed() {
         return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
@@ -266,6 +276,16 @@ public final class RAbstractVectorAccessFactory implements Factory26 {
         });
     }
 
+    @Override
+    public CallTarget accessHasKeys() {
+        return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
+            @Override
+            public Object execute(VirtualFrame frame) {
+                return false;
+            }
+        });
+    }
+
     @Override
     public CallTarget accessGetSize() {
         return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/AbstractMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/AbstractMRTest.java
index 724ba31190..d3060412fb 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/AbstractMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/AbstractMRTest.java
@@ -22,7 +22,7 @@
  */
 package com.oracle.truffle.r.test.engine.interop;
 
-import static org.junit.Assert.assertEquals;
+import com.oracle.truffle.api.interop.ArityException;
 import static org.junit.Assert.assertTrue;
 
 import java.util.HashSet;
@@ -37,10 +37,14 @@ import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.InteropException;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.TruffleObject;
+import com.oracle.truffle.api.interop.UnknownIdentifierException;
 import com.oracle.truffle.api.interop.UnsupportedMessageException;
+import com.oracle.truffle.api.interop.UnsupportedTypeException;
 import com.oracle.truffle.api.vm.PolyglotEngine;
 import com.oracle.truffle.r.ffi.impl.interop.NativePointer;
 import com.oracle.truffle.r.runtime.data.RNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 public abstract class AbstractMRTest {
 
@@ -69,40 +73,29 @@ public abstract class AbstractMRTest {
      */
     protected abstract TruffleObject createEmptyTruffleObject() throws Exception;
 
-    protected String[] getKeys() {
-        return null;
+    /**
+     * 
+     * @param obj
+     * @return array of keys or <code>null</code> if KEYS message not supported
+     */
+    protected String[] getKeys(TruffleObject obj) {
+        throw new UnsupportedOperationException("override if HAS_KEYS returns true");
     }
 
     protected boolean isNull(@SuppressWarnings("unused") TruffleObject obj) {
         return false;
     }
 
-    protected boolean isExecutable(@SuppressWarnings("unused") TruffleObject obj) {
-        return false;
-    }
-
-    protected boolean isPointer(@SuppressWarnings("unused") TruffleObject obj) {
-        return true;
-    }
-
-    protected boolean isBoxed(@SuppressWarnings("unused") TruffleObject obj) {
-        return false;
-    }
-
-    protected boolean hasSize(@SuppressWarnings("unused") TruffleObject obj) {
-        return false;
-    }
-
     protected boolean testToNative(@SuppressWarnings("unused") TruffleObject obj) {
         return true;
     }
 
     protected int getSize(@SuppressWarnings("unused") TruffleObject obj) {
-        throw new UnsupportedOperationException("override if hasSize returns true");
+        throw new UnsupportedOperationException("override if HAS_SIZE returns true");
     }
 
     protected Object getUnboxed(@SuppressWarnings("unused") TruffleObject obj) {
-        throw new UnsupportedOperationException("override if isBoxed returns true");
+        throw new UnsupportedOperationException("override if IS_BOXED returns true");
     }
 
     @Test
@@ -113,16 +106,44 @@ public abstract class AbstractMRTest {
     }
 
     @Test
-    public void testIsExecutable() throws Exception {
+    public void testExecutable() throws Exception {
         for (TruffleObject obj : createTruffleObjects()) {
-            assertEquals(isExecutable(obj), ForeignAccess.sendIsExecutable(Message.IS_EXECUTABLE.createNode(), obj));
+            try {
+                // TODO if the need appears, also provide for args for execute
+                ForeignAccess.sendExecute(Message.createExecute(0).createNode(), obj);
+                assertEquals(obj.getClass().getSimpleName() + " " + obj + " IS_EXECUTABLE", true, ForeignAccess.sendIsExecutable(Message.IS_EXECUTABLE.createNode(), obj));
+            } catch (UnsupportedTypeException | ArityException e) {
+                throw e;
+            } catch (UnsupportedMessageException e) {
+                assertEquals(obj.getClass().getSimpleName() + " " + obj + " IS_EXECUTABLE", false, ForeignAccess.sendIsExecutable(Message.IS_EXECUTABLE.createNode(), obj));
+            }
         }
     }
 
     @Test
-    public void testIsPointer() throws Exception {
+    public void testInstantiable() throws Exception {
         for (TruffleObject obj : createTruffleObjects()) {
-            assertEquals(obj.getClass().getSimpleName(), isPointer(obj), ForeignAccess.sendIsPointer(Message.IS_POINTER.createNode(), obj));
+            try {
+                // TODO if the need appears, also provide for args for new
+                ForeignAccess.sendNew(Message.createNew(0).createNode(), obj);
+                assertEquals(obj.getClass().getSimpleName() + " " + obj + " IS_INSTANTIABLE", true, ForeignAccess.sendIsInstantiable(Message.IS_INSTANTIABLE.createNode(), obj));
+            } catch (UnsupportedTypeException | ArityException e) {
+                throw e;
+            } catch (UnsupportedMessageException e) {
+                assertEquals(obj.getClass().getSimpleName() + " " + obj + " IS_INSTANTIABLE", false, ForeignAccess.sendIsInstantiable(Message.IS_INSTANTIABLE.createNode(), obj));
+            }
+        }
+    }
+
+    @Test
+    public void testAsNativePointer() throws Exception {
+        for (TruffleObject obj : createTruffleObjects()) {
+            try {
+                assertNotNull(obj.getClass().getSimpleName(), ForeignAccess.sendToNative(Message.AS_POINTER.createNode(), obj));
+                assertEquals(obj.getClass().getSimpleName() + " " + obj + " IS_POINTER", true, ForeignAccess.sendIsPointer(Message.IS_POINTER.createNode(), obj));
+            } catch (UnsupportedMessageException e) {
+                assertEquals(obj.getClass().getSimpleName() + " " + obj + " IS_POINTER", false, ForeignAccess.sendIsPointer(Message.IS_POINTER.createNode(), obj));
+            }
         }
     }
 
@@ -138,7 +159,7 @@ public abstract class AbstractMRTest {
                 } else {
                     assertTrue(obj.getClass().getSimpleName(), ForeignAccess.sendToNative(Message.TO_NATIVE.createNode(), obj) == obj);
                 }
-            } catch (UnsupportedMessageException unsupportedMessageException) {
+            } catch (UnsupportedMessageException e) {
             }
         }
     }
@@ -146,38 +167,62 @@ public abstract class AbstractMRTest {
     @Test
     public void testSize() throws Exception {
         for (TruffleObject obj : createTruffleObjects()) {
-            boolean hasSize = ForeignAccess.sendHasSize(Message.HAS_SIZE.createNode(), obj);
-            assertEquals("" + obj.getClass().getSimpleName() + " " + obj + " hasSize", hasSize(obj), hasSize);
-            if (hasSize) {
-                assertEquals(getSize(obj), ForeignAccess.sendGetSize(Message.GET_SIZE.createNode(), obj));
-            } else {
-                assertInteropException(() -> ForeignAccess.sendGetSize(Message.GET_SIZE.createNode(), obj), UnsupportedMessageException.class);
-            }
+            testSize(obj);
+        }
+        TruffleObject empty = createEmptyTruffleObject();
+        if (empty != null) {
+            testSize(empty);
+        }
+    }
+
+    private void testSize(TruffleObject obj) {
+        try {
+            Object size = ForeignAccess.sendGetSize(Message.GET_SIZE.createNode(), obj);
+            assertEquals(getSize(obj), size);
+            assertEquals(obj.getClass().getSimpleName() + " " + obj + " HAS_SIZE", true, ForeignAccess.sendHasSize(Message.HAS_SIZE.createNode(), obj));
+        } catch (UnsupportedMessageException e) {
+            assertEquals(obj.getClass().getSimpleName() + " " + obj + " HAS_SIZE", false, ForeignAccess.sendHasSize(Message.HAS_SIZE.createNode(), obj));
         }
     }
 
     @Test
     public void testBoxed() throws Exception {
         for (TruffleObject obj : createTruffleObjects()) {
-            boolean isBoxed = ForeignAccess.sendIsBoxed(Message.IS_BOXED.createNode(), obj);
-            assertEquals("" + obj.getClass().getSimpleName() + " " + obj + " isBoxed", isBoxed(obj), isBoxed);
-            if (isBoxed) {
-                assertEquals(getUnboxed(obj), ForeignAccess.sendUnbox(Message.UNBOX.createNode(), obj));
-            } else {
-                assertInteropException(() -> ForeignAccess.sendUnbox(Message.UNBOX.createNode(), obj), UnsupportedMessageException.class);
-            }
+            testUnboxed(obj);
+        }
+        TruffleObject empty = createEmptyTruffleObject();
+        if (empty != null) {
+            testUnboxed(empty);
+        }
+    }
+
+    private void testUnboxed(TruffleObject obj) {
+        try {
+            Object unboxed = ForeignAccess.sendUnbox(Message.UNBOX.createNode(), obj);
+            assertEquals(getUnboxed(obj), unboxed);
+            assertEquals(obj.getClass().getSimpleName() + " " + obj + " IS_BOXED", true, ForeignAccess.sendIsBoxed(Message.IS_BOXED.createNode(), obj));
+        } catch (UnsupportedMessageException e) {
+            assertEquals(obj.getClass().getSimpleName() + " " + obj + " IS_BOXED", false, ForeignAccess.sendIsBoxed(Message.IS_BOXED.createNode(), obj));
         }
     }
 
     @Test
     public void testKeys() throws Exception {
-        String[] keys = getKeys();
-        if (keys == null) {
-            return;
-        }
         for (TruffleObject obj : createTruffleObjects()) {
+            testKeys(obj);
+        }
+        TruffleObject empty = createEmptyTruffleObject();
+        if (empty != null) {
+            testKeys(empty);
+        }
+    }
+
+    private void testKeys(TruffleObject obj) throws UnknownIdentifierException, UnsupportedMessageException {
+        try {
             TruffleObject keysObj = ForeignAccess.sendKeys(Message.KEYS.createNode(), obj);
+
             int size = (int) ForeignAccess.sendGetSize(Message.GET_SIZE.createNode(), keysObj);
+            String[] keys = getKeys(obj);
             assertEquals(keys.length, size);
 
             Set<Object> set = new HashSet<>();
@@ -187,31 +232,9 @@ public abstract class AbstractMRTest {
             for (String key : keys) {
                 assertTrue(set.contains(key));
             }
-        }
-    }
-
-    @Test
-    public void testEmpty() throws Exception {
-
-        TruffleObject obj = createEmptyTruffleObject();
-        if (obj != null) {
-            if (hasSize(obj)) {
-                int size = (int) ForeignAccess.sendGetSize(Message.GET_SIZE.createNode(), obj);
-                assertEquals(0, size);
-            }
-
-            TruffleObject keys = null;
-            try {
-                keys = ForeignAccess.sendKeys(Message.KEYS.createNode(), obj);
-            } catch (UnsupportedMessageException ex) {
-            }
-            if (keys != null) {
-                boolean keysHasSize = ForeignAccess.sendHasSize(Message.HAS_SIZE.createNode(), keys);
-                if (keysHasSize) {
-                    int keysSize = (int) ForeignAccess.sendGetSize(Message.GET_SIZE.createNode(), keys);
-                    assertEquals(0, keysSize);
-                }
-            }
+            assertEquals(obj.getClass().getSimpleName() + " " + obj + " HAS_KEYS", true, ForeignAccess.sendHasKeys(Message.HAS_KEYS.createNode(), obj));
+        } catch (UnsupportedMessageException e) {
+            assertEquals(obj.getClass().getSimpleName() + " " + obj + " HAS_KEYS", false, ForeignAccess.sendHasKeys(Message.HAS_KEYS.createNode(), obj));
         }
     }
 
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/ActiveBindingMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/ActiveBindingMRTest.java
index 6810c10e26..67876824be 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/ActiveBindingMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/ActiveBindingMRTest.java
@@ -38,21 +38,11 @@ public class ActiveBindingMRTest extends AbstractMRTest {
         super.testIsNull(); // force inherited tests from AbstractMRTest
     }
 
-    @Override
-    protected boolean isBoxed(TruffleObject obj) {
-        return true;
-    }
-
     @Override
     protected Object getUnboxed(TruffleObject obj) {
         return ((ActiveBinding) obj).readValue();
     }
 
-    @Override
-    protected boolean isPointer(TruffleObject obj) {
-        return false;
-    }
-
     @Override
     protected TruffleObject[] createTruffleObjects() throws Exception {
         Source src = Source.newBuilder("f=function() {}").mimeType("text/x-r").name("test.R").build();
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/ListMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/ListMRTest.java
index 2105850c64..4830226aa9 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/ListMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/ListMRTest.java
@@ -159,8 +159,11 @@ public class ListMRTest extends AbstractMRTest {
     }
 
     @Override
-    protected String[] getKeys() {
-        return new String[]{"i", "d", "b", "fn", "n", ""};
+    protected String[] getKeys(TruffleObject obj) {
+        if (((RAbstractContainer) obj).getLength() > 0) {
+            return new String[]{"i", "d", "b", "fn", "n", ""};
+        }
+        return new String[]{};
     }
 
     @Override
@@ -174,11 +177,6 @@ public class ListMRTest extends AbstractMRTest {
         return create("list", "");
     }
 
-    @Override
-    protected boolean hasSize(TruffleObject arg0) {
-        return true;
-    }
-
     @Override
     protected int getSize(TruffleObject obj) {
         return obj instanceof RList ? ((RList) obj).getLength() : ((RPairList) obj).getLength();
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RArgsValuesAndNamesMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RArgsValuesAndNamesMRTest.java
index 25e3ce0587..7c81adcfaf 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RArgsValuesAndNamesMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RArgsValuesAndNamesMRTest.java
@@ -140,8 +140,12 @@ public class RArgsValuesAndNamesMRTest extends AbstractMRTest {
     }
 
     @Override
-    protected String[] getKeys() {
-        return names;
+    protected String[] getKeys(TruffleObject obj) {
+        if (obj == RArgsValuesAndNames.EMPTY) {
+            return new String[]{};
+        } else {
+            return names;
+        }
     }
 
     @Override
@@ -149,11 +153,6 @@ public class RArgsValuesAndNamesMRTest extends AbstractMRTest {
         return RArgsValuesAndNames.EMPTY;
     }
 
-    @Override
-    protected boolean hasSize(TruffleObject obj) {
-        return true;
-    }
-
     @Override
     protected int getSize(TruffleObject obj) {
         return ((RArgsValuesAndNames) obj).getLength();
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RComplexMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RComplexMRTest.java
index cc6f61e510..6b7b133f8a 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RComplexMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RComplexMRTest.java
@@ -39,21 +39,6 @@ public class RComplexMRTest extends AbstractMRTest {
         super.testIsNull(); // force inherited tests from AbstractMRTest
     }
 
-    @Override
-    protected boolean isBoxed(TruffleObject obj) {
-        return false;
-    }
-
-    @Override
-    protected boolean isPointer(TruffleObject obj) {
-        return false;
-    }
-
-    @Override
-    protected boolean hasSize(TruffleObject obj) {
-        return false;
-    }
-
     @Override
     protected TruffleObject createEmptyTruffleObject() throws Exception {
         return null;
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RDoubleMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RDoubleMRTest.java
index d60ba87271..9972f65126 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RDoubleMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RDoubleMRTest.java
@@ -39,16 +39,6 @@ public class RDoubleMRTest extends AbstractMRTest {
         return new TruffleObject[]{RDouble.valueOf(1.1)};
     }
 
-    @Override
-    protected boolean isBoxed(TruffleObject obj) {
-        return true;
-    }
-
-    @Override
-    protected boolean isPointer(TruffleObject obj) {
-        return false;
-    }
-
     @Override
     protected Object getUnboxed(TruffleObject obj) {
         return ((RDouble) obj).getValue();
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/REnvironmentMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/REnvironmentMRTest.java
index 60ef430454..f84dd63dec 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/REnvironmentMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/REnvironmentMRTest.java
@@ -36,6 +36,7 @@ import com.oracle.truffle.api.interop.UnknownIdentifierException;
 import com.oracle.truffle.api.interop.UnsupportedMessageException;
 import com.oracle.truffle.api.interop.java.JavaInterop;
 import com.oracle.truffle.api.source.Source;
+import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 
 public class REnvironmentMRTest extends AbstractMRTest {
@@ -138,13 +139,16 @@ public class REnvironmentMRTest extends AbstractMRTest {
     }
 
     @Override
-    protected String[] getKeys() {
-        return new String[]{"s", "i", "d", "b", "fn", "n", "l"};
+    protected String[] getKeys(TruffleObject obj) {
+        if (((REnvironment) obj).getName().equals("R_EmptyEnv")) {
+            return new String[]{};
+        } else {
+            return new String[]{"s", "i", "d", "b", "fn", "n", "l"};
+        }
     }
 
     @Override
     protected TruffleObject createEmptyTruffleObject() throws Exception {
-        Source src = Source.newBuilder("new.env()").mimeType("text/x-r").name("test.R").build();
-        return engine.eval(src).as(REnvironment.class);
+        return REnvironment.emptyEnv();
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RFunctionMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RFunctionMRTest.java
index 1397ae9de2..86b260ec4b 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RFunctionMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RFunctionMRTest.java
@@ -78,11 +78,6 @@ public class RFunctionMRTest extends AbstractMRTest {
         return result.as(RFunction.class);
     }
 
-    @Override
-    protected boolean isExecutable(TruffleObject obj) {
-        return true;
-    }
-
     @Override
     protected TruffleObject createEmptyTruffleObject() throws Exception {
         return null;
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RIntegerMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RIntegerMRTest.java
index 01127d68fd..f4792987d0 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RIntegerMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RIntegerMRTest.java
@@ -39,21 +39,11 @@ public class RIntegerMRTest extends AbstractMRTest {
         return new TruffleObject[]{RInteger.valueOf(123)};
     }
 
-    @Override
-    protected boolean isBoxed(TruffleObject obj) {
-        return true;
-    }
-
     @Override
     protected Object getUnboxed(TruffleObject obj) {
         return ((RInteger) obj).getValue();
     }
 
-    @Override
-    protected boolean isPointer(TruffleObject obj) {
-        return false;
-    }
-
     @Override
     protected TruffleObject createEmptyTruffleObject() throws Exception {
         return null;
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RInteropScalarMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RInteropScalarMRTest.java
index 7f4d397cc3..745c81dee1 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RInteropScalarMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RInteropScalarMRTest.java
@@ -62,16 +62,6 @@ public class RInteropScalarMRTest extends AbstractMRTest {
                         RInteropScalar.RInteropShort.valueOf(Short.MAX_VALUE)};
     }
 
-    @Override
-    protected boolean isBoxed(TruffleObject arg0) {
-        return true;
-    }
-
-    @Override
-    protected boolean isPointer(TruffleObject obj) {
-        return false;
-    }
-
     @Override
     protected Object getUnboxed(TruffleObject obj) {
         RInteropScalar is = (RInteropScalar) obj;
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RLanguageMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RLanguageMRTest.java
index df5d8d6aca..592989add2 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RLanguageMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RLanguageMRTest.java
@@ -105,11 +105,6 @@ public class RLanguageMRTest extends AbstractMRTest {
         return null;
     }
 
-    @Override
-    protected boolean hasSize(TruffleObject obj) {
-        return true;
-    }
-
     @Override
     protected int getSize(TruffleObject obj) {
         return ((RLanguage) obj).getLength();
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RRawMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RRawMRTest.java
index 6b1d2691dd..2bb50e4d34 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RRawMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RRawMRTest.java
@@ -39,21 +39,6 @@ public class RRawMRTest extends AbstractMRTest {
         super.testIsNull(); // force inherited tests from AbstractMRTest
     }
 
-    @Override
-    protected boolean isBoxed(TruffleObject obj) {
-        return true;
-    }
-
-    @Override
-    protected boolean isPointer(TruffleObject obj) {
-        return false;
-    }
-
-    @Override
-    protected boolean hasSize(TruffleObject obj) {
-        return false;
-    }
-
     @Override
     protected Object getUnboxed(TruffleObject obj) {
         return ((RRaw) obj).getValue();
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RS4ObjectMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RS4ObjectMRTest.java
index 70b314fae9..858f2687b9 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RS4ObjectMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RS4ObjectMRTest.java
@@ -125,7 +125,7 @@ public class RS4ObjectMRTest extends AbstractMRTest {
     }
 
     @Override
-    protected String[] getKeys() {
+    protected String[] getKeys(TruffleObject obj) {
         return new String[]{"s", "d", "i", "b", "fn", "class"};
     }
 
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/VectorMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/VectorMRTest.java
index bf7b492695..67c3f0c756 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/VectorMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/VectorMRTest.java
@@ -38,7 +38,6 @@ import com.oracle.truffle.api.interop.java.JavaInterop;
 import com.oracle.truffle.api.source.Source;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RObject;
-import com.oracle.truffle.r.runtime.data.RVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
@@ -108,32 +107,17 @@ public class VectorMRTest extends AbstractMRTest {
         return obj instanceof RObject;
     }
 
-    @Override
-    protected boolean isBoxed(TruffleObject obj) {
-        return ((RAbstractVector) obj).getLength() == 1;
-    }
-
     @Override
     protected Object getUnboxed(TruffleObject obj) {
         assertTrue(((RAbstractVector) obj).getLength() == 1);
         return ((RAbstractVector) obj).getDataAtAsObject(0);
     }
 
-    @Override
-    protected boolean hasSize(TruffleObject obj) {
-        return true;
-    }
-
     @Override
     protected int getSize(TruffleObject obj) {
         return ((RAbstractVector) obj).getLength();
     }
 
-    @Override
-    protected boolean isPointer(TruffleObject obj) {
-        return obj instanceof RVector<?>;
-    }
-
     private static TruffleObject create(String createTxt) throws Exception {
         Source src = Source.newBuilder(createTxt).mimeType("text/x-r").name("test.R").build();
         return engine.eval(src).as(RAbstractVector.class);
diff --git a/mx.fastr/suite.py b/mx.fastr/suite.py
index fcbca55fbf..85809ddcf3 100644
--- a/mx.fastr/suite.py
+++ b/mx.fastr/suite.py
@@ -29,7 +29,7 @@ suite = {
             {
                "name" : "truffle",
                "subdir" : True,
-               "version" : "d1bb9076f1fa6af71c60be140f980794596a75b4",
+               "version" : "e3ce4c4abc668fd637e64a467a8d5b999c2fbdae",
                "urls" : [
                     {"url" : "https://github.com/graalvm/graal", "kind" : "git"},
                     {"url" : "https://curio.ssw.jku.at/nexus/content/repositories/snapshots", "kind" : "binary"},
-- 
GitLab