Skip to content

Commit c40d3ed

Browse files
committed
connect readline with a pipe instead of /dev/null. doesn't work for #2064 and introduces many more problems
1 parent c49dc08 commit c40d3ed

File tree

1 file changed

+38
-3
lines changed

1 file changed

+38
-3
lines changed

ui/repl-readline.c

+38-3
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,7 @@ void jl_prep_terminal (int meta_flag)
672672
rl_instream = stdin;
673673
rl_prep_terminal(1);
674674
rl_instream = rl_in;
675+
rl_prep_terminal(1);
675676
#ifdef __WIN32__
676677
if (!repl_sigint_handler_installed) {
677678
if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)repl_sigint_handler,1))
@@ -703,6 +704,10 @@ void jl_deprep_terminal ()
703704
rl_instream = rl_in;
704705
}
705706

707+
#include "uv.h"
708+
static uv_pipe_t uv_pipe_from_jl;
709+
static uv_pipe_t uv_pipe_to_rl;
710+
706711
void init_repl_environment(int argc, char *argv[])
707712
{
708713
disable_history = 0;
@@ -722,7 +727,14 @@ void init_repl_environment(int argc, char *argv[])
722727
rl_catch_signals = 0;
723728
rl_prep_term_function=&jl_prep_terminal;
724729
rl_deprep_term_function=&jl_deprep_terminal;
725-
rl_instream=fopen("/dev/null","r");
730+
#ifndef __WIN32__
731+
uv_pipe_init(uv_default_loop(), &uv_pipe_from_jl, UV_PIPE_WRITEABLE);
732+
uv_pipe_init(uv_default_loop(), &uv_pipe_to_rl, UV_PIPE_READABLE|UV_PIPE_SPAWN_SAFE);
733+
uv_pipe_link(&uv_pipe_to_rl, &uv_pipe_from_jl);
734+
rl_instream = fdopen(uv_pipe_to_rl.accepted_fd, "w");
735+
#else
736+
rl_instream = open("/dev/null","r");
737+
#endif
726738
prompt_length = strlen(prompt_plain);
727739
init_history();
728740
rl_startup_hook = (Function*)init_rl;
@@ -734,17 +746,40 @@ void repl_callback_enable()
734746
rl_callback_handler_install(prompt_string, jl_input_line_callback);
735747
}
736748

737-
#include "uv.h"
738-
749+
static void jl_freeBuffer(uv_write_t* req, int status) {
750+
size_t nread = 1;
751+
if (req->data) {
752+
size_t* data = (size_t*)req->data;
753+
nread = data[-1];
754+
free(data-1);
755+
}
756+
free(req);
757+
size_t i;
758+
for (i = 0; i < nread; i++) {
759+
if (!callback_en)
760+
break;
761+
rl_callback_read_char();
762+
}
763+
}
739764
void jl_readBuffer(char *base, ssize_t nread)
740765
{
766+
#ifdef __WIN32__
741767
char *start = base;
742768
while(*start != 0 && nread > 0) {
743769
rl_stuff_char(*start);
744770
start++;
745771
nread--;
746772
}
747773
rl_callback_read_char();
774+
#else
775+
uv_write_t *uvw = malloc(sizeof(uv_write_t));
776+
char *data = malloc(nread+sizeof(size_t))+sizeof(size_t);
777+
memcpy(data, base, nread);
778+
uv_buf_t buf[] = {{.base = data, .len = nread}};
779+
uvw->data = data;
780+
int err = uv_write(uvw, (uv_stream_t*)&uv_pipe_from_jl, buf, 1, &jl_freeBuffer);
781+
(void)err;
782+
#endif
748783
}
749784

750785
void restart(void)

0 commit comments

Comments
 (0)