From 7958d685522e6f38522813c65bdd28685ee1784f Mon Sep 17 00:00:00 2001
From: Christian Humer <christian.humer@oracle.com>
Date: Mon, 4 Jan 2016 19:50:41 +0100
Subject: [PATCH] Fix missing check for vector length in delete list.

---
 .../vector/CachedReplaceVectorNode.java       | 28 ++++++++++---------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
index e97deb7996..c13c5c004b 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
@@ -555,19 +555,21 @@ final class CachedReplaceVectorNode extends CachedVectorNode {
             }
 
             int resultIndex = 0;
-            for (int i = 0; i < vectorLength; i++) {
-                Object element = vector.getDataAtAsObject(i);
-                if (element != DELETE_MARKER) {
-                    data[resultIndex] = element;
-                    if (hasNames) {
-                        newNames[resultIndex] = names.getDataAt(i);
-                    }
-                    resultIndex++;
-                    if (isPreviousResultSpecialized() && resultIndex > resultLength) {
-                        // got too many elements
-                        CompilerDirectives.transferToInterpreterAndInvalidate();
-                        previousResultLength = PREVIOUS_RESULT_GENERIC;
-                        return deleteElements(vector, vectorLength);
+            if (resultLength > 0) {
+                for (int i = 0; i < vectorLength; i++) {
+                    Object element = vector.getDataAtAsObject(i);
+                    if (element != DELETE_MARKER) {
+                        data[resultIndex] = element;
+                        if (hasNames) {
+                            newNames[resultIndex] = names.getDataAt(i);
+                        }
+                        resultIndex++;
+                        if (isPreviousResultSpecialized() && resultIndex > resultLength) {
+                            // got too many elements
+                            CompilerDirectives.transferToInterpreterAndInvalidate();
+                            previousResultLength = PREVIOUS_RESULT_GENERIC;
+                            return deleteElements(vector, vectorLength);
+                        }
                     }
                 }
             }
-- 
GitLab