RFR JDK-8131023: JShell: System.in does not work
Jan Lahoda
jan.lahoda at oracle.com
Thu Aug 25 15:23:35 UTC 2016
Hi,
Bug:
https://bugs.openjdk.java.net/browse/JDK-8131023
Langtools webrev:
http://cr.openjdk.java.net/~jlahoda/8131023/langtools.00/
JDK repository webrev:
http://cr.openjdk.java.net/~jlahoda/8131023/jdk.00/
Specdiff:
http://cr.openjdk.java.net/~jlahoda/8131023/diff.00/jdk/jshell/execution/Util.html
Currently jshell forwards output from the agent to the main process.
With this patch, the input is also forwarded from the main process to
the agent. InputStream.read() is only called in the main process if it
has been called on the agent side; this is achieved by using an
artificial OutputStream in the agent->main process direction. On the
agent side, when an input is requested, a character is written to the
corresponding artificial OutputStream, the main process is about that,
reads from the actual input and sends the data back to the agent.
In the tool, jline is used to actually read the input, as System.in is
switched in the raw mode. This requires a tweak in jline, to detect the
proper column on which the editing starts, to cover requests like:
System.err.print("Prompt: "); System.err.flush(); System.in.read();
Without the tweak, the line editor wouldn't unfortunately know about the
text written to the console (for supported terminals, at least). (This
tweak may be useful in any case for complex prompts that use escape
sequences; also for jjs.)
An alternative would be to try to switch jline off while reading the
user's input. The advantage of using jline is that it allows to detect
Ctrl-C.
Any feedback is welcome!
Thanks,
Jan
More information about the kulla-dev
mailing list