comparison graal/com.oracle.truffle.ruby.nodes/src/com/oracle/truffle/ruby/nodes/core/SystemNode.java @ 13529:856c2c294f84

Merge.
author Christian Humer <christian.humer@gmail.com>
date Tue, 07 Jan 2014 18:53:04 +0100
parents 0fbee3eb71f0
children
comparison
equal deleted inserted replaced
13528:5a0c694ef735 13529:856c2c294f84
1 /*
2 * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. This
3 * code is released under a tri EPL/GPL/LGPL license. You can use it,
4 * redistribute it and/or modify it under the terms of the:
5 *
6 * Eclipse Public License version 1.0
7 * GNU General Public License version 2
8 * GNU Lesser General Public License version 2.1
9 */
10 package com.oracle.truffle.ruby.nodes.core;
11
12 import java.io.*;
13
14 import com.oracle.truffle.api.*;
15 import com.oracle.truffle.api.frame.*;
16 import com.oracle.truffle.api.nodes.*;
17 import com.oracle.truffle.ruby.nodes.*;
18 import com.oracle.truffle.ruby.runtime.*;
19
20 /**
21 * Represents an expression that is evaluated by running it as a system command via forking and
22 * execing, and then taking stdout as a string.
23 */
24 @NodeInfo(shortName = "system")
25 public class SystemNode extends RubyNode {
26
27 @Child protected RubyNode child;
28
29 public SystemNode(RubyContext context, SourceSection sourceSection, RubyNode child) {
30 super(context, sourceSection);
31 this.child = adoptChild(child);
32 }
33
34 @Override
35 public Object execute(VirtualFrame frame) {
36 final RubyContext context = getContext();
37
38 final String command = child.execute(frame).toString();
39
40 Process process;
41
42 try {
43 // We need to run via bash to get the variable and other expansion we expect
44 process = Runtime.getRuntime().exec(new String[]{"bash", "-c", command});
45 } catch (IOException e) {
46 throw new RuntimeException(e);
47 }
48
49 final InputStream stdout = process.getInputStream();
50 final BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
51
52 final StringBuilder resultBuilder = new StringBuilder();
53
54 String line;
55
56 // TODO(cs): this isn't great for binary output
57
58 try {
59 while ((line = reader.readLine()) != null) {
60 resultBuilder.append(line);
61 resultBuilder.append("\n");
62 }
63 } catch (IOException e) {
64 throw new RuntimeException(e);
65 }
66
67 return context.makeString(resultBuilder.toString());
68 }
69 }