Gauche:Bugs

Gauche:Bugs

Gaucheのversionと、できれば日付もいれといて下さい。日付は[[$date]]で入れられます。


with-signal-handlers sets unwanted signals to be ignored

with-signal-handlers を呼ぶと、それまで SIG_IGN でなかったものが そうなってしまいます。 例えば、(info 'car) を kterm などで実行している gosh から呼ぶと、 その後 C-z によるサスペンドができなくなります (on NetBSD/amd64 at least)

sigHandlers.handlers[] の状態として、libgauche が扱わないシグナルについては nil であらわすことにしました。その状態を user に見せるかどうかは議論の 余地がありそうですが、ここでは見せることにしています。

enami (2010/08/26 19:48:04 PDT):

diff --git a/src/signal.c b/src/signal.c
index bb87a96..93ac0a1 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -581,5 +581,5 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
     struct sigdesc *desc;
     sigset_t sigset;
-    int badproc = FALSE, sigactionfailed = FALSE;
+    int badproc = FALSE, sigactionfailed = FALSE, donthandle = FALSE;
 
     if (SCM_INTP(sigs)) {
@@ -596,11 +596,4 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
     }
 
-    if (mask == NULL) {
-        /* If no mask is specified, block singals in SIGS. */
-        mask = make_sigset();
-        mask->set = sigset;
-    }
-    
-    (void)SCM_INTERNAL_MUTEX_LOCK(sigHandlers.mutex);
     if (SCM_TRUEP(handler)) {
         act.sa_handler = SIG_DFL;
@@ -610,7 +603,17 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
                && SCM_PROCEDURE_TAKE_NARG_P(handler, 1)) {
         act.sa_handler = sig_handle;
+    } else if (SCM_NULLP(handler)) {
+        donthandle = TRUE;
     } else {
         badproc = TRUE;
     }
+
+    if (mask == NULL && !donthandle) {
+        /* If no mask is specified, block singals in SIGS. */
+        mask = make_sigset();
+        mask->set = sigset;
+    }
+    
+    (void)SCM_INTERNAL_MUTEX_LOCK(sigHandlers.mutex);
     if (!badproc) {
         sigfillset(&act.sa_mask); /* we should block all the signals */
@@ -619,5 +622,5 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
             if (!sigismember(&sigset, desc->num)) continue;
             if (!sigismember(&sigHandlers.masterSigset, desc->num)) continue;
-            if (sigaction(desc->num, &act, NULL) != 0) {
+            if (!donthandle && sigaction(desc->num, &act, NULL) != 0) {
                 sigactionfailed = desc->num;
             } else {
@@ -956,5 +959,5 @@ void Scm__InitSignal(void)
     (void)SCM_INTERNAL_MUTEX_INIT(sigHandlers.mutex);
     sigemptyset(&sigHandlers.masterSigset);
-    for (i=0; i<NSIG; i++) sigHandlers.handlers[i] = SCM_FALSE;
+    for (i=0; i<NSIG; i++) sigHandlers.handlers[i] = SCM_NIL;
     
     Scm_InitStaticClass(&Scm_SysSigsetClass, "<sys-sigset>",

dynamic-wind で stray local variable (r7093)

齊藤 (2010/04/10 18:40:14 PDT): 以下のようなケースでコンパイルエラーになりました。

(define a 1)
(let ((lv (lambda () (set! a 2))))
  (dynamic-wind lv (lambda () 'hoge) lv))
*** ERROR: Compile Error: [internal error] stray local variable:
"(stdin)":2:(let ((lv (lambda () (set! a 2)))) ( ...

Stack Trace:
_______________________________________

何故か before と after が違う場合 (↓) にはエラーにはなりませんでした。

(define a 1)
(let ((lv (lambda () (set! a 2)))
      (lv2 (lambda () (set! a 2))))
  (dynamic-wind lv (lambda () 'hoge) lv2))

match-let*がエラーになる(0.9)

teranishi (2010/03/22 06:19:09 PDT): 以下の実行例で、match-let*がエラーを返します。

gosh> (use util.match)
#<undef>
gosh> (match-let* ((x 1)) x)
*** ERROR: Compile Error: unbound variable: match-let*.
"(stdin)":2:(match-let* ((x 1)) x)

Stack Trace:
_______________________________________

libsrc/util/match.scm で match-let*. を定義し忘れているようです。

gauche.testモジュールのtest-record-file関数を呼ぶとエラーになる(0.9)

(2010/03/11 21:42:27 PST): 引数のtypoみたいです。

http-getにおいて、手続きにより解釈されるキーワード引数がメッセージのヘッダにも現れてしまう(0.9)

shibuya 2010/02/20 19:11:22 PST: リファレンスマニュアルの例を実行して、プロトコルアナライザでキャプチャしました。

(use rfc.http)
(call-with-output-file "page.html"
  (lambda (out)
    (http-get "www.schemers.org" "/"
              :sink out :flusher (lambda _ #t))))
GET / HTTP/1.1
Host: www.schemers.org
user-agent: gauche.http/0.9
flusher: #<closure (#f #f)>
sink: #<oport page.html 0x5547b8>

doc/modsrfi.texiのtypo (trunk)

teppey (2010/01/07 07:44:57 PST): partitionの部分です。

Index: doc/modsrfi.texi
===================================================================
--- doc/modsrfi.texi    (revision 6993)
+++ doc/modsrfi.texi    (working copy)
@@ -974,7 +974,7 @@
 @var{list} by @var{pred}, and the second is the result of
 removing elements of @var{list} by @var{pred}.
 @c JP
-[SRFI-1] @code{filter} と @code{remove} は同時に、すなわち2つのリストを
+[SRFI-1] @code{filter} と @code{remove} を同時に、すなわち2つのリストを
 返しますが、一つ目は @var{pred} により @var{list} の要素をフィルタリング
 した結果で、二つ目は @var{pred} により @var{list} の要素を削除した結果
 です。

peek-char などで先読みすると、port-seek,port-tell の位置がずれる(0.9)

teranishi (2009/12/25 16:00:18 PST): 以下の実行例で、peek-char の前後で port-tell の結果が異なります。

gosh> (call-with-input-string "abcd" (lambda (port) (print (port-tell port)) (peek-char port) (print (port-tell port))))
0
1
#<undef>

同じフォーマット文字列でpack,unpackしても元に戻らない(0.9)

teranishi (2009/12/15 06:45:47 PST): 以下の実行例で、同じフォーマット文字列でpack,unpackしているにもかかわらず元の値に戻りません。(文字コードはUTF-8)

gosh> (use binary.pack)
#<undef>
gosh> (unpack "AC" :from-string (pack "AC" '("1" 128) :to-string? #t))
("1" 194)
gosh> (unpack "A2C" :from-string (pack "A2C" '("" 33) :to-string? #t))
("" 32)

存在していない「~$」というシンボルがexportされている?(0.9)

nekoie (2009/11/26 16:13:20 PST): ./lib/gauche/procedure.scm と ./src/autoloads.scm の二箇所で、「~$」というシンボルをexport/autoloadしようとしているようですが、実体が存在していないようです。


Last modified : 2010/09/05 02:32:10 PDT