comparison truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java @ 22165:67f75f61c974

Certain languages (like FastR) prefer access to raw byte streams. Offering it. One always has an option to wrap Input and Output Streams into character based Readers and Writers
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Mon, 21 Sep 2015 12:36:30 +0200
parents dc83cc1f94f2
children 0480c4873a4a
comparison
equal deleted inserted replaced
22164:567d324c306c 22165:67f75f61c974
39 import com.oracle.truffle.api.interop.java.JavaInterop; 39 import com.oracle.truffle.api.interop.java.JavaInterop;
40 import com.oracle.truffle.api.source.Source; 40 import com.oracle.truffle.api.source.Source;
41 import java.io.Closeable; 41 import java.io.Closeable;
42 import java.io.File; 42 import java.io.File;
43 import java.io.IOException; 43 import java.io.IOException;
44 import java.io.InputStreamReader; 44 import java.io.InputStream;
45 import java.io.InterruptedIOException; 45 import java.io.InterruptedIOException;
46 import java.io.OutputStreamWriter; 46 import java.io.OutputStream;
47 import java.io.Reader; 47 import java.io.Reader;
48 import java.io.Writer; 48 import java.io.Writer;
49 import java.lang.reflect.InvocationHandler; 49 import java.lang.reflect.InvocationHandler;
50 import java.lang.reflect.Method; 50 import java.lang.reflect.Method;
51 import java.net.URI; 51 import java.net.URI;
102 static final Logger LOG = Logger.getLogger(TruffleVM.class.getName()); 102 static final Logger LOG = Logger.getLogger(TruffleVM.class.getName());
103 private static final SPIAccessor SPI = new SPIAccessor(); 103 private static final SPIAccessor SPI = new SPIAccessor();
104 private final Thread initThread; 104 private final Thread initThread;
105 private final Executor executor; 105 private final Executor executor;
106 private final Map<String, Language> langs; 106 private final Map<String, Language> langs;
107 private final Reader in; 107 private final InputStream in;
108 private final Writer err; 108 private final OutputStream err;
109 private final Writer out; 109 private final OutputStream out;
110 private final EventConsumer<?>[] handlers; 110 private final EventConsumer<?>[] handlers;
111 private final Map<String, Object> globals; 111 private final Map<String, Object> globals;
112 private Debugger debugger; 112 private Debugger debugger;
113 113
114 /** 114 /**
126 } 126 }
127 127
128 /** 128 /**
129 * Real constructor used from the builder. 129 * Real constructor used from the builder.
130 */ 130 */
131 private TruffleVM(Executor executor, Map<String, Object> globals, Writer out, Writer err, Reader in, EventConsumer<?>[] handlers) { 131 private TruffleVM(Executor executor, Map<String, Object> globals, OutputStream out, OutputStream err, InputStream in, EventConsumer<?>[] handlers) {
132 this.executor = executor; 132 this.executor = executor;
133 this.out = out; 133 this.out = out;
134 this.err = err; 134 this.err = err;
135 this.in = in; 135 this.in = in;
136 this.handlers = handlers; 136 this.handlers = handlers;
173 * Builder for a new {@link TruffleVM}. Call various configuration methods in a chain and at the 173 * Builder for a new {@link TruffleVM}. Call various configuration methods in a chain and at the
174 * end create new {@link TruffleVM virtual machine}: 174 * end create new {@link TruffleVM virtual machine}:
175 * 175 *
176 * <pre> 176 * <pre>
177 * {@link TruffleVM} vm = {@link TruffleVM}.{@link TruffleVM#newVM() newVM()} 177 * {@link TruffleVM} vm = {@link TruffleVM}.{@link TruffleVM#newVM() newVM()}
178 * .{@link Builder#stdOut(java.io.Writer) stdOut}({@link Writer yourWriter}) 178 * .{@link Builder#setOut(java.io.Writer) setOut}({@link OutputStream yourOutput})
179 * .{@link Builder#stdErr(java.io.Writer) stdErr}({@link Writer yourWriter}) 179 * .{@link Builder#setErr(java.io.Writer) setrr}({@link OutputStream yourOutput})
180 * .{@link Builder#stdIn(java.io.Reader) stdIn}({@link Reader yourReader}) 180 * .{@link Builder#setIn(java.io.Reader) setIn}({@link InputStream yourInput})
181 * .{@link Builder#build() build()}; 181 * .{@link Builder#build() build()};
182 * </pre> 182 * </pre>
183 */ 183 */
184 public final class Builder { 184 public final class Builder {
185 private Writer out; 185 private OutputStream out;
186 private Writer err; 186 private OutputStream err;
187 private Reader in; 187 private InputStream in;
188 private final List<EventConsumer<?>> handlers = new ArrayList<>(); 188 private final List<EventConsumer<?>> handlers = new ArrayList<>();
189 private final Map<String, Object> globals = new HashMap<>(); 189 private final Map<String, Object> globals = new HashMap<>();
190 private Executor executor; 190 private Executor executor;
191 191
192 Builder() { 192 Builder() {
194 194
195 /** 195 /**
196 * Changes the default output for languages running in <em>to be created</em> 196 * Changes the default output for languages running in <em>to be created</em>
197 * {@link TruffleVM virtual machine}. The default is to use {@link System#out}. 197 * {@link TruffleVM virtual machine}. The default is to use {@link System#out}.
198 * 198 *
199 * @param w the writer to use as output 199 * @param os the stream to use as output
200 * @return instance of this builder 200 * @return instance of this builder
201 */ 201 */
202 public Builder setOut(OutputStream os) {
203 out = os;
204 return this;
205 }
206
207 /**
208 * @deprecated does nothing
209 */
210 @Deprecated
202 public Builder stdOut(Writer w) { 211 public Builder stdOut(Writer w) {
203 out = w;
204 return this; 212 return this;
205 } 213 }
206 214
207 /** 215 /**
208 * Changes the error output for languages running in <em>to be created</em> 216 * Changes the error output for languages running in <em>to be created</em>
209 * {@link TruffleVM virtual machine}. The default is to use {@link System#err}. 217 * {@link TruffleVM virtual machine}. The default is to use {@link System#err}.
210 * 218 *
211 * @param w the writer to use as output 219 * @param os the stream to use as output
212 * @return instance of this builder 220 * @return instance of this builder
213 */ 221 */
222 public Builder setErr(OutputStream os) {
223 err = os;
224 return this;
225 }
226
227 /**
228 * @deprecated does nothing
229 */
230 @Deprecated
214 public Builder stdErr(Writer w) { 231 public Builder stdErr(Writer w) {
215 err = w;
216 return this; 232 return this;
217 } 233 }
218 234
219 /** 235 /**
220 * Changes the default input for languages running in <em>to be created</em> 236 * Changes the default input for languages running in <em>to be created</em>
221 * {@link TruffleVM virtual machine}. The default is to use {@link System#out}. 237 * {@link TruffleVM virtual machine}. The default is to use {@link System#in}.
222 * 238 *
223 * @param r the reader to use as input 239 * @param is the stream to use as input
224 * @return instance of this builder 240 * @return instance of this builder
225 */ 241 */
242 public Builder setIn(InputStream is) {
243 in = is;
244 return this;
245 }
246
247 /**
248 * @deprecated does nothing
249 */
250 @Deprecated
226 public Builder stdIn(Reader r) { 251 public Builder stdIn(Reader r) {
227 in = r;
228 return this; 252 return this;
229 } 253 }
230 254
231 /** 255 /**
232 * Registers another instance of {@link EventConsumer} into the to be created 256 * Registers another instance of {@link EventConsumer} into the to be created
286 * 310 *
287 * @return new, isolated virtual machine with pre-registered languages 311 * @return new, isolated virtual machine with pre-registered languages
288 */ 312 */
289 public TruffleVM build() { 313 public TruffleVM build() {
290 if (out == null) { 314 if (out == null) {
291 out = new OutputStreamWriter(System.out); 315 out = System.out;
292 } 316 }
293 if (err == null) { 317 if (err == null) {
294 err = new OutputStreamWriter(System.err); 318 err = System.err;
295 } 319 }
296 if (in == null) { 320 if (in == null) {
297 in = new InputStreamReader(System.in); 321 in = System.in;
298 } 322 }
299 Executor nonNullExecutor = executor != null ? executor : new Executor() { 323 Executor nonNullExecutor = executor != null ? executor : new Executor() {
300 @Override 324 @Override
301 public void execute(Runnable command) { 325 public void execute(Runnable command) {
302 command.run(); 326 command.run();
849 } 873 }
850 return null; 874 return null;
851 } 875 }
852 876
853 @Override 877 @Override
854 public Env attachEnv(Object obj, TruffleLanguage<?> language, Writer stdOut, Writer stdErr, Reader stdIn) { 878 protected Env attachEnv(Object obj, TruffleLanguage<?> language, OutputStream stdOut, OutputStream stdErr, InputStream stdIn) {
855 TruffleVM vm = (TruffleVM) obj; 879 TruffleVM vm = (TruffleVM) obj;
856 return super.attachEnv(vm, language, stdOut, stdErr, stdIn); 880 return super.attachEnv(vm, language, stdOut, stdErr, stdIn);
857 } 881 }
858 882
859 @Override 883 @Override