Mercurial > hg > truffle
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 |