@@ -672,6 +672,7 @@ void jl_prep_terminal (int meta_flag)
672
672
rl_instream = stdin ;
673
673
rl_prep_terminal (1 );
674
674
rl_instream = rl_in ;
675
+ rl_prep_terminal (1 );
675
676
#ifdef __WIN32__
676
677
if (!repl_sigint_handler_installed ) {
677
678
if (SetConsoleCtrlHandler ((PHANDLER_ROUTINE )repl_sigint_handler ,1 ))
@@ -703,6 +704,10 @@ void jl_deprep_terminal ()
703
704
rl_instream = rl_in ;
704
705
}
705
706
707
+ #include "uv.h"
708
+ static uv_pipe_t uv_pipe_from_jl ;
709
+ static uv_pipe_t uv_pipe_to_rl ;
710
+
706
711
void init_repl_environment (int argc , char * argv [])
707
712
{
708
713
disable_history = 0 ;
@@ -722,7 +727,14 @@ void init_repl_environment(int argc, char *argv[])
722
727
rl_catch_signals = 0 ;
723
728
rl_prep_term_function = & jl_prep_terminal ;
724
729
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
726
738
prompt_length = strlen (prompt_plain );
727
739
init_history ();
728
740
rl_startup_hook = (Function * )init_rl ;
@@ -734,17 +746,40 @@ void repl_callback_enable()
734
746
rl_callback_handler_install (prompt_string , jl_input_line_callback );
735
747
}
736
748
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
+ }
739
764
void jl_readBuffer (char * base , ssize_t nread )
740
765
{
766
+ #ifdef __WIN32__
741
767
char * start = base ;
742
768
while (* start != 0 && nread > 0 ) {
743
769
rl_stuff_char (* start );
744
770
start ++ ;
745
771
nread -- ;
746
772
}
747
773
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
748
783
}
749
784
750
785
void restart (void )
0 commit comments