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