From 1f277de9d6000caadebef546614317de9b6849b0 Mon Sep 17 00:00:00 2001
From: Tomas Stupka <tomas.stupka@oracle.com>
Date: Tue, 24 Jul 2018 16:37:13 +0200
Subject: [PATCH] generated test outputmove warnings management from
 Fast/SlowPathAccess to the iterators

---
 .../truffle/r/runtime/data/RComplex.java      |  24 +-
 .../r/runtime/data/RComplexVector.java        |  31 +-
 .../truffle/r/runtime/data/RDouble.java       |   8 +-
 .../r/runtime/data/RDoubleSequence.java       |   8 +-
 .../truffle/r/runtime/data/RDoubleVector.java |  18 +-
 .../truffle/r/runtime/data/RExpression.java   |  16 +-
 .../runtime/data/RForeignBooleanWrapper.java  |   8 +-
 .../r/runtime/data/RForeignDoubleWrapper.java |  10 +-
 .../r/runtime/data/RForeignIntWrapper.java    |   8 +-
 .../r/runtime/data/RForeignListWrapper.java   |   8 +-
 .../data/RForeignNamedListWrapper.java        |   8 +-
 .../r/runtime/data/RForeignStringWrapper.java |   8 +-
 .../truffle/r/runtime/data/RIntSequence.java  |   8 +-
 .../truffle/r/runtime/data/RIntVector.java    |  18 +-
 .../truffle/r/runtime/data/RInteger.java      |   8 +-
 .../oracle/truffle/r/runtime/data/RList.java  |  16 +-
 .../truffle/r/runtime/data/RLogical.java      |   8 +-
 .../r/runtime/data/RLogicalVector.java        |  18 +-
 .../truffle/r/runtime/data/RPairList.java     |   8 +-
 .../oracle/truffle/r/runtime/data/RRaw.java   |   8 +-
 .../truffle/r/runtime/data/RRawVector.java    |  18 +-
 .../truffle/r/runtime/data/RScalarList.java   |   8 +-
 .../truffle/r/runtime/data/RString.java       |   8 +-
 .../r/runtime/data/RStringSequence.java       |   8 +-
 .../truffle/r/runtime/data/RStringVector.java |  20 +-
 .../closures/RToComplexVectorClosure.java     |  25 +-
 .../data/closures/RToDoubleVectorClosure.java |  15 +-
 .../data/closures/RToIntVectorClosure.java    |  15 +-
 .../data/closures/RToStringVectorClosure.java |  15 +-
 .../data/nodes/FastPathVectorAccess.java      | 362 +++++++++---------
 .../data/nodes/PrimitiveVectorAccess.java     |  36 +-
 .../data/nodes/SlowPathVectorAccess.java      | 362 +++++++++---------
 .../r/runtime/data/nodes/VectorAccess.java    | 176 +++++----
 33 files changed, 675 insertions(+), 640 deletions(-)

diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplex.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplex.java
index 706eaea568..ee30fb24e4 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplex.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplex.java
@@ -155,21 +155,21 @@ public final class RComplex extends RScalarVector implements RAbstractComplexVec
         }
 
         @Override
-        protected RComplex getComplex(Object store, int index) {
+        protected RComplex getComplexImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return (RComplex) store;
+            return (RComplex) accessIter.getStore();
         }
 
         @Override
-        protected double getComplexR(Object store, int index) {
+        protected double getComplexRImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RComplex) store).realPart;
+            return ((RComplex) accessIter.getStore()).realPart;
         }
 
         @Override
-        protected double getComplexI(Object store, int index) {
+        protected double getComplexIImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RComplex) store).imaginaryPart;
+            return ((RComplex) accessIter.getStore()).imaginaryPart;
         }
     }
 
@@ -180,21 +180,21 @@ public final class RComplex extends RScalarVector implements RAbstractComplexVec
 
     private static final SlowPathFromComplexAccess SLOW_PATH_ACCESS = new SlowPathFromComplexAccess() {
         @Override
-        protected RComplex getComplex(Object store, int index) {
+        protected RComplex getComplexImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return (RComplex) store;
+            return (RComplex) accessIter.getStore();
         }
 
         @Override
-        protected double getComplexR(Object store, int index) {
+        protected double getComplexRImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RComplex) store).realPart;
+            return ((RComplex) accessIter.getStore()).realPart;
         }
 
         @Override
-        protected double getComplexI(Object store, int index) {
+        protected double getComplexIImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RComplex) store).imaginaryPart;
+            return ((RComplex) accessIter.getStore()).imaginaryPart;
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java
index 562c9181da..510bf7d39c 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java
@@ -235,22 +235,23 @@ public final class RComplexVector extends RVector<double[]> implements RAbstract
         }
 
         @Override
-        protected RComplex getComplex(Object store, int index) {
-            return RComplex.valueOf(getComplexR(store, index), getComplexI(store, index));
+        protected RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            return RComplex.valueOf(getComplexRImpl(accessIter, index), getComplexIImpl(accessIter, index));
         }
 
         @Override
-        protected double getComplexR(Object store, int index) {
-            return hasStore ? ((double[]) store)[index * 2] : NativeDataAccess.getDoubleNativeMirrorData(store, index * 2);
+        protected double getComplexRImpl(AccessIterator accessIter, int index) {
+            return hasStore ? ((double[]) accessIter.getStore())[index * 2] : NativeDataAccess.getDoubleNativeMirrorData(accessIter.getStore(), index * 2);
         }
 
         @Override
-        protected double getComplexI(Object store, int index) {
-            return hasStore ? ((double[]) store)[index * 2 + 1] : NativeDataAccess.getDoubleNativeMirrorData(store, index * 2 + 1);
+        protected double getComplexIImpl(AccessIterator accessIter, int index) {
+            return hasStore ? ((double[]) accessIter.getStore())[index * 2 + 1] : NativeDataAccess.getDoubleNativeMirrorData(accessIter.getStore(), index * 2 + 1);
         }
 
         @Override
-        protected void setComplex(Object store, int index, double real, double imaginary) {
+        protected void setComplexImpl(AccessIterator accessIter, int index, double real, double imaginary) {
+            Object store = accessIter.getStore();
             if (hasStore) {
                 ((double[]) store)[index * 2] = real;
                 ((double[]) store)[index * 2 + 1] = imaginary;
@@ -268,26 +269,26 @@ public final class RComplexVector extends RVector<double[]> implements RAbstract
 
     private static final SlowPathFromComplexAccess SLOW_PATH_ACCESS = new SlowPathFromComplexAccess() {
         @Override
-        protected RComplex getComplex(Object store, int index) {
-            RComplexVector vector = (RComplexVector) store;
+        protected RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            RComplexVector vector = (RComplexVector) accessIter.getStore();
             return NativeDataAccess.getData(vector, vector.data, index);
         }
 
         @Override
-        protected double getComplexR(Object store, int index) {
-            RComplexVector vector = (RComplexVector) store;
+        protected double getComplexRImpl(AccessIterator accessIter, int index) {
+            RComplexVector vector = (RComplexVector) accessIter.getStore();
             return NativeDataAccess.getDataR(vector, vector.data, index);
         }
 
         @Override
-        protected double getComplexI(Object store, int index) {
-            RComplexVector vector = (RComplexVector) store;
+        protected double getComplexIImpl(AccessIterator accessIter, int index) {
+            RComplexVector vector = (RComplexVector) accessIter.getStore();
             return NativeDataAccess.getDataI(vector, vector.data, index);
         }
 
         @Override
-        protected void setComplex(Object store, int index, double real, double imaginary) {
-            RComplexVector vector = (RComplexVector) store;
+        protected void setComplexImpl(AccessIterator accessIter, int index, double real, double imaginary) {
+            RComplexVector vector = (RComplexVector) accessIter.getStore();
             NativeDataAccess.setData(vector, vector.data, index, real, imaginary);
         }
     };
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDouble.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDouble.java
index dd7874e373..0b143cfd99 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDouble.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDouble.java
@@ -111,9 +111,9 @@ public final class RDouble extends RScalarVector implements RAbstractDoubleVecto
         }
 
         @Override
-        protected double getDouble(Object store, int index) {
+        protected double getDoubleImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RDouble) store).value;
+            return ((RDouble) accessIter.getStore()).value;
         }
     }
 
@@ -124,9 +124,9 @@ public final class RDouble extends RScalarVector implements RAbstractDoubleVecto
 
     private static final SlowPathFromDoubleAccess SLOW_PATH_ACCESS = new SlowPathFromDoubleAccess() {
         @Override
-        protected double getDouble(Object store, int index) {
+        protected double getDoubleImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RDouble) store).value;
+            return ((RDouble) accessIter.getStore()).value;
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleSequence.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleSequence.java
index 74ae82f0bd..22f40c18d3 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleSequence.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleSequence.java
@@ -146,8 +146,8 @@ public final class RDoubleSequence extends RSequence implements RAbstractDoubleV
         }
 
         @Override
-        protected double getDouble(Object store, int index) {
-            RDoubleSequence vector = (RDoubleSequence) store;
+        protected double getDoubleImpl(AccessIterator accessIter, int index) {
+            RDoubleSequence vector = (RDoubleSequence) accessIter.getStore();
             assert index >= 0 && index < vector.getLength();
             return vector.start + vector.stride * index;
         }
@@ -160,8 +160,8 @@ public final class RDoubleSequence extends RSequence implements RAbstractDoubleV
 
     private static final SlowPathFromDoubleAccess SLOW_PATH_ACCESS = new SlowPathFromDoubleAccess() {
         @Override
-        protected double getDouble(Object store, int index) {
-            RDoubleSequence vector = (RDoubleSequence) store;
+        protected double getDoubleImpl(AccessIterator accessIter, int index) {
+            RDoubleSequence vector = (RDoubleSequence) accessIter.getStore();
             assert index >= 0 && index < vector.getLength();
             return vector.start + vector.stride * index;
         }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java
index 816427bf24..d07923b084 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java
@@ -260,16 +260,16 @@ public final class RDoubleVector extends RVector<double[]> implements RAbstractD
         }
 
         @Override
-        protected double getDouble(Object store, int index) {
-            return hasStore ? ((double[]) store)[index] : NativeDataAccess.getDoubleNativeMirrorData(store, index);
+        protected double getDoubleImpl(AccessIterator accessIter, int index) {
+            return hasStore ? ((double[]) accessIter.getStore())[index] : NativeDataAccess.getDoubleNativeMirrorData(accessIter.getStore(), index);
         }
 
         @Override
-        protected void setDouble(Object store, int index, double value) {
+        protected void setDoubleImpl(AccessIterator accessIter, int index, double value) {
             if (hasStore) {
-                ((double[]) store)[index] = value;
+                ((double[]) accessIter.getStore())[index] = value;
             } else {
-                NativeDataAccess.setNativeMirrorDoubleData(store, index, value);
+                NativeDataAccess.setNativeMirrorDoubleData(accessIter.getStore(), index, value);
             }
         }
     }
@@ -281,14 +281,14 @@ public final class RDoubleVector extends RVector<double[]> implements RAbstractD
 
     private static final SlowPathFromDoubleAccess SLOW_PATH_ACCESS = new SlowPathFromDoubleAccess() {
         @Override
-        protected double getDouble(Object store, int index) {
-            RDoubleVector vector = (RDoubleVector) store;
+        protected double getDoubleImpl(AccessIterator accessIter, int index) {
+            RDoubleVector vector = (RDoubleVector) accessIter.getStore();
             return NativeDataAccess.getData(vector, vector.data, index);
         }
 
         @Override
-        protected void setDouble(Object store, int index, double value) {
-            RDoubleVector vector = (RDoubleVector) store;
+        protected void setDoubleImpl(AccessIterator accessIter, int index, double value) {
+            RDoubleVector vector = (RDoubleVector) accessIter.getStore();
             NativeDataAccess.setData(vector, vector.data, index, value);
         }
     };
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java
index 465a3ac018..3c1390961d 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java
@@ -101,13 +101,13 @@ public final class RExpression extends RListBase implements RAbstractVector {
         }
 
         @Override
-        protected Object getListElement(Object store, int index) {
-            return ((Object[]) store)[index];
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
+            return ((Object[]) accessIter.getStore())[index];
         }
 
         @Override
-        protected void setListElement(Object store, int index, Object value) {
-            ((Object[]) store)[index] = value;
+        protected void setListElementImpl(AccessIterator accessIter, int index, Object value) {
+            ((Object[]) accessIter.getStore())[index] = value;
         }
     }
 
@@ -123,13 +123,13 @@ public final class RExpression extends RListBase implements RAbstractVector {
         }
 
         @Override
-        protected Object getListElement(Object store, int index) {
-            return ((RExpression) store).data[index];
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
+            return ((RExpression) accessIter.getStore()).data[index];
         }
 
         @Override
-        protected void setListElement(Object store, int index, Object value) {
-            ((RExpression) store).data[index] = value;
+        protected void setListElementImpl(AccessIterator accessIter, int index, Object value) {
+            ((RExpression) accessIter.getStore()).data[index] = value;
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignBooleanWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignBooleanWrapper.java
index 34672246ef..19f249ac38 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignBooleanWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignBooleanWrapper.java
@@ -98,10 +98,10 @@ public final class RForeignBooleanWrapper extends RForeignWrapper implements RAb
         }
 
         @Override
-        protected byte getLogical(Object internalStore, int index) {
+        protected byte getLogicalImpl(AccessIterator accessIter, int index) {
             Object value = null;
             try {
-                value = ForeignAccess.sendRead(read, (TruffleObject) internalStore, index);
+                value = ForeignAccess.sendRead(read, (TruffleObject) accessIter.getStore(), index);
                 return RRuntime.asLogical((boolean) value);
             } catch (UnsupportedMessageException | UnknownIdentifierException e) {
                 throw RInternalError.shouldNotReachHere(e);
@@ -137,8 +137,8 @@ public final class RForeignBooleanWrapper extends RForeignWrapper implements RAb
         }
 
         @Override
-        protected byte getLogical(Object store, int index) {
-            RForeignBooleanWrapper vector = (RForeignBooleanWrapper) store;
+        protected byte getLogicalImpl(AccessIterator accessIter, int index) {
+            RForeignBooleanWrapper vector = (RForeignBooleanWrapper) accessIter.getStore();
             Object value = null;
             try {
                 value = ForeignAccess.sendRead(READ, vector.delegate, index);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignDoubleWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignDoubleWrapper.java
index 53bb922312..2ac611b017 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignDoubleWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignDoubleWrapper.java
@@ -101,10 +101,10 @@ public final class RForeignDoubleWrapper extends RForeignWrapper implements RAbs
         }
 
         @Override
-        protected double getDouble(Object internalStore, int index) {
+        protected double getDoubleImpl(AccessIterator accessIter, int index) {
             Object value = null;
             try {
-                value = ForeignAccess.sendRead(read, (TruffleObject) internalStore, index);
+                value = ForeignAccess.sendRead(read, (TruffleObject) accessIter.getStore(), index);
                 return ((Number) resultProfile.profile(value)).doubleValue();
             } catch (UnsupportedMessageException | UnknownIdentifierException e) {
                 throw RInternalError.shouldNotReachHere(e);
@@ -131,7 +131,7 @@ public final class RForeignDoubleWrapper extends RForeignWrapper implements RAbs
     private static final SlowPathFromDoubleAccess SLOW_PATH_ACCESS = new SlowPathFromDoubleAccess() {
         @Override
         @TruffleBoundary
-        protected int getLength(RAbstractContainer vector) {
+        public int getLength(RAbstractContainer vector) {
             try {
                 return (int) ForeignAccess.sendGetSize(GET_SIZE, ((RForeignDoubleWrapper) vector).delegate);
             } catch (UnsupportedMessageException e) {
@@ -140,8 +140,8 @@ public final class RForeignDoubleWrapper extends RForeignWrapper implements RAbs
         }
 
         @Override
-        protected double getDouble(Object store, int index) {
-            RForeignDoubleWrapper vector = (RForeignDoubleWrapper) store;
+        protected double getDoubleImpl(AccessIterator accessIter, int index) {
+            RForeignDoubleWrapper vector = (RForeignDoubleWrapper) accessIter.getStore();
             Object value = null;
             try {
                 value = ForeignAccess.sendRead(READ, vector.delegate, index);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignIntWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignIntWrapper.java
index aeaf0d95cb..b23b83f0b7 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignIntWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignIntWrapper.java
@@ -100,10 +100,10 @@ public final class RForeignIntWrapper extends RForeignWrapper implements RAbstra
         }
 
         @Override
-        protected int getInt(Object internalStore, int index) {
+        public int getIntImpl(AccessIterator accessIter, int index) {
             Object value = null;
             try {
-                value = ForeignAccess.sendRead(read, (TruffleObject) internalStore, index);
+                value = ForeignAccess.sendRead(read, (TruffleObject) accessIter.getStore(), index);
                 return ((Number) resultProfile.profile(value)).intValue();
             } catch (UnsupportedMessageException | UnknownIdentifierException e) {
                 throw RInternalError.shouldNotReachHere(e);
@@ -139,8 +139,8 @@ public final class RForeignIntWrapper extends RForeignWrapper implements RAbstra
         }
 
         @Override
-        protected int getInt(Object store, int index) {
-            RForeignIntWrapper vector = (RForeignIntWrapper) store;
+        public int getIntImpl(AccessIterator accessIter, int index) {
+            RForeignIntWrapper vector = (RForeignIntWrapper) accessIter.getStore();
             Object value = null;
             try {
                 value = ForeignAccess.sendRead(READ, vector.delegate, index);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignListWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignListWrapper.java
index da27c0e312..b69b3491ab 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignListWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignListWrapper.java
@@ -90,9 +90,9 @@ public final class RForeignListWrapper extends RForeignWrapper implements RAbstr
         }
 
         @Override
-        protected Object getListElement(Object internalStore, int index) {
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
             try {
-                return foreign2r.execute(ForeignAccess.sendRead(read, (TruffleObject) internalStore, index));
+                return foreign2r.execute(ForeignAccess.sendRead(read, (TruffleObject) accessIter.getStore(), index));
             } catch (UnsupportedMessageException | UnknownIdentifierException e) {
                 throw RInternalError.shouldNotReachHere(e);
             }
@@ -124,8 +124,8 @@ public final class RForeignListWrapper extends RForeignWrapper implements RAbstr
         }
 
         @Override
-        protected Object getListElement(Object store, int index) {
-            RForeignListWrapper vector = (RForeignListWrapper) store;
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
+            RForeignListWrapper vector = (RForeignListWrapper) accessIter.getStore();
             try {
                 return FOREIGN_TO_R.execute(ForeignAccess.sendRead(READ, vector.delegate, index));
             } catch (UnsupportedMessageException | UnknownIdentifierException e) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignNamedListWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignNamedListWrapper.java
index b96fdb87c1..a1955ae52e 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignNamedListWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignNamedListWrapper.java
@@ -103,9 +103,9 @@ public final class RForeignNamedListWrapper extends RForeignWrapper implements R
         }
 
         @Override
-        protected Object getListElement(Object internalStore, int index) {
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
             try {
-                RForeignNamedListWrapper wrapper = (RForeignNamedListWrapper) internalStore;
+                RForeignNamedListWrapper wrapper = (RForeignNamedListWrapper) accessIter.getStore();
                 return foreign2r.execute(ForeignAccess.sendRead(read, wrapper.delegate, wrapper.names.getDataAt(index)));
             } catch (UnsupportedMessageException | UnknownIdentifierException e) {
                 throw RInternalError.shouldNotReachHere(e);
@@ -133,8 +133,8 @@ public final class RForeignNamedListWrapper extends RForeignWrapper implements R
         }
 
         @Override
-        protected Object getListElement(Object store, int index) {
-            RForeignNamedListWrapper vector = (RForeignNamedListWrapper) store;
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
+            RForeignNamedListWrapper vector = (RForeignNamedListWrapper) accessIter.getStore();
             try {
                 return FOREIGN_TO_R.execute(ForeignAccess.sendRead(READ, vector.delegate, vector.names.getDataAt(index)));
             } catch (UnsupportedMessageException | UnknownIdentifierException e) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignStringWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignStringWrapper.java
index 2f57d6bae1..0474e32613 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignStringWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignStringWrapper.java
@@ -99,9 +99,9 @@ public final class RForeignStringWrapper extends RForeignWrapper implements RAbs
         }
 
         @Override
-        protected String getString(Object internalStore, int index) {
+        protected String getStringImpl(AccessIterator accessIter, int index) {
             try {
-                Object value = ForeignAccess.sendRead(read, (TruffleObject) internalStore, index);
+                Object value = ForeignAccess.sendRead(read, (TruffleObject) accessIter.getStore(), index);
                 if (isNullProfile.profile(value instanceof TruffleObject)) {
                     if (isNull == null) {
                         CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -136,8 +136,8 @@ public final class RForeignStringWrapper extends RForeignWrapper implements RAbs
 
         @Override
         @TruffleBoundary
-        protected String getString(Object store, int index) {
-            RForeignStringWrapper vector = (RForeignStringWrapper) store;
+        protected String getStringImpl(AccessIterator accessIter, int index) {
+            RForeignStringWrapper vector = (RForeignStringWrapper) accessIter.getStore();
             return RForeignStringWrapper.getString(vector.delegate, index);
         }
     };
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntSequence.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntSequence.java
index 5c8f3bba32..256ea5e8a6 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntSequence.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntSequence.java
@@ -155,8 +155,8 @@ public final class RIntSequence extends RSequence implements RAbstractIntVector
         }
 
         @Override
-        protected int getInt(Object store, int index) {
-            RIntSequence vector = (RIntSequence) store;
+        public int getIntImpl(AccessIterator accessIter, int index) {
+            RIntSequence vector = (RIntSequence) accessIter.getStore();
             assert index >= 0 && index < vector.getLength();
             return vector.start + vector.stride * index;
         }
@@ -169,8 +169,8 @@ public final class RIntSequence extends RSequence implements RAbstractIntVector
 
     private static final SlowPathFromIntAccess SLOW_PATH_ACCESS = new SlowPathFromIntAccess() {
         @Override
-        protected int getInt(Object store, int index) {
-            RIntSequence vector = (RIntSequence) store;
+        public int getIntImpl(AccessIterator accessIter, int index) {
+            RIntSequence vector = (RIntSequence) accessIter.getStore();
             assert index >= 0 && index < vector.getLength();
             return vector.start + vector.stride * index;
         }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java
index 3708566681..c0a84f0142 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java
@@ -268,16 +268,16 @@ public final class RIntVector extends RVector<int[]> implements RAbstractIntVect
         }
 
         @Override
-        protected int getInt(Object store, int index) {
-            return hasStore ? ((int[]) store)[index] : NativeDataAccess.getIntNativeMirrorData(store, index);
+        public int getIntImpl(AccessIterator accessIter, int index) {
+            return hasStore ? ((int[]) accessIter.getStore())[index] : NativeDataAccess.getIntNativeMirrorData(accessIter.getStore(), index);
         }
 
         @Override
-        protected void setInt(Object store, int index, int value) {
+        protected void setIntImpl(AccessIterator accessIter, int index, int value) {
             if (hasStore) {
-                ((int[]) store)[index] = value;
+                ((int[]) accessIter.getStore())[index] = value;
             } else {
-                NativeDataAccess.setNativeMirrorIntData(store, index, value);
+                NativeDataAccess.setNativeMirrorIntData(accessIter.getStore(), index, value);
             }
         }
     }
@@ -289,14 +289,14 @@ public final class RIntVector extends RVector<int[]> implements RAbstractIntVect
 
     private static final SlowPathFromIntAccess SLOW_PATH_ACCESS = new SlowPathFromIntAccess() {
         @Override
-        protected int getInt(Object store, int index) {
-            RIntVector vector = (RIntVector) store;
+        public int getIntImpl(AccessIterator accessIter, int index) {
+            RIntVector vector = (RIntVector) accessIter.getStore();
             return NativeDataAccess.getData(vector, vector.data, index);
         }
 
         @Override
-        protected void setInt(Object store, int index, int value) {
-            RIntVector vector = (RIntVector) store;
+        protected void setIntImpl(AccessIterator accessIter, int index, int value) {
+            RIntVector vector = (RIntVector) accessIter.getStore();
             NativeDataAccess.setData(vector, vector.data, index, value);
         }
     };
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RInteger.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RInteger.java
index 65b53d5257..9809835273 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RInteger.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RInteger.java
@@ -107,9 +107,9 @@ public final class RInteger extends RScalarVector implements RAbstractIntVector
         }
 
         @Override
-        protected int getInt(Object store, int index) {
+        public int getIntImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RInteger) store).value;
+            return ((RInteger) accessIter.getStore()).value;
         }
     }
 
@@ -120,9 +120,9 @@ public final class RInteger extends RScalarVector implements RAbstractIntVector
 
     private static final SlowPathFromIntAccess SLOW_PATH_ACCESS = new SlowPathFromIntAccess() {
         @Override
-        protected int getInt(Object store, int index) {
+        public int getIntImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RInteger) store).value;
+            return ((RInteger) accessIter.getStore()).value;
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java
index 56c828ceec..25f8af5e9d 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java
@@ -105,13 +105,13 @@ public final class RList extends RListBase implements RAbstractListVector {
         }
 
         @Override
-        protected Object getListElement(Object store, int index) {
-            return ((Object[]) store)[index];
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
+            return ((Object[]) accessIter.getStore())[index];
         }
 
         @Override
-        protected void setListElement(Object store, int index, Object value) {
-            ((Object[]) store)[index] = value;
+        protected void setListElementImpl(AccessIterator accessIter, int index, Object value) {
+            ((Object[]) accessIter.getStore())[index] = value;
         }
     }
 
@@ -127,13 +127,13 @@ public final class RList extends RListBase implements RAbstractListVector {
         }
 
         @Override
-        protected Object getListElement(Object store, int index) {
-            return ((RList) store).data[index];
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
+            return ((RList) accessIter.getStore()).data[index];
         }
 
         @Override
-        protected void setListElement(Object store, int index, Object value) {
-            ((RList) store).data[index] = value;
+        protected void setListElementImpl(AccessIterator accessIter, int index, Object value) {
+            ((RList) accessIter.getStore()).data[index] = value;
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogical.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogical.java
index 06d75e55ba..fad3456263 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogical.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogical.java
@@ -117,9 +117,9 @@ public final class RLogical extends RScalarVector implements RAbstractLogicalVec
         }
 
         @Override
-        protected byte getLogical(Object store, int index) {
+        protected byte getLogicalImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RLogical) store).value;
+            return ((RLogical) accessIter.getStore()).value;
         }
     }
 
@@ -130,9 +130,9 @@ public final class RLogical extends RScalarVector implements RAbstractLogicalVec
 
     private static final SlowPathFromLogicalAccess SLOW_PATH_ACCESS = new SlowPathFromLogicalAccess() {
         @Override
-        protected byte getLogical(Object store, int index) {
+        protected byte getLogicalImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RLogical) store).value;
+            return ((RLogical) accessIter.getStore()).value;
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java
index 89d03dfac1..f8b7cd4daa 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java
@@ -271,16 +271,16 @@ public final class RLogicalVector extends RVector<byte[]> implements RAbstractLo
         }
 
         @Override
-        protected byte getLogical(Object store, int index) {
-            return hasStore ? ((byte[]) store)[index] : NativeDataAccess.getLogicalNativeMirrorData(store, index);
+        protected byte getLogicalImpl(AccessIterator accessIter, int index) {
+            return hasStore ? ((byte[]) accessIter.getStore())[index] : NativeDataAccess.getLogicalNativeMirrorData(accessIter.getStore(), index);
         }
 
         @Override
-        protected void setLogical(Object store, int index, byte value) {
+        protected void setLogicalImpl(AccessIterator accessIter, int index, byte value) {
             if (hasStore) {
-                ((byte[]) store)[index] = value;
+                ((byte[]) accessIter.getStore())[index] = value;
             } else {
-                NativeDataAccess.setNativeMirrorLogicalData(store, index, value);
+                NativeDataAccess.setNativeMirrorLogicalData(accessIter.getStore(), index, value);
             }
         }
     }
@@ -292,14 +292,14 @@ public final class RLogicalVector extends RVector<byte[]> implements RAbstractLo
 
     private static final SlowPathFromLogicalAccess SLOW_PATH_ACCESS = new SlowPathFromLogicalAccess() {
         @Override
-        protected byte getLogical(Object store, int index) {
-            RLogicalVector vector = (RLogicalVector) store;
+        protected byte getLogicalImpl(AccessIterator accessIter, int index) {
+            RLogicalVector vector = (RLogicalVector) accessIter.getStore();
             return NativeDataAccess.getData(vector, vector.data, index);
         }
 
         @Override
-        protected void setLogical(Object store, int index, byte value) {
-            RLogicalVector vector = (RLogicalVector) store;
+        protected void setLogicalImpl(AccessIterator accessIter, int index, byte value) {
+            RLogicalVector vector = (RLogicalVector) accessIter.getStore();
             NativeDataAccess.setData(vector, vector.data, index, value);
         }
     };
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
index 0224299f8a..98a32869ba 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
@@ -907,8 +907,8 @@ public final class RPairList extends RSharingAttributeStorage implements RAbstra
 
         @TruffleBoundary
         @Override
-        protected Object getListElement(Object store, int index) {
-            return ((RPairList) store).getDataAtAsObject(index);
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
+            return ((RPairList) accessIter.getStore()).getDataAtAsObject(index);
         }
     }
 
@@ -925,8 +925,8 @@ public final class RPairList extends RSharingAttributeStorage implements RAbstra
 
         @TruffleBoundary
         @Override
-        protected Object getListElement(Object store, int index) {
-            return ((RPairList) store).getDataAtAsObject(index);
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
+            return ((RPairList) accessIter.getStore()).getDataAtAsObject(index);
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRaw.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRaw.java
index 6c446e393e..ef67dbd5f1 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRaw.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRaw.java
@@ -111,9 +111,9 @@ public final class RRaw extends RScalarVector implements RAbstractRawVector {
         }
 
         @Override
-        protected byte getRaw(Object store, int index) {
+        protected byte getRawImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RRaw) store).value;
+            return ((RRaw) accessIter.getStore()).value;
         }
     }
 
@@ -124,9 +124,9 @@ public final class RRaw extends RScalarVector implements RAbstractRawVector {
 
     private static final SlowPathFromRawAccess SLOW_PATH_ACCESS = new SlowPathFromRawAccess() {
         @Override
-        protected byte getRaw(Object store, int index) {
+        protected byte getRawImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RRaw) store).value;
+            return ((RRaw) accessIter.getStore()).value;
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java
index 6351586527..eab92e7900 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java
@@ -224,16 +224,16 @@ public final class RRawVector extends RVector<byte[]> implements RAbstractRawVec
         }
 
         @Override
-        protected byte getRaw(Object store, int index) {
-            return hasStore ? ((byte[]) store)[index] : NativeDataAccess.getRawNativeMirrorData(store, index);
+        protected byte getRawImpl(AccessIterator accessIter, int index) {
+            return hasStore ? ((byte[]) accessIter.getStore())[index] : NativeDataAccess.getRawNativeMirrorData(accessIter.getStore(), index);
         }
 
         @Override
-        protected void setRaw(Object store, int index, byte value) {
+        protected void setRawImpl(AccessIterator accessIter, int index, byte value) {
             if (hasStore) {
-                ((byte[]) store)[index] = value;
+                ((byte[]) accessIter.getStore())[index] = value;
             } else {
-                NativeDataAccess.setNativeMirrorRawData(store, index, value);
+                NativeDataAccess.setNativeMirrorRawData(accessIter.getStore(), index, value);
             }
         }
     }
@@ -245,14 +245,14 @@ public final class RRawVector extends RVector<byte[]> implements RAbstractRawVec
 
     private static final SlowPathFromRawAccess SLOW_PATH_ACCESS = new SlowPathFromRawAccess() {
         @Override
-        protected byte getRaw(Object store, int index) {
-            RRawVector vector = (RRawVector) store;
+        protected byte getRawImpl(AccessIterator accessIter, int index) {
+            RRawVector vector = (RRawVector) accessIter.getStore();
             return NativeDataAccess.getData(vector, vector.data, index);
         }
 
         @Override
-        protected void setRaw(Object store, int index, byte value) {
-            RRawVector vector = (RRawVector) store;
+        protected void setRawImpl(AccessIterator accessIter, int index, byte value) {
+            RRawVector vector = (RRawVector) accessIter.getStore();
             NativeDataAccess.setData(vector, vector.data, index, value);
         }
     };
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarList.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarList.java
index da6bd5251a..d29dfd45d6 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarList.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarList.java
@@ -104,9 +104,9 @@ public final class RScalarList extends RScalarVector implements RAbstractListVec
         }
 
         @Override
-        protected Object getListElement(Object store, int index) {
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RScalarList) store).value;
+            return ((RScalarList) accessIter.getStore()).value;
         }
     }
 
@@ -122,9 +122,9 @@ public final class RScalarList extends RScalarVector implements RAbstractListVec
         }
 
         @Override
-        protected Object getListElement(Object store, int index) {
+        protected Object getListElementImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RScalarList) store).value;
+            return ((RScalarList) accessIter.getStore()).value;
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RString.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RString.java
index c1df09a38e..cd3f0f98f1 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RString.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RString.java
@@ -107,9 +107,9 @@ public final class RString extends RScalarVector implements RAbstractStringVecto
         }
 
         @Override
-        protected String getString(Object store, int index) {
+        protected String getStringImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RString) store).value;
+            return ((RString) accessIter.getStore()).value;
         }
     }
 
@@ -120,9 +120,9 @@ public final class RString extends RScalarVector implements RAbstractStringVecto
 
     private static final SlowPathFromStringAccess SLOW_PATH_ACCESS = new SlowPathFromStringAccess() {
         @Override
-        protected String getString(Object store, int index) {
+        protected String getStringImpl(AccessIterator accessIter, int index) {
             assert index == 0;
-            return ((RString) store).value;
+            return ((RString) accessIter.getStore()).value;
         }
     };
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringSequence.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringSequence.java
index 41fd741fb8..bf7a8cfb42 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringSequence.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringSequence.java
@@ -180,8 +180,8 @@ public final class RStringSequence extends RSequence implements RAbstractStringV
         }
 
         @Override
-        protected String getString(Object store, int index) {
-            RStringSequence vector = (RStringSequence) store;
+        protected String getStringImpl(AccessIterator accessIter, int index) {
+            RStringSequence vector = (RStringSequence) accessIter.getStore();
             assert index >= 0 && index < vector.getLength();
             return vector.prefix + (vector.start + vector.stride * index) + vector.suffix;
         }
@@ -194,8 +194,8 @@ public final class RStringSequence extends RSequence implements RAbstractStringV
 
     private static final SlowPathFromStringAccess SLOW_PATH_ACCESS = new SlowPathFromStringAccess() {
         @Override
-        protected String getString(Object store, int index) {
-            RStringSequence vector = (RStringSequence) store;
+        protected String getStringImpl(AccessIterator accessIter, int index) {
+            RStringSequence vector = (RStringSequence) accessIter.getStore();
             assert index >= 0 && index < vector.getLength();
             return vector.prefix + (vector.start + vector.stride * index) + vector.suffix;
         }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java
index 88e9d0147a..4978a564fd 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java
@@ -39,6 +39,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFromStringAccess;
 import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromStringAccess;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
+import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.AccessIterator;
 import com.oracle.truffle.r.runtime.ops.na.NACheck;
 
 public final class RStringVector extends RVector<Object[]> implements RAbstractStringVector {
@@ -345,22 +346,22 @@ public final class RStringVector extends RVector<Object[]> implements RAbstractS
         }
 
         @Override
-        protected String getString(Object store, int index) {
+        protected String getStringImpl(AccessIterator accessIter, int index) {
             assert hasStore;
             if (containsWrappers) {
-                return ((CharSXPWrapper[]) store)[index].getContents();
+                return ((CharSXPWrapper[]) accessIter.getStore())[index].getContents();
             } else {
-                return ((String[]) store)[index];
+                return ((String[]) accessIter.getStore())[index];
             }
         }
 
         @Override
-        protected void setString(Object store, int index, String value) {
+        protected void setStringImpl(AccessIterator accessIter, int index, String value) {
             assert hasStore;
             if (containsWrappers) {
-                ((CharSXPWrapper[]) store)[index] = CharSXPWrapper.create(value);
+                ((CharSXPWrapper[]) accessIter.getStore())[index] = CharSXPWrapper.create(value);
             } else {
-                ((String[]) store)[index] = value;
+                ((String[]) accessIter.getStore())[index] = value;
             }
         }
     }
@@ -372,12 +373,13 @@ public final class RStringVector extends RVector<Object[]> implements RAbstractS
 
     private static final SlowPathFromStringAccess SLOW_PATH_ACCESS = new SlowPathFromStringAccess() {
         @Override
-        protected String getString(Object store, int index) {
-            return ((RStringVector) store).getDataAt(index);
+        protected String getStringImpl(AccessIterator accessIter, int index) {
+            return ((RStringVector) accessIter.getStore()).getDataAt(index);
         }
 
         @Override
-        protected void setString(Object store, int index, String value) {
+        protected void setStringImpl(AccessIterator accessIter, int index, String value) {
+            Object store = accessIter.getStore();
             ((RStringVector) store).setDataAt(((RStringVector) store).getInternalStore(), index, value);
         }
     };
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToComplexVectorClosure.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToComplexVectorClosure.java
index dad86be84d..fe362d62d4 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToComplexVectorClosure.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToComplexVectorClosure.java
@@ -35,6 +35,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFromComplexAccess;
 import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromComplexAccess;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
+import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.AccessIterator;
 
 class RToComplexVectorClosure extends RToVectorClosure implements RAbstractComplexVector {
 
@@ -89,26 +90,26 @@ class RToComplexVectorClosure extends RToVectorClosure implements RAbstractCompl
     private static final SlowPathFromComplexAccess SLOW_PATH_ACCESS = new SlowPathFromComplexAccess() {
 
         @Override
-        protected RComplex getComplex(Object store, int index) {
-            RToComplexVectorClosure vector = (RToComplexVectorClosure) store;
+        protected RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            RToComplexVectorClosure vector = (RToComplexVectorClosure) accessIter.getStore();
             return vector.getDataAt(index);
         }
 
         @Override
-        protected double getComplexR(Object store, int index) {
-            RToComplexVectorClosure vector = (RToComplexVectorClosure) store;
+        protected double getComplexRImpl(AccessIterator accessIter, int index) {
+            RToComplexVectorClosure vector = (RToComplexVectorClosure) accessIter.getStore();
             return vector.getDataAt(index).getRealPart();
         }
 
         @Override
-        protected double getComplexI(Object store, int index) {
-            RToComplexVectorClosure vector = (RToComplexVectorClosure) store;
+        protected double getComplexIImpl(AccessIterator accessIter, int index) {
+            RToComplexVectorClosure vector = (RToComplexVectorClosure) accessIter.getStore();
             return vector.getDataAt(index).getImaginaryPart();
         }
 
         @Override
-        protected void setComplex(Object store, int index, double real, double imaginary) {
-            RToComplexVectorClosure vector = (RToComplexVectorClosure) store;
+        protected void setComplexImpl(AccessIterator accessIter, int index, double real, double imaginary) {
+            RToComplexVectorClosure vector = (RToComplexVectorClosure) accessIter.getStore();
             vector.setDataAt(vector.getInternalStore(), index, RComplex.valueOf(real, imaginary));
         }
     };
@@ -163,22 +164,22 @@ class RToComplexVectorClosure extends RToVectorClosure implements RAbstractCompl
         }
 
         @Override
-        protected RComplex getComplex(Object store, int index) {
+        protected RComplex getComplexImpl(AccessIterator accessIterator, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected double getComplexR(Object store, int index) {
+        protected double getComplexRImpl(AccessIterator accessIterator, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected double getComplexI(Object store, int index) {
+        protected double getComplexIImpl(AccessIterator accessIterator, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected void setComplex(Object store, int index, double real, double imaginary) {
+        protected void setComplexImpl(AccessIterator accessIterator, int index, double real, double imaginary) {
             throw RInternalError.shouldNotReachHere();
         }
     }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToDoubleVectorClosure.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToDoubleVectorClosure.java
index 226a1ae9af..42296c572c 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToDoubleVectorClosure.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToDoubleVectorClosure.java
@@ -33,8 +33,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFromDoubleAccess;
 import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromDoubleAccess;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
-import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.SequentialIterator;
-import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.RandomIterator;
+import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.AccessIterator;
 
 class RToDoubleVectorClosure extends RToVectorClosure implements RAbstractDoubleVector {
 
@@ -86,14 +85,14 @@ class RToDoubleVectorClosure extends RToVectorClosure implements RAbstractDouble
 
     private static final SlowPathFromDoubleAccess SLOW_PATH_ACCESS = new SlowPathFromDoubleAccess() {
         @Override
-        protected double getDouble(Object store, int index) {
-            RToDoubleVectorClosure vector = (RToDoubleVectorClosure) store;
+        protected double getDoubleImpl(AccessIterator accessIter, int index) {
+            RToDoubleVectorClosure vector = (RToDoubleVectorClosure) accessIter.getStore();
             return vector.getDataAt(index);
         }
 
         @Override
-        protected void setDouble(Object store, int index, double value) {
-            RToDoubleVectorClosure vector = (RToDoubleVectorClosure) store;
+        protected void setDoubleImpl(AccessIterator accessIter, int index, double value) {
+            RToDoubleVectorClosure vector = (RToDoubleVectorClosure) accessIter.getStore();
             vector.setDataAt(vector.getInternalStore(), index, value);
         }
     };
@@ -128,12 +127,12 @@ class RToDoubleVectorClosure extends RToVectorClosure implements RAbstractDouble
         }
 
         @Override
-        protected double getDouble(Object store, int index) {
+        protected double getDoubleImpl(AccessIterator accessIterator, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected void setDouble(Object store, int index, double value) {
+        protected void setDoubleImpl(AccessIterator accessIterator, int index, double value) {
             throw RInternalError.shouldNotReachHere();
         }
     }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToIntVectorClosure.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToIntVectorClosure.java
index 25f34d447e..c1b8ab60c4 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToIntVectorClosure.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToIntVectorClosure.java
@@ -34,8 +34,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFromIntAccess;
 import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromIntAccess;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
-import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.RandomIterator;
-import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.SequentialIterator;
+import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.AccessIterator;
 
 class RToIntVectorClosure extends RToVectorClosure implements RAbstractIntVector {
 
@@ -87,14 +86,14 @@ class RToIntVectorClosure extends RToVectorClosure implements RAbstractIntVector
 
     private static final SlowPathFromIntAccess SLOW_PATH_ACCESS = new SlowPathFromIntAccess() {
         @Override
-        protected int getInt(Object store, int index) {
-            RToIntVectorClosure vector = (RToIntVectorClosure) store;
+        protected int getIntImpl(AccessIterator accessIter, int index) {
+            RToIntVectorClosure vector = (RToIntVectorClosure) accessIter.getStore();
             return vector.getDataAt(index);
         }
 
         @Override
-        protected void setInt(Object store, int index, int value) {
-            RToIntVectorClosure vector = (RToIntVectorClosure) store;
+        protected void setIntImpl(AccessIterator accessIter, int index, int value) {
+            RToIntVectorClosure vector = (RToIntVectorClosure) accessIter.getStore();
             vector.setDataAt(vector.getInternalStore(), index, value);
         }
     };
@@ -129,12 +128,12 @@ class RToIntVectorClosure extends RToVectorClosure implements RAbstractIntVector
         }
 
         @Override
-        protected int getInt(Object store, int index) {
+        protected int getIntImpl(AccessIterator accessIterator, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected void setInt(Object store, int index, int value) {
+        protected void setIntImpl(AccessIterator accessIterator, int index, int value) {
             throw RInternalError.shouldNotReachHere();
         }
     }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToStringVectorClosure.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToStringVectorClosure.java
index 05009742e2..a4f6f45dbe 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToStringVectorClosure.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToStringVectorClosure.java
@@ -38,8 +38,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFromStringAccess;
 import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromStringAccess;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
-import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.RandomIterator;
-import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.SequentialIterator;
+import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.AccessIterator;
 
 class RToStringVectorClosure extends RToVectorClosure implements RAbstractStringVector {
 
@@ -90,14 +89,14 @@ class RToStringVectorClosure extends RToVectorClosure implements RAbstractString
 
     private static final SlowPathFromStringAccess SLOW_PATH_ACCESS = new SlowPathFromStringAccess() {
         @Override
-        protected String getString(Object store, int index) {
-            RToStringVectorClosure vector = (RToStringVectorClosure) store;
+        protected String getStringImpl(AccessIterator accessIter, int index) {
+            RToStringVectorClosure vector = (RToStringVectorClosure) accessIter.getStore();
             return vector.getDataAt(index);
         }
 
         @Override
-        protected void setString(Object store, int index, String value) {
-            RToStringVectorClosure vector = (RToStringVectorClosure) store;
+        protected void setStringImpl(AccessIterator accessIter, int index, String value) {
+            RToStringVectorClosure vector = (RToStringVectorClosure) accessIter.getStore();
             vector.setDataAt(vector.getInternalStore(), index, value);
         }
     };
@@ -132,12 +131,12 @@ class RToStringVectorClosure extends RToVectorClosure implements RAbstractString
         }
 
         @Override
-        protected String getString(Object store, int index) {
+        protected String getStringImpl(AccessIterator accessIterator, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected void setString(Object store, int index, String value) {
+        protected void setStringImpl(AccessIterator accessIterator, int index, String value) {
             throw RInternalError.shouldNotReachHere();
         }
     }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/FastPathVectorAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/FastPathVectorAccess.java
index f2d7af69d3..a661fce629 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/FastPathVectorAccess.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/FastPathVectorAccess.java
@@ -23,7 +23,6 @@
 package com.oracle.truffle.r.runtime.data.nodes;
 
 import com.oracle.truffle.api.profiles.BranchProfile;
-import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RError.Message;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -42,8 +41,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
  */
 public abstract class FastPathVectorAccess extends VectorAccess {
 
-    protected boolean naReported; // TODO: move this into the iterator
-    private final BranchProfile warningReportedProfile = BranchProfile.create();
+    protected final BranchProfile warningReportedProfile = BranchProfile.create();
 
     protected FastPathVectorAccess(Object value) {
         super(value.getClass(), value instanceof RAbstractContainer ? ((RAbstractContainer) value).getInternalStore() != null : true);
@@ -54,14 +52,6 @@ public abstract class FastPathVectorAccess extends VectorAccess {
         return hasStore ? vector.getInternalStore() : ((RVector<?>) vector).getNativeMirror();
     }
 
-    protected final void warning(RError.Message message) {
-        if (!naReported) {
-            warningReportedProfile.enter();
-            RError.warning(RError.SHOW_CALLER, message);
-            naReported = true;
-        }
-    }
-
     public abstract static class FastPathFromIntAccess extends FastPathVectorAccess {
 
         public FastPathFromIntAccess(Object value) {
@@ -74,75 +64,77 @@ public abstract class FastPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            int value = getInt(store, index);
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.DOUBLE_NA : RRuntime.int2doubleNoCheck(value);
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            int value = getInt(store, index);
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             byte result = (byte) value;
             if ((result & 0xff) != value) {
-                warning(Message.OUT_OF_RANGE);
+                if (accessIter.warning(Message.OUT_OF_RANGE)) {
+                    warningReportedProfile.enter();
+                }
                 return 0;
             }
             return result;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            int value = getInt(store, index);
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.LOGICAL_NA : RRuntime.int2logicalNoCheck(value);
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            int value = getInt(store, index);
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RComplex.createNA() : RRuntime.int2complexNoCheck(value);
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            int value = getInt(store, index);
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_REAL_PART : value;
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
-            int value = getInt(store, index);
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_IMAGINARY_PART : 0;
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            int value = getInt(store, index);
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.STRING_NA : RRuntime.intToStringNoCheck(value);
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getInt(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getIntImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setInt(store, index, sourceAccess.getInt(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setIntImpl(accessIter, index, sourceAccess.getInt(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setInt(store, index, sourceAccess.getInt(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setIntImpl(accessIter, index, sourceAccess.getInt(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setInt(store, index, RRuntime.INT_NA);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setIntImpl(accessIter, index, RRuntime.INT_NA);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getInt(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getIntImpl(accessIter, index));
         }
     }
 
@@ -158,84 +150,88 @@ public abstract class FastPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             if (Double.isNaN(value)) {
                 na.enable(true);
                 return RRuntime.INT_NA;
             }
             if (value > Integer.MAX_VALUE || value <= Integer.MIN_VALUE) {
                 na.enable(true);
-                warning(Message.NA_INTRODUCED_COERCION_INT);
+                if (accessIter.warning(Message.NA_INTRODUCED_COERCION_INT)) {
+                    warningReportedProfile.enter();
+                }
                 return RRuntime.INT_NA;
             }
             return (int) value;
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            int value = (int) getDouble(store, index);
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            int value = (int) getDoubleImpl(accessIter, index);
             byte result = (byte) value;
             if ((result & 0xff) != value) {
-                warning(Message.OUT_OF_RANGE);
+                if (accessIter.warning(Message.OUT_OF_RANGE)) {
+                    warningReportedProfile.enter();
+                }
                 return 0;
             }
             return result;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RRuntime.LOGICAL_NA : RRuntime.double2logicalNoCheck(value);
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RComplex.createNA() : RRuntime.double2complexNoCheck(value);
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_REAL_PART : value;
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_IMAGINARY_PART : 0;
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RRuntime.STRING_NA : RContext.getRRuntimeASTAccess().encodeDouble(value);
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getDouble(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getDoubleImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setDouble(store, index, sourceAccess.getDouble(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setDoubleImpl(accessIter, index, sourceAccess.getDouble(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setDouble(store, index, sourceAccess.getDouble(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setDoubleImpl(accessIter, index, sourceAccess.getDouble(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setDouble(store, index, RRuntime.DOUBLE_NA);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setDoubleImpl(accessIter, index, RRuntime.DOUBLE_NA);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getDouble(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getDoubleImpl(accessIter, index));
         }
     }
 
@@ -251,74 +247,76 @@ public abstract class FastPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.INT_NA : RRuntime.logical2intNoCheck(value);
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.DOUBLE_NA : RRuntime.logical2doubleNoCheck(value);
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             if (na.check(value)) {
-                warning(Message.OUT_OF_RANGE);
+                if (accessIter.warning(Message.OUT_OF_RANGE)) {
+                    warningReportedProfile.enter();
+                }
                 return 0;
             }
             return value;
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RComplex.createNA() : RRuntime.logical2complexNoCheck(value);
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_REAL_PART : value;
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_IMAGINARY_PART : 0;
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.STRING_NA : RRuntime.logicalToStringNoCheck(value);
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getLogical(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getLogicalImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setLogical(store, index, sourceAccess.getLogical(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setLogicalImpl(accessIter, index, sourceAccess.getLogical(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setLogical(store, index, sourceAccess.getLogical(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setLogicalImpl(accessIter, index, sourceAccess.getLogical(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setLogical(store, index, RRuntime.LOGICAL_NA);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setLogicalImpl(accessIter, index, RRuntime.LOGICAL_NA);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getLogical(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getLogicalImpl(accessIter, index));
         }
     }
 
@@ -334,65 +332,65 @@ public abstract class FastPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            return getRaw(store, index) & 0xff;
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            return getRawImpl(accessIter, index) & 0xff;
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            return getRaw(store, index) & 0xff;
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            return getRawImpl(accessIter, index) & 0xff;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            return getRaw(store, index) == 0 ? RRuntime.LOGICAL_FALSE : RRuntime.LOGICAL_TRUE;
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            return getRawImpl(accessIter, index) == 0 ? RRuntime.LOGICAL_FALSE : RRuntime.LOGICAL_TRUE;
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            return RComplex.valueOf(getRaw(store, index) & 0xff, 0);
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            return RComplex.valueOf(getRawImpl(accessIter, index) & 0xff, 0);
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            return getRaw(store, index) & 0xff;
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            return getRawImpl(accessIter, index) & 0xff;
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
             return 0;
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            return RRuntime.rawToHexString(getRaw(store, index));
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            return RRuntime.rawToHexString(getRawImpl(accessIter, index));
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return RRaw.valueOf(getRaw(store, index));
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return RRaw.valueOf(getRawImpl(accessIter, index));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setRaw(store, index, sourceAccess.getRaw(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setRawImpl(accessIter, index, sourceAccess.getRaw(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setRaw(store, index, sourceAccess.getRaw(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setRawImpl(accessIter, index, sourceAccess.getRaw(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
+        protected void setNAImpl(AccessIterator accessIter, int index) {
             /*
              * There is no raw NA, but places that write NA for other types usually write 0 for raw.
              */
-            setRaw(store, index, (byte) 0);
+            setRawImpl(accessIter, index, (byte) 0);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
             return false;
         }
     }
@@ -409,84 +407,94 @@ public abstract class FastPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            double value = getComplexR(store, index);
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            double value = getComplexRImpl(accessIter, index);
             if (Double.isNaN(value)) {
                 na.enable(true);
                 return RRuntime.INT_NA;
             }
             if (value > Integer.MAX_VALUE || value <= Integer.MIN_VALUE) {
                 na.enable(true);
-                warning(Message.NA_INTRODUCED_COERCION_INT);
+                if (accessIter.warning(Message.NA_INTRODUCED_COERCION_INT)) {
+                    warningReportedProfile.enter();
+                }
                 return RRuntime.INT_NA;
             }
-            if (getComplexI(store, index) != 0) {
-                warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION);
+            if (getComplexIImpl(accessIter, index) != 0) {
+                if (accessIter.warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION)) {
+                    warningReportedProfile.enter();
+                }
             }
             return (int) value;
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            double value = getComplexR(store, index);
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            double value = getComplexRImpl(accessIter, index);
             if (Double.isNaN(value)) {
                 na.enable(true);
                 return RRuntime.DOUBLE_NA;
             }
-            if (getComplexI(store, index) != 0) {
-                warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION);
+            if (getComplexIImpl(accessIter, index) != 0) {
+                if (accessIter.warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION)) {
+                    warningReportedProfile.enter();
+                }
             }
             return value;
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            double value = getComplexR(store, index);
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            double value = getComplexRImpl(accessIter, index);
             if (Double.isNaN(value) || value < 0 || value >= 256) {
-                warning(Message.OUT_OF_RANGE);
+                if (accessIter.warning(Message.OUT_OF_RANGE)) {
+                    warningReportedProfile.enter();
+                }
                 return 0;
             }
-            if (getComplexI(store, index) != 0) {
-                warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION);
+            if (getComplexIImpl(accessIter, index) != 0) {
+                if (accessIter.warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION)) {
+                    warningReportedProfile.enter();
+                }
             }
             return (byte) value;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            RComplex value = getComplex(store, index);
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            RComplex value = getComplexImpl(accessIter, index);
             return na.check(value) ? RRuntime.LOGICAL_NA : RRuntime.complex2logicalNoCheck(value);
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            RComplex value = getComplex(store, index);
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            RComplex value = getComplexImpl(accessIter, index);
             return na.check(value) ? RRuntime.STRING_NA : RContext.getRRuntimeASTAccess().encodeComplex(value);
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getComplex(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getComplexImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setComplex(store, index, sourceAccess.getComplexR(sourceIter), sourceAccess.getComplexI(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setComplexImpl(accessIter, index, sourceAccess.getComplexR(sourceIter), sourceAccess.getComplexI(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setComplex(store, index, sourceAccess.getComplexR(sourceIter, sourceIndex), sourceAccess.getComplexI(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setComplexImpl(accessIter, index, sourceAccess.getComplexR(sourceIter, sourceIndex), sourceAccess.getComplexI(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setComplex(store, index, RRuntime.COMPLEX_NA_REAL_PART, RRuntime.COMPLEX_NA_IMAGINARY_PART);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setComplexImpl(accessIter, index, RRuntime.COMPLEX_NA_REAL_PART, RRuntime.COMPLEX_NA_IMAGINARY_PART);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getComplexR(store, index), getComplexI(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getComplexRImpl(accessIter, index), getComplexIImpl(accessIter, index));
         }
     }
 
@@ -502,64 +510,64 @@ public abstract class FastPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            return na.convertStringToInt(getString(store, index));
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToInt(getStringImpl(accessIter, index));
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            return na.convertStringToDouble(getString(store, index));
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToDouble(getStringImpl(accessIter, index));
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            int value = na.convertStringToInt(getString(store, index));
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            int value = na.convertStringToInt(getStringImpl(accessIter, index));
             return value >= 0 && value <= 255 ? (byte) value : 0;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            return na.convertStringToLogical(getString(store, index));
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToLogical(getStringImpl(accessIter, index));
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            return na.convertStringToComplex(getString(store, index));
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToComplex(getStringImpl(accessIter, index));
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            return na.convertStringToComplex(getString(store, index)).getRealPart();
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToComplex(getStringImpl(accessIter, index)).getRealPart();
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
-            return na.convertStringToComplex(getString(store, index)).getImaginaryPart();
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToComplex(getStringImpl(accessIter, index)).getImaginaryPart();
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getString(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getStringImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setString(store, index, sourceAccess.getString(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setStringImpl(accessIter, index, sourceAccess.getString(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setString(store, index, sourceAccess.getString(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setStringImpl(accessIter, index, sourceAccess.getString(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setString(store, index, RRuntime.STRING_NA);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setStringImpl(accessIter, index, RRuntime.STRING_NA);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getString(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getStringImpl(accessIter, index));
         }
     }
 
@@ -570,67 +578,67 @@ public abstract class FastPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final String getString(Object store, int index) {
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setListElement(store, index, sourceAccess.getListElement(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setListElementImpl(accessIter, index, sourceAccess.getListElement(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setListElement(store, index, sourceAccess.getListElement(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setListElementImpl(accessIter, index, sourceAccess.getListElement(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
+        protected void setNAImpl(AccessIterator accessIter, int index) {
             /*
              * There is no list NA, but places that write NA for other types usually write NULL for
              * lists.
              */
-            setListElement(store, index, RNull.instance);
+            setListElementImpl(accessIter, index, RNull.instance);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.checkListElement(getListElement(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.checkListElement(getListElementImpl(accessIter, index));
         }
     }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/PrimitiveVectorAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/PrimitiveVectorAccess.java
index a35e5d98ae..8cf5ed631e 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/PrimitiveVectorAccess.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/PrimitiveVectorAccess.java
@@ -42,29 +42,29 @@ public abstract class PrimitiveVectorAccess {
         if (value instanceof Integer) {
             return new FastPathFromIntAccess(value) {
                 @Override
-                protected int getInt(Object store, int index) {
-                    return (Integer) store;
+                public int getIntImpl(AccessIterator accessIter, int index) {
+                    return (Integer) accessIter.getStore();
                 }
             };
         } else if (value instanceof Double) {
             return new FastPathFromDoubleAccess(value) {
                 @Override
-                protected double getDouble(Object store, int index) {
-                    return (Double) store;
+                public double getDoubleImpl(AccessIterator accessIter, int index) {
+                    return (Double) accessIter.getStore();
                 }
             };
         } else if (value instanceof Byte) {
             return new FastPathFromLogicalAccess(value) {
                 @Override
-                protected byte getLogical(Object store, int index) {
-                    return (Byte) store;
+                public byte getLogicalImpl(AccessIterator accessIter, int index) {
+                    return (Byte) accessIter.getStore();
                 }
             };
         } else if (value instanceof String) {
             return new FastPathFromStringAccess(value) {
                 @Override
-                protected String getString(Object store, int index) {
-                    return (String) store;
+                public String getStringImpl(AccessIterator accessIter, int index) {
+                    return (String) accessIter.getStore();
                 }
             };
         } else if (value instanceof RNull) {
@@ -80,7 +80,7 @@ public abstract class PrimitiveVectorAccess {
                 }
 
                 @Override
-                protected Object getListElement(Object store, int index) {
+                public Object getListElementImpl(AccessIterator accessIter, int index) {
                     throw RInternalError.shouldNotReachHere();
                 }
             };
@@ -91,26 +91,26 @@ public abstract class PrimitiveVectorAccess {
 
     private static final SlowPathFromIntAccess SLOW_PATH_INT = new SlowPathFromIntAccess() {
         @Override
-        protected int getInt(Object store, int index) {
-            return (Integer) store;
+        public int getIntImpl(AccessIterator accessIter, int index) {
+            return (Integer) accessIter.getStore();
         }
     };
     private static final SlowPathFromDoubleAccess SLOW_PATH_DOUBLE = new SlowPathFromDoubleAccess() {
         @Override
-        protected double getDouble(Object store, int index) {
-            return (Double) store;
+        public double getDoubleImpl(AccessIterator accessIter, int index) {
+            return (Double) accessIter.getStore();
         }
     };
     private static final SlowPathFromLogicalAccess SLOW_PATH_LOGICAL = new SlowPathFromLogicalAccess() {
         @Override
-        protected byte getLogical(Object store, int index) {
-            return (Byte) store;
+        public byte getLogicalImpl(AccessIterator accessIter, int index) {
+            return (Byte) accessIter.getStore();
         }
     };
     private static final SlowPathFromStringAccess SLOW_PATH_STRING = new SlowPathFromStringAccess() {
         @Override
-        protected String getString(Object store, int index) {
-            return (String) store;
+        public String getStringImpl(AccessIterator accessIter, int index) {
+            return (String) accessIter.getStore();
         }
     };
     private static final SlowPathFromListAccess SLOW_PATH_NULL = new SlowPathFromListAccess() {
@@ -125,7 +125,7 @@ public abstract class PrimitiveVectorAccess {
         }
 
         @Override
-        protected Object getListElement(Object store, int index) {
+        public Object getListElementImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
     };
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/SlowPathVectorAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/SlowPathVectorAccess.java
index e92817c90a..d224f2759f 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/SlowPathVectorAccess.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/SlowPathVectorAccess.java
@@ -23,7 +23,6 @@
 package com.oracle.truffle.r.runtime.data.nodes;
 
 import com.oracle.truffle.api.profiles.BranchProfile;
-import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RError.Message;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -40,8 +39,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
  */
 public abstract class SlowPathVectorAccess extends VectorAccess {
 
-    protected boolean naReported; // TODO: move this into the iterator
-    private final BranchProfile warningReportedProfile = BranchProfile.create();
+    protected final BranchProfile warningReportedProfile = BranchProfile.create();
 
     protected SlowPathVectorAccess() {
         // VectorAccess.supports has an assertion that relies on this being Object.class
@@ -53,14 +51,6 @@ public abstract class SlowPathVectorAccess extends VectorAccess {
         return vector;
     }
 
-    protected final void warning(RError.Message message) {
-        if (!naReported) {
-            warningReportedProfile.enter();
-            RError.warning(RError.SHOW_CALLER, message);
-            naReported = true;
-        }
-    }
-
     public abstract static class SlowPathFromIntAccess extends SlowPathVectorAccess {
 
         @Override
@@ -69,75 +59,77 @@ public abstract class SlowPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            int value = getInt(store, index);
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.DOUBLE_NA : RRuntime.int2doubleNoCheck(value);
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            int value = getInt(store, index);
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             byte result = (byte) value;
             if ((result & 0xff) != value) {
-                warning(Message.OUT_OF_RANGE);
+                if (accessIter.warning(Message.OUT_OF_RANGE)) {
+                    warningReportedProfile.enter();
+                }
                 return 0;
             }
             return result;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            int value = getInt(store, index);
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.LOGICAL_NA : RRuntime.int2logicalNoCheck(value);
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            int value = getInt(store, index);
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RComplex.createNA() : RRuntime.int2complexNoCheck(value);
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            int value = getInt(store, index);
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_REAL_PART : value;
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
-            int value = getInt(store, index);
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_IMAGINARY_PART : 0;
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            int value = getInt(store, index);
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            int value = getIntImpl(accessIter, index);
             return na.check(value) ? RRuntime.STRING_NA : RRuntime.intToStringNoCheck(value);
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getInt(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getIntImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setInt(store, index, sourceAccess.getInt(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setIntImpl(accessIter, index, sourceAccess.getInt(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setInt(store, index, sourceAccess.getInt(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setIntImpl(accessIter, index, sourceAccess.getInt(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setInt(store, index, RRuntime.INT_NA);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setIntImpl(accessIter, index, RRuntime.INT_NA);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getInt(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getIntImpl(accessIter, index));
         }
     }
 
@@ -149,84 +141,88 @@ public abstract class SlowPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             if (Double.isNaN(value)) {
                 na.enable(true);
                 return RRuntime.INT_NA;
             }
             if (value > Integer.MAX_VALUE || value <= Integer.MIN_VALUE) {
                 na.enable(true);
-                warning(Message.NA_INTRODUCED_COERCION_INT);
+                if (accessIter.warning(Message.NA_INTRODUCED_COERCION_INT)) {
+                    warningReportedProfile.enter();
+                }
                 return RRuntime.INT_NA;
             }
             return (int) value;
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            int value = (int) getDouble(store, index);
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            int value = (int) getDoubleImpl(accessIter, index);
             byte result = (byte) value;
             if ((result & 0xff) != value) {
-                warning(Message.OUT_OF_RANGE);
+                if (accessIter.warning(Message.OUT_OF_RANGE)) {
+                    warningReportedProfile.enter();
+                }
                 return 0;
             }
             return result;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RRuntime.LOGICAL_NA : RRuntime.double2logicalNoCheck(value);
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RComplex.createNA() : RRuntime.double2complexNoCheck(value);
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_REAL_PART : value;
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_IMAGINARY_PART : 0;
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            double value = getDouble(store, index);
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            double value = getDoubleImpl(accessIter, index);
             return na.check(value) ? RRuntime.STRING_NA : RContext.getRRuntimeASTAccess().encodeDouble(value);
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getDouble(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getDoubleImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setDouble(store, index, sourceAccess.getDouble(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setDoubleImpl(accessIter, index, sourceAccess.getDouble(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setDouble(store, index, sourceAccess.getDouble(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setDoubleImpl(accessIter, index, sourceAccess.getDouble(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setDouble(store, index, RRuntime.DOUBLE_NA);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setDoubleImpl(accessIter, index, RRuntime.DOUBLE_NA);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getDouble(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getDoubleImpl(accessIter, index));
         }
     }
 
@@ -238,74 +234,76 @@ public abstract class SlowPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.INT_NA : RRuntime.logical2intNoCheck(value);
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.DOUBLE_NA : RRuntime.logical2doubleNoCheck(value);
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             if (na.check(value)) {
-                warning(Message.OUT_OF_RANGE);
+                if (accessIter.warning(Message.OUT_OF_RANGE)) {
+                    warningReportedProfile.enter();
+                }
                 return 0;
             }
             return value;
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RComplex.createNA() : RRuntime.logical2complexNoCheck(value);
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_REAL_PART : value;
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.COMPLEX_NA_IMAGINARY_PART : 0;
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            byte value = getLogical(store, index);
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            byte value = getLogicalImpl(accessIter, index);
             return na.check(value) ? RRuntime.STRING_NA : RRuntime.logicalToStringNoCheck(value);
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getLogical(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getLogicalImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setLogical(store, index, sourceAccess.getLogical(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setLogicalImpl(accessIter, index, sourceAccess.getLogical(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setLogical(store, index, sourceAccess.getLogical(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setLogicalImpl(accessIter, index, sourceAccess.getLogical(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setLogical(store, index, RRuntime.LOGICAL_NA);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setLogicalImpl(accessIter, index, RRuntime.LOGICAL_NA);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getLogical(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getLogicalImpl(accessIter, index));
         }
     }
 
@@ -317,65 +315,65 @@ public abstract class SlowPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            return getRaw(store, index) & 0xff;
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            return getRawImpl(accessIter, index) & 0xff;
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            return getRaw(store, index) & 0xff;
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            return getRawImpl(accessIter, index) & 0xff;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            return getRaw(store, index) == 0 ? RRuntime.LOGICAL_FALSE : RRuntime.LOGICAL_TRUE;
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            return getRawImpl(accessIter, index) == 0 ? RRuntime.LOGICAL_FALSE : RRuntime.LOGICAL_TRUE;
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            return RComplex.valueOf(getRaw(store, index) & 0xff, 0);
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            return RComplex.valueOf(getRawImpl(accessIter, index) & 0xff, 0);
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            return getRaw(store, index) & 0xff;
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            return getRawImpl(accessIter, index) & 0xff;
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
             return 0;
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            return RRuntime.rawToHexString(getRaw(store, index));
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            return RRuntime.rawToHexString(getRawImpl(accessIter, index));
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getRaw(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getRawImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setRaw(store, index, sourceAccess.getRaw(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setRawImpl(accessIter, index, sourceAccess.getRaw(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setRaw(store, index, sourceAccess.getRaw(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setRawImpl(accessIter, index, sourceAccess.getRaw(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
+        protected void setNAImpl(AccessIterator accessIter, int index) {
             /*
              * There is no raw NA, but places that write NA for other types usually write 0 for raw.
              */
-            setRaw(store, index, (byte) 0);
+            setRawImpl(accessIter, index, (byte) 0);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
             return false;
         }
     }
@@ -388,84 +386,94 @@ public abstract class SlowPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            double value = getComplexR(store, index);
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            double value = getComplexRImpl(accessIter, index);
             if (Double.isNaN(value)) {
                 na.enable(true);
                 return RRuntime.INT_NA;
             }
             if (value > Integer.MAX_VALUE || value <= Integer.MIN_VALUE) {
                 na.enable(true);
-                warning(Message.NA_INTRODUCED_COERCION_INT);
+                if (accessIter.warning(Message.NA_INTRODUCED_COERCION_INT)) {
+                    warningReportedProfile.enter();
+                }
                 return RRuntime.INT_NA;
             }
-            if (getComplexI(store, index) != 0) {
-                warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION);
+            if (getComplexIImpl(accessIter, index) != 0) {
+                if (accessIter.warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION)) {
+                    warningReportedProfile.enter();
+                }
             }
             return (int) value;
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            double value = getComplexR(store, index);
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            double value = getComplexRImpl(accessIter, index);
             if (Double.isNaN(value)) {
                 na.enable(true);
                 return RRuntime.DOUBLE_NA;
             }
-            if (getComplexI(store, index) != 0) {
-                warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION);
+            if (getComplexIImpl(accessIter, index) != 0) {
+                if (accessIter.warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION)) {
+                    warningReportedProfile.enter();
+                }
             }
             return value;
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            double value = getComplexR(store, index);
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            double value = getComplexRImpl(accessIter, index);
             if (Double.isNaN(value) || value < 0 || value >= 256) {
-                warning(Message.OUT_OF_RANGE);
+                if (accessIter.warning(Message.OUT_OF_RANGE)) {
+                    warningReportedProfile.enter();
+                }
                 return 0;
             }
-            if (getComplexI(store, index) != 0) {
-                warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION);
+            if (getComplexIImpl(accessIter, index) != 0) {
+                if (accessIter.warning(Message.IMAGINARY_PARTS_DISCARDED_IN_COERCION)) {
+                    warningReportedProfile.enter();
+                }
             }
             return (byte) value;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            RComplex value = getComplex(store, index);
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            RComplex value = getComplexImpl(accessIter, index);
             return na.check(value) ? RRuntime.LOGICAL_NA : RRuntime.complex2logicalNoCheck(value);
         }
 
         @Override
-        protected final String getString(Object store, int index) {
-            RComplex value = getComplex(store, index);
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
+            RComplex value = getComplexImpl(accessIter, index);
             return na.check(value) ? RRuntime.STRING_NA : RContext.getRRuntimeASTAccess().encodeComplex(value);
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getComplex(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getComplexImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setComplex(store, index, sourceAccess.getComplexR(sourceIter), sourceAccess.getComplexI(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setComplexImpl(accessIter, index, sourceAccess.getComplexR(sourceIter), sourceAccess.getComplexI(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setComplex(store, index, sourceAccess.getComplexR(sourceIter, sourceIndex), sourceAccess.getComplexI(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setComplexImpl(accessIter, index, sourceAccess.getComplexR(sourceIter, sourceIndex), sourceAccess.getComplexI(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setComplex(store, index, RRuntime.COMPLEX_NA_REAL_PART, RRuntime.COMPLEX_NA_IMAGINARY_PART);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setComplexImpl(accessIter, index, RRuntime.COMPLEX_NA_REAL_PART, RRuntime.COMPLEX_NA_IMAGINARY_PART);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getComplexR(store, index), getComplexI(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getComplexRImpl(accessIter, index), getComplexIImpl(accessIter, index));
         }
     }
 
@@ -477,131 +485,131 @@ public abstract class SlowPathVectorAccess extends VectorAccess {
         }
 
         @Override
-        protected final int getInt(Object store, int index) {
-            return na.convertStringToInt(getString(store, index));
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToInt(getStringImpl(accessIter, index));
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
-            return na.convertStringToDouble(getString(store, index));
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToDouble(getStringImpl(accessIter, index));
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
-            int value = na.convertStringToInt(getString(store, index));
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
+            int value = na.convertStringToInt(getStringImpl(accessIter, index));
             return value >= 0 && value <= 255 ? (byte) value : 0;
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
-            return na.convertStringToLogical(getString(store, index));
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToLogical(getStringImpl(accessIter, index));
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
-            return na.convertStringToComplex(getString(store, index));
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToComplex(getStringImpl(accessIter, index));
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
-            return na.convertStringToComplex(getString(store, index)).getRealPart();
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToComplex(getStringImpl(accessIter, index)).getRealPart();
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
-            return na.convertStringToComplex(getString(store, index)).getImaginaryPart();
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
+            return na.convertStringToComplex(getStringImpl(accessIter, index)).getImaginaryPart();
         }
 
         @Override
-        protected final Object getListElement(Object store, int index) {
-            return getString(store, index);
+        protected final Object getListElementImpl(AccessIterator accessIter, int index) {
+            return getStringImpl(accessIter, index);
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setString(store, index, sourceAccess.getString(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setStringImpl(accessIter, index, sourceAccess.getString(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setString(store, index, sourceAccess.getString(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setStringImpl(accessIter, index, sourceAccess.getString(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
-            setString(store, index, RRuntime.STRING_NA);
+        protected void setNAImpl(AccessIterator accessIter, int index) {
+            setStringImpl(accessIter, index, RRuntime.STRING_NA);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.check(getString(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.check(getStringImpl(accessIter, index));
         }
     }
 
     public abstract static class SlowPathFromListAccess extends SlowPathVectorAccess {
 
         @Override
-        protected final int getInt(Object store, int index) {
+        protected final int getIntImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final double getDouble(Object store, int index) {
+        protected final double getDoubleImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final byte getRaw(Object store, int index) {
+        protected final byte getRawImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final byte getLogical(Object store, int index) {
+        protected final byte getLogicalImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final RComplex getComplex(Object store, int index) {
+        protected final RComplex getComplexImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final double getComplexR(Object store, int index) {
+        protected final double getComplexRImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final double getComplexI(Object store, int index) {
+        protected final double getComplexIImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final String getString(Object store, int index) {
+        protected final String getStringImpl(AccessIterator accessIter, int index) {
             throw RInternalError.shouldNotReachHere();
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-            setListElement(store, index, sourceAccess.getListElement(sourceIter));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+            setListElementImpl(accessIter, index, sourceAccess.getListElement(sourceIter));
         }
 
         @Override
-        protected final void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-            setListElement(store, index, sourceAccess.getListElement(sourceIter, sourceIndex));
+        protected final void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+            setListElementImpl(accessIter, index, sourceAccess.getListElement(sourceIter, sourceIndex));
         }
 
         @Override
-        protected void setNA(Object store, int index) {
+        protected void setNAImpl(AccessIterator accessIter, int index) {
             /*
              * There is no list NA, but places that write NA for other types usually write NULL for
              * lists.
              */
-            setListElement(store, index, RNull.instance);
+            setListElementImpl(accessIter, index, RNull.instance);
         }
 
         @Override
-        protected boolean isNA(Object store, int index) {
-            return na.checkListElement(getListElement(store, index));
+        protected boolean isNAImpl(AccessIterator accessIter, int index) {
+            return na.checkListElement(getListElementImpl(accessIter, index));
         }
     }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java
index d9f5e3ad47..6746845f06 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java
@@ -27,6 +27,7 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
@@ -42,6 +43,8 @@ import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.nodes.RBaseNode;
 import com.oracle.truffle.r.runtime.ops.na.NACheck;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * This class is the main access point for reading and writing vectors. Every implementation of
@@ -79,15 +82,40 @@ public abstract class VectorAccess extends Node {
         this.hasStore = hasStore;
     }
 
-    public static final class SequentialIterator implements AutoCloseable {
+    public abstract static class AccessIterator {
+        private Set<RError.Message> reportedWarnings;
 
         protected final Object store; // internal store, native mirror or vector
         protected final int length;
-        protected int index;
 
-        private SequentialIterator(Object store, int length) {
+        protected AccessIterator(Object store, int length) {
             this.store = store;
             this.length = length;
+        }
+
+        public final Object getStore() {
+            return store;
+        }
+
+        @TruffleBoundary
+        public final boolean warning(RError.Message message) {
+            if (reportedWarnings == null) {
+                reportedWarnings = new HashSet<>();
+            }
+            if (reportedWarnings.add(message)) {
+                RError.warning(RError.SHOW_CALLER, message);
+                return true;
+            }
+            return false;
+        }
+    }
+
+    public static final class SequentialIterator extends AccessIterator implements AutoCloseable {
+
+        protected int index;
+
+        private SequentialIterator(Object store, int length) {
+            super(store, length);
             this.index = -1;
         }
 
@@ -100,24 +128,16 @@ public abstract class VectorAccess extends Node {
             return index;
         }
 
-        Object getStore() {
-            return store;
-        }
-
         @Override
         public String toString() {
             return String.format("<iterator %d of %d, %s>", index, length, store == null ? "null" : store.getClass().getSimpleName());
         }
     }
 
-    public static final class RandomIterator implements AutoCloseable {
-
-        protected final Object store; // internal store, native mirror or vector
-        protected final int length;
+    public static final class RandomIterator extends AccessIterator implements AutoCloseable {
 
         private RandomIterator(Object store, int length) {
-            this.store = store;
-            this.length = length;
+            super(store, length);
         }
 
         @Override
@@ -125,85 +145,81 @@ public abstract class VectorAccess extends Node {
             // nothing to do
         }
 
-        Object getStore() {
-            return store;
-        }
-
         @Override
         public String toString() {
             return String.format("<random access %s>", store == null ? "null" : store.getClass().getSimpleName());
         }
     }
 
-    protected abstract int getInt(Object store, int index);
+    protected abstract int getIntImpl(AccessIterator accessIter, int index);
 
-    protected abstract double getDouble(Object store, int index);
+    protected abstract double getDoubleImpl(AccessIterator accessIter, int index);
 
-    protected abstract RComplex getComplex(Object store, int index);
+    protected abstract RComplex getComplexImpl(AccessIterator accessIter, int index);
 
-    protected abstract double getComplexR(Object store, int index);
+    protected abstract double getComplexRImpl(AccessIterator accessIter, int index);
 
-    protected abstract double getComplexI(Object store, int index);
+    protected abstract double getComplexIImpl(AccessIterator accessIter, int index);
 
-    protected abstract byte getRaw(Object store, int index);
+    protected abstract byte getRawImpl(AccessIterator accessIter, int index);
 
-    protected abstract byte getLogical(Object store, int index);
+    protected abstract byte getLogicalImpl(AccessIterator accessIter, int index);
 
-    protected abstract String getString(Object store, int index);
+    protected abstract String getStringImpl(AccessIterator accessIter, int index);
 
-    protected abstract Object getListElement(Object store, int index);
+    protected abstract Object getListElementImpl(AccessIterator accessIter, int index);
 
     @SuppressWarnings("unused")
-    protected void setInt(Object store, int index, int value) {
+    protected void setIntImpl(AccessIterator accessIter, int index, int value) {
         throw RInternalError.shouldNotReachHere();
     }
 
     @SuppressWarnings("unused")
-    protected void setDouble(Object store, int index, double value) {
+    protected void setDoubleImpl(AccessIterator accessIter, int index, double value) {
         throw RInternalError.shouldNotReachHere();
     }
 
     @SuppressWarnings("unused")
-    protected void setComplex(Object store, int index, double real, double imaginary) {
+    protected void setComplexImpl(AccessIterator accessIter, int index, double real, double imaginary) {
         throw RInternalError.shouldNotReachHere();
     }
 
     @SuppressWarnings("unused")
-    protected void setRaw(Object store, int index, byte value) {
+    protected void setRawImpl(AccessIterator accessIter, int index, byte value) {
         throw RInternalError.shouldNotReachHere();
     }
 
     @SuppressWarnings("unused")
-    protected void setLogical(Object store, int index, byte value) {
+    protected void setLogicalImpl(AccessIterator accessIter, int index, byte value) {
         throw RInternalError.shouldNotReachHere();
     }
 
     @SuppressWarnings("unused")
-    protected void setString(Object store, int index, String value) {
+    protected void setStringImpl(AccessIterator accessIter, int index, String value) {
         throw RInternalError.shouldNotReachHere();
     }
 
     @SuppressWarnings("unused")
-    protected void setListElement(Object store, int index, Object value) {
+    protected void setListElementImpl(AccessIterator accessIter, int index, Object value) {
         throw RInternalError.shouldNotReachHere();
     }
 
     @SuppressWarnings("unused")
-    protected void setFromSameType(Object store, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
+    protected void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
         throw RInternalError.shouldNotReachHere();
     }
 
     @SuppressWarnings("unused")
-    protected void setFromSameType(Object store, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
+    protected void setFromSameTypeImpl(AccessIterator accessIter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
         throw RInternalError.shouldNotReachHere();
     }
 
     @SuppressWarnings("unused")
-    protected void setNA(Object store, int index) {
+    protected void setNAImpl(AccessIterator accessIter, int index) {
         throw RInternalError.shouldNotReachHere();
     }
 
-    protected abstract boolean isNA(Object store, int index);
+    protected abstract boolean isNAImpl(AccessIterator accessIter, int index);
 
     public final Object cast(Object value) {
         return clazz.cast(value);
@@ -276,83 +292,85 @@ public abstract class VectorAccess extends Node {
     public abstract RType getType();
 
     public int getInt(SequentialIterator iter) {
-        return getInt(iter.store, iter.index);
+        return getIntImpl(iter, iter.index);
     }
 
     public double getDouble(SequentialIterator iter) {
-        return getDouble(iter.store, iter.index);
+        return getDoubleImpl(iter, iter.index);
     }
 
     public RComplex getComplex(SequentialIterator iter) {
-        return getComplex(iter.store, iter.index);
+        return getComplexImpl(iter, iter.index);
     }
 
     public double getComplexR(SequentialIterator iter) {
-        return getComplexR(iter.store, iter.index);
+        return getComplexRImpl(iter, iter.index);
     }
 
     public double getComplexI(SequentialIterator iter) {
-        return getComplexI(iter.store, iter.index);
+        return getComplexIImpl(iter, iter.index);
     }
 
     public final byte getRaw(SequentialIterator iter) {
-        return getRaw(iter.store, iter.index);
+        return getRawImpl(iter, iter.index);
     }
 
     public final byte getLogical(SequentialIterator iter) {
-        return getLogical(iter.store, iter.index);
+        return getLogicalImpl(iter, iter.index);
     }
 
     public String getString(SequentialIterator iter) {
-        return getString(iter.store, iter.index);
+        return getStringImpl(iter, iter.index);
     }
 
     public final Object getListElement(SequentialIterator iter) {
-        return getListElement(iter.store, iter.index);
+        return getListElementImpl(iter, iter.index);
     }
 
     public final void setInt(SequentialIterator iter, int value) {
-        setInt(iter.store, iter.index, value);
+        setIntImpl(iter, iter.index, value);
     }
 
     public final void setDouble(SequentialIterator iter, double value) {
-        setDouble(iter.store, iter.index, value);
+        setDoubleImpl(iter, iter.index, value);
     }
 
     public final void setComplex(SequentialIterator iter, double real, double imaginary) {
-        setComplex(iter.store, iter.index, real, imaginary);
+        setComplexImpl(iter, iter.index, real, imaginary);
     }
 
     public final void setRaw(SequentialIterator iter, byte value) {
-        setRaw(iter.store, iter.index, value);
+        setRawImpl(iter, iter.index, value);
     }
 
     public final void setLogical(SequentialIterator iter, byte value) {
-        setLogical(iter.store, iter.index, value);
+        setLogicalImpl(iter, iter.index, value);
     }
 
     public final void setString(SequentialIterator iter, String value) {
-        setString(iter.store, iter.index, value);
+        setStringImpl(iter, iter.index, value);
     }
 
     public final void setListElement(SequentialIterator iter, Object value) {
-        setListElement(iter.store, iter.index, value);
+        setListElementImpl(iter, iter.index, value);
     }
 
-    public final void setFromSameType(SequentialIterator iter, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-        setFromSameType(iter.store, iter.index, sourceAccess, sourceIter);
+    public final void setFromSameType(SequentialIterator iter, VectorAccess sourceAccess,
+                    SequentialIterator sourceIter) {
+        setFromSameTypeImpl(iter, iter.index, sourceAccess, sourceIter);
     }
 
-    public final void setFromSameType(SequentialIterator iter, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-        setFromSameType(iter.store, iter.index, sourceAccess, sourceIter, sourceIndex);
+    public final void setFromSameType(SequentialIterator iter, VectorAccess sourceAccess,
+                    RandomIterator sourceIter, int sourceIndex) {
+        setFromSameTypeImpl(iter, iter.index, sourceAccess, sourceIter, sourceIndex);
     }
 
     public final void setNA(SequentialIterator iter) {
-        setNA(iter.store, iter.index);
+        setNAImpl(iter, iter.index);
     }
 
     public final boolean isNA(SequentialIterator iter) {
-        return isNA(iter.store, iter.index);
+        return isNAImpl(iter, iter.index);
     }
 
     /**
@@ -377,83 +395,83 @@ public abstract class VectorAccess extends Node {
     }
 
     public int getInt(RandomIterator iter, int index) {
-        return getInt(iter.store, index);
+        return getIntImpl(iter, index);
     }
 
     public double getDouble(RandomIterator iter, int index) {
-        return getDouble(iter.store, index);
+        return getDoubleImpl(iter, index);
     }
 
     public RComplex getComplex(RandomIterator iter, int index) {
-        return getComplex(iter.store, index);
+        return getComplexImpl(iter, index);
     }
 
     public double getComplexR(RandomIterator iter, int index) {
-        return getComplexR(iter.store, index);
+        return getComplexRImpl(iter, index);
     }
 
     public double getComplexI(RandomIterator iter, int index) {
-        return getComplexI(iter.store, index);
+        return getComplexIImpl(iter, index);
     }
 
     public final byte getRaw(RandomIterator iter, int index) {
-        return getRaw(iter.store, index);
+        return getRawImpl(iter, index);
     }
 
     public final byte getLogical(RandomIterator iter, int index) {
-        return getLogical(iter.store, index);
+        return getLogicalImpl(iter, index);
     }
 
     public String getString(RandomIterator iter, int index) {
-        return getString(iter.store, index);
+        return getStringImpl(iter, index);
     }
 
     public final Object getListElement(RandomIterator iter, int index) {
-        return getListElement(iter.store, index);
+        return getListElementImpl(iter, index);
     }
 
     public final void setInt(RandomIterator iter, int index, int value) {
-        setInt(iter.store, index, value);
+        setIntImpl(iter, index, value);
     }
 
     public final void setDouble(RandomIterator iter, int index, double value) {
-        setDouble(iter.store, index, value);
+        setDoubleImpl(iter, index, value);
     }
 
     public final void setComplex(RandomIterator iter, int index, double real, double imaginary) {
-        setComplex(iter.store, index, real, imaginary);
+        setComplexImpl(iter, index, real, imaginary);
     }
 
     public final void setRaw(RandomIterator iter, int index, byte value) {
-        setRaw(iter.store, index, value);
+        setRawImpl(iter, index, value);
     }
 
     public final void setLogical(RandomIterator iter, int index, byte value) {
-        setLogical(iter.store, index, value);
+        setLogicalImpl(iter, index, value);
     }
 
     public final void setString(RandomIterator iter, int index, String value) {
-        setString(iter.store, index, value);
+        setStringImpl(iter, index, value);
     }
 
     public final void setListElement(RandomIterator iter, int index, Object value) {
-        setListElement(iter.store, index, value);
+        setListElementImpl(iter, index, value);
     }
 
     public final void setFromSameType(RandomIterator iter, int index, VectorAccess sourceAccess, SequentialIterator sourceIter) {
-        setFromSameType(iter.store, index, sourceAccess, sourceIter);
+        setFromSameTypeImpl(iter, index, sourceAccess, sourceIter);
     }
 
     public final void setFromSameType(RandomIterator iter, int index, VectorAccess sourceAccess, RandomIterator sourceIter, int sourceIndex) {
-        setFromSameType(iter.store, index, sourceAccess, sourceIter, sourceIndex);
+        setFromSameTypeImpl(iter, index, sourceAccess, sourceIter, sourceIndex);
     }
 
     public final void setNA(RandomIterator iter, int index) {
-        setNA(iter.store, index);
+        setNAImpl(iter, index);
     }
 
     public final boolean isNA(RandomIterator iter, int index) {
-        return isNA(iter.store, index);
+        return isNAImpl(iter, index);
     }
 
     /**
-- 
GitLab