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 706eaea5681b5d36c5c10ced5474c17c2280685f..ee30fb24e463077c39f466949f38aac9d18fcb92 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 562c9181daf0f73d73843aec03ebbd863140e969..510bf7d39c6864c9a9b404a51d3c7345efa28d51 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 dd7874e373050edf7677392c10b9ad46423ee805..0b143cfd993783560b03465abdce95088d9d6647 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 74ae82f0bdc166e9b48f43bf3b88935ef3966fbc..22f40c18d3425405c1c34426dd04515a5befc222 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 816427bf24305f3db1e9f1c4fe7c74c0fcd803e7..d07923b084b146abf7c0b62b05bd7a61edfb56f3 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 465a3ac018e92f11e16f152540f9ca2ab69740eb..3c1390961d15bc24a53d6b5bb08f2bf877ac0695 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 34672246ef6a944b880680fa399f760368605cd5..19f249ac38d490abcfca423e7df74355afca3cb4 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 53bb9223123738459501f2511f9980d4fe45d723..2ac611b0176acb0d03a9c5cff9e62a0187fee4ee 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 aeaf0d95cb6b9c6a167f124ff1a3aac9ec8ae7c2..b23b83f0b7014184d3242865cebed3c8e95e7b73 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 da27c0e3121205bd24e34b0c93c2bd246b638591..b69b3491ab13aed366808618a3947ff1ea82c128 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 b96fdb87c1976f0a34cf5e6d2db8d323370b1073..a1955ae52e045056a3d13bdadba0a023442edd98 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 2f57d6bae1562df11b85b91c4d8dddd2c49b9778..0474e326133189f06430fd2e9dec532988801384 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 5c8f3bba324182e8471f498939b900735c442539..256ea5e8a62ecd2f27040d3647fddfc5343cee5d 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 3708566681de1d77a7d6da163aa2271c88e13ad7..c0a84f0142af4ac8be8b3e2a9961e0933cade9f2 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 65b53d5257e8a411fc4bd15ebf9531cbb6768ee1..9809835273e6f8afda7cf99481603286bb16d7fb 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 56c828ceeca5447bb9b08ef1727f211593cefa91..25f8af5e9ddafe30173fbab2e2eb623d30d0b758 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 06d75e55ba314706474f369c138673b73d4a18e4..fad3456263160c191a1f91ffb87e2524076e4f83 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 89d03dfac1a254400404933c8e645b6e6c867158..f8b7cd4daa119bc61d6842990910e442e6937144 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 0224299f8a08818b746759b29db0fee17bacf8a5..98a32869ba67c3ab6759f08d0714f19225b4aaa4 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 6c446e393eeb1f4e62936353a57d5723fe57bc9e..ef67dbd5f1700c9fca6dd9a287ee276fe019c1db 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 63515865275ec68c0017ab29250ba461ef9e503f..eab92e79000926dd4acbbc2a2937062807f297da 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 da6bd5251abfa59d982b541b8056f212607d51e2..d29dfd45d6be0888b5dbd369ff6d86d10350d116 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 c1df09a38ec1d80bda575ffcaf60b6ce8587d030..cd3f0f98f136c8c1bd879a2f53df222b5780047a 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 41fd741fb878615d3bfc394eb3ef1f33ffa61cfb..bf7a8cfb42f1f3750094cfb7769254c3c059c2b1 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 88e9d0147a06a7d9e9ae299006868c919dbdf5c6..4978a564fd453de2a174faa609b1da3282973dcf 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 dad86be84d9b2e0f48234443dcb21a91faa4bbdd..fe362d62d4902704bbafa58d5157e5b972a6af78 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 226a1ae9af55d5e69ea8f30e827fe9fb3a364702..42296c572c03216ac81013c17b548e906a6b6f11 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 25f34d447e8fd43aa5287623dfe469aa4e1e5276..c1b8ab60c45ed8a923b42705104443c77dd30b77 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 05009742e2e573a0fcf88eb0c44d353a8c4e6416..a4f6f45dbe6732c8e36c22e8612485eb8ce5b242 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 f2d7af69d3f497bb3e4fac697303dc377c2bc135..a661fce629476f7c80e43ad3aacacc2d1ef154c9 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 a35e5d98aeae95a22821c7cc4c6547749c7218dd..8cf5ed631e1896f69c901491698d16817bda2b68 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 e92817c90aad16725459c2d1a63298e6f832954a..d224f2759f0989932ff970f036dab4a7b0bc50cb 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 d9f5e3ad479183e40cc52f105b9b27e462f0fbf5..6746845f06a51e4a627735c0154312e0e315b21c 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);
     }
 
     /**