[ruby-trunk - Bug #8782][Assigned] Don't set rl_getc_function on editline

Issue #8782 has been reported by naruse (Yui NARUSE).


Bug #8782: Don’t set rl_getc_function on editline

Author: naruse (Yui NARUSE)
Status: Assigned
Priority: Normal
Assignee: kouji (Kouji T.)
Category: ext
Target version: current: 2.1.0
ruby -v: ruby 2.1.0dev (2013-08-12 trunk 42528) [x86_64-darwin12.4.0]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN

r42402 以来 OS X 等の editline 環境では #define rl_getc(f) EOF
が使われるようになってしまって残念なことになっていたわけですが、
そもそも editline の readline wrapper は non ASCII に対応していません。
(editline 自体には UTF-8 のみの対応が入ったが、readline wrapper は src/readline.c の
_getc_function を経由するので non ASCII は化ける)

ので、いっそ rl_getc_function を使わないようにしてはどうでしょう。
以下のようなパッチを当てると、readline なしの OS X の irb で日本語が使えるようになります。

diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb
index 0b121c1…bc0ee77 100644
— a/ext/readline/extconf.rb
+++ b/ext/readline/extconf.rb
@@ -94,4 +94,5 @@ readline.have_func(“clear_history”)
readline.have_func(“rl_redisplay”)
readline.have_func(“rl_insert_text”)
readline.have_func(“rl_delete_text”)
+readline.have_func(“el_init”)
create_makefile(“readline”)
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 0f76d1a…85109f0 100644
— a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -130,12 +130,7 @@ static VALUE readline_instream;
static VALUE readline_outstream;

#if defined HAVE_RL_GETC_FUNCTION

-#ifndef HAVE_RL_GETC
-#define rl_getc(f) EOF
-#endif

-static int readline_getc(FILE *);
+# ifndef HAVE_EL_INIT
static int
readline_getc(FILE *input)
{
@@ -187,6 +182,7 @@ readline_getc(FILE *input)
#endif
return FIX2INT(c);
}
+# endif
#elif defined HAVE_RL_EVENT_HOOK
#define BUSY_WAIT 0

@@ -1771,7 +1767,9 @@ Init_readline()
/* libedit check rl_getc_function only when rl_initialize() is
called, /
/
and using_history() call rl_initialize(). /
/
This assignment should be placed before using_history() */
+# ifndef HAVE_EL_INIT
rl_getc_function = readline_getc;
+# endif
#elif defined HAVE_RL_EVENT_HOOK
rl_event_hook = readline_event;
#endif

Issue #8782 has been updated by akr (Akira T.).

rl_getc_function を設定しないと、readline()
内でブロックした時に他のスレッドがすべて止まってしまうのではないかと思います。

これは、現在、rl_getc_function 内で read システムコールを呼び出すところだけを blocking region
にして、他のスレッドが動けるようにしているからです。

readline() 関数全体を blocking region 内で実行するという手はあるかもしれません。

Bug #8782: Don’t set rl_getc_function on editline

Author: naruse (Yui NARUSE)
Status: Assigned
Priority: Normal
Assignee: kouji (Kouji T.)
Category: ext
Target version: current: 2.1.0
ruby -v: ruby 2.1.0dev (2013-08-12 trunk 42528) [x86_64-darwin12.4.0]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN

r42402 以来 OS X 等の editline 環境では #define rl_getc(f) EOF
が使われるようになってしまって残念なことになっていたわけですが、
そもそも editline の readline wrapper は non ASCII に対応していません。
(editline 自体には UTF-8 のみの対応が入ったが、readline wrapper は src/readline.c の
_getc_function を経由するので non ASCII は化ける)

ので、いっそ rl_getc_function を使わないようにしてはどうでしょう。
以下のようなパッチを当てると、readline なしの OS X の irb で日本語が使えるようになります。

diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb
index 0b121c1…bc0ee77 100644
— a/ext/readline/extconf.rb
+++ b/ext/readline/extconf.rb
@@ -94,4 +94,5 @@ readline.have_func(“clear_history”)
readline.have_func(“rl_redisplay”)
readline.have_func(“rl_insert_text”)
readline.have_func(“rl_delete_text”)
+readline.have_func(“el_init”)
create_makefile(“readline”)
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 0f76d1a…85109f0 100644
— a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -130,12 +130,7 @@ static VALUE readline_instream;
static VALUE readline_outstream;

#if defined HAVE_RL_GETC_FUNCTION

-#ifndef HAVE_RL_GETC
-#define rl_getc(f) EOF
-#endif

-static int readline_getc(FILE *);
+# ifndef HAVE_EL_INIT
static int
readline_getc(FILE *input)
{
@@ -187,6 +182,7 @@ readline_getc(FILE *input)
#endif
return FIX2INT(c);
}
+# endif
#elif defined HAVE_RL_EVENT_HOOK
#define BUSY_WAIT 0

@@ -1771,7 +1767,9 @@ Init_readline()
/* libedit check rl_getc_function only when rl_initialize() is
called, /
/
and using_history() call rl_initialize(). /
/
This assignment should be placed before using_history() */
+# ifndef HAVE_EL_INIT
rl_getc_function = readline_getc;
+# endif
#elif defined HAVE_RL_EVENT_HOOK
rl_event_hook = readline_event;
#endif

Issue #8782 has been updated by Hiroshi SHIBATA.

Target version changed from 2.1.0 to current: 2.2.0


Bug #8782: Don’t set rl_getc_function on editline

  • Author: Yui NARUSE
  • Status: Assigned
  • Priority: Normal
  • Assignee: Kouji T.
  • Category: ext
  • Target version: current: 2.2.0
  • ruby -v: ruby 2.1.0dev (2013-08-12 trunk 42528) [x86_64-darwin12.4.0]
  • Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN

r42402 以来 OS X 等の editline 環境では #define rl_getc(f) EOF
が使われるようになってしまって残念なことになっていたわけですが、
そもそも editline の readline wrapper は non ASCII に対応していません。
(editline 自体には UTF-8 のみの対応が入ったが、readline wrapper は src/readline.c の
_getc_function を経由するので non ASCII は化ける)

ので、いっそ rl_getc_function を使わないようにしてはどうでしょう。
以下のようなパッチを当てると、readline なしの OS X の irb で日本語が使えるようになります。

diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb
index 0b121c1…bc0ee77 100644
— a/ext/readline/extconf.rb
+++ b/ext/readline/extconf.rb
@@ -94,4 +94,5 @@ readline.have_func(“clear_history”)
readline.have_func(“rl_redisplay”)
readline.have_func(“rl_insert_text”)
readline.have_func(“rl_delete_text”)
+readline.have_func(“el_init”)
create_makefile(“readline”)
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 0f76d1a…85109f0 100644
— a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -130,12 +130,7 @@ static VALUE readline_instream;
static VALUE readline_outstream;

#if defined HAVE_RL_GETC_FUNCTION

-#ifndef HAVE_RL_GETC
-#define rl_getc(f) EOF
-#endif

-static int readline_getc(FILE *);
+# ifndef HAVE_EL_INIT
static int
readline_getc(FILE *input)
{
@@ -187,6 +182,7 @@ readline_getc(FILE *input)
#endif
return FIX2INT(c);
}
+# endif
#elif defined HAVE_RL_EVENT_HOOK
#define BUSY_WAIT 0

@@ -1771,7 +1767,9 @@ Init_readline()
/* libedit check rl_getc_function only when rl_initialize() is
called, /
/
and using_history() call rl_initialize(). /
/
This assignment should be placed before using_history() */
+# ifndef HAVE_EL_INIT
rl_getc_function = readline_getc;
+# endif
#elif defined HAVE_RL_EVENT_HOOK
rl_event_hook = readline_event;
#endif