From af95f8fa5db14ee34b226063cbb4ed6c41db0fd0 Mon Sep 17 00:00:00 2001
From: Michael Haupt <michael.haupt@oracle.com>
Date: Wed, 18 Jun 2014 17:42:18 +0200
Subject: [PATCH] avoid recursion in cat builtin

---
 .../truffle/r/nodes/builtin/base/Cat.java      | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/Cat.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/Cat.java
index dc7d3f0b6c..864e8c218b 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/Cat.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/Cat.java
@@ -23,10 +23,12 @@
 package com.oracle.truffle.r.nodes.builtin.base;
 
 import static com.oracle.truffle.r.nodes.builtin.RBuiltinKind.SUBSTITUTE;
+
 import com.oracle.truffle.api.*;
 import com.oracle.truffle.api.CompilerDirectives.*;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.frame.FrameInstance.FrameAccess;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.nodes.access.*;
 import com.oracle.truffle.r.nodes.builtin.*;
@@ -93,18 +95,26 @@ public abstract class Cat extends RInvisibleBuiltinNode {
             if (args[i] instanceof Object[]) {
                 // in case cat is called with a ... parameter, it is passed as an array within the
                 // args array
-                cat(frame, (Object[]) args[i], file, sep, fill, labels, append);
+                Object[] wrappedArgs = (Object[]) args[i];
+                for (int j = 0; j < wrappedArgs.length; ++j) {
+                    catIntl(toString.executeString(frame, wrappedArgs[j]));
+                    catSep(sep, wrappedArgs, j);
+                }
             } else {
                 catIntl(toString.executeString(frame, args[i]));
             }
-            if (i < args.length - 1 || sep.contains("\n")) {
-                catIntl(sep);
-            }
+            catSep(sep, args, i);
         }
         controlVisibility();
         return RNull.instance;
     }
 
+    private static void catSep(String sep, Object[] os, int j) {
+        if (j < os.length - 1 || sep.contains("\n")) {
+            catIntl(sep);
+        }
+    }
+
     @SlowPath
     private static void catIntl(String s) {
         RContext.getInstance().getConsoleHandler().print(s);
-- 
GitLab