Gauche:Bugs:log16

Gauche:Bugs:log16

Gauche 0.9.3以前のバグ


(use compat.stk) でエラー (3982bd)

leque(2012/04/28 06:26:32 UTC):

% gosh -ucompat.stk
gosh: "error": Compile Error: cannot find "gauche/auxsys" in ("/usr/local/share/gauche-0.9/site/lib"
 "/usr/local/share/gauche-0.9/0.9.2/lib" "/usr/local/share/gauche/site/lib" "/usr/local/share/gauche/0.9/lib")
"/usr/local/share/gauche-0.9/0.9.2/lib/compat/stk.scm":36:(define-module compat.stk (use srfi- ...
diff --git a/lib/compat/stk.scm b/lib/compat/stk.scm
index 1afaeb7..498861d 100644
--- a/lib/compat/stk.scm
+++ b/lib/compat/stk.scm
@@ -37,7 +37,6 @@
   (use srfi-1)
   (use srfi-13)
   (use srfi-14)
-  (use gauche.auxsys)
   (use gauche.sequence)
   (export *argc*
           copy-tree remq remv remove string->uninterned-symbol bignum?

port-mapなどでコールバックの実行最中ファイルポインタが次の行(位置)を指している(0.9.2)

aharisu?2012/03/09 11:47:43 UTC:

(define (port-map fn reader)
  (let loop ((item (reader))
             (r    '()))
    (if (eof-object? item)
      (reverse! r)
      (loop (reader) (cons (fn item) r)))))

現状のport-map定義の最後(loop (reader) (cons (fn item) r))の式で、まずreaderを評価してからコールバックが呼ばれるため、readerがread-lineなどファイルポインタを操作する関数の場合、コールバック実行中にはすでに受け取った次の行にファイルポインタが移動してます。

(define (port-map fn reader)
  (let loop ((item (reader))
             (r    '()))
    (if (eof-object? item)
      (reverse! r)
      (let ((ret (fn item)))
        (loop (reader) (cons ret r))))))

できれば上記のようにファイルポインタが移動する前の状態でコールバックを評価してほしいのですが、どうでしょうか。

gauche.process 内の errorf の引数が足りない (77a6d8)

leque(2012/03/04 08:57:13 UTC):

gosh> (use gauche.process)
#<undef>
gosh> (run-process '(ls) :redirects '((>& 2 bar)))
*** ERROR: too few arguments for format string: "redirection '~a' requires an integer file descriptor, but got ~s"
diff --git a/lib/gauche/process.scm b/lib/gauche/process.scm
index af8e9d9..3b25617 100644
--- a/lib/gauche/process.scm
+++ b/lib/gauche/process.scm
@@ -234,7 +234,7 @@
                  (car arg) a2 (cadr arg)))]
       [(<& >&) (unless (integer? a2)
                  (errorf "redirection '~a' requires an integer file ¥
-                          descriptor, but got ~s" a2))]
+                          descriptor, but got ~s" (car arg) a2))]
       [else (errorf "invalid redirection entry: ~s" arg)])))
 
 (define (%check-directory dir)

thread-poolのjob内で#?=を使うとエラーになる (0.9.2)

koguro(2012/02/14 12:59:21 UTC): jobの中で#?=を使うと"the thread doesn't have parameter"のエラーが発生します(debug-print-widthが見えないみたいです)。明示的にgauche.vm.debuggerを読み込むと正常に動くようです。

;(use gauche.vm.debugger)
(use control.thread-pool)
(define pool (make-thread-pool 1))
(add-job! pool (lambda ()
                 (guard (e (else (format (current-error-port)
                                     "~a" (~ e 'message))))
                   #?=1)))
(wait-all pool)
% gosh a.scm
the thread #<thread #f runnable 0x1005c1960> doesn't have parameter (6:6)

for-each, mapにリストでない引数を与えるとSEGV (b65d04e)

teppey (2012/02/12 16:21:58 UTC): 以下のように実行するとSEGVします。

$ uname -srm
Linux 3.0.0-1-amd64 x86_64
$ src/gosh -V
Gauche scheme shell, version 0.9.2 [utf-8,pthreads], x86_64-unknown-linux-gnu
$ src/gosh -ftest -E 'for-each print 1'
zsh: segmentation fault  src/gosh -ftest -E 'for-each print 1'
$

以前stdlib.stubで定義されていたときと同様に型を指定すると、ひとまず落ちなくなりました。

diff --git a/src/liblist.scm b/src/liblist.scm
index 21f3ff7..20b8688 100644
--- a/src/liblist.scm
+++ b/src/liblist.scm
@@ -185,8 +185,8 @@
-
 (define-cproc monotonic-merge (sequences::<list>) Scm_MonotonicMerge1)
-
-(define-cproc map (proc arg1 :rest args) Scm_Map)
-(define-cproc for-each (proc arg1 :rest args) Scm_ForEach)
+(define-cproc map (proc arg1::<list> :rest args) Scm_Map)
+(define-cproc for-each (proc arg1::<list> :rest args) Scm_ForEach)
-
-
 (select-module gauche)

ユニフォームベクタのTAGvector-copy!

shinya (2012/01/18 09:15:02 UTC): TAGvector-copy!でtargetとsourceが同じ場合、うまく動かないことがあります。

パッチ

Index: ext/uvector/uvector.c.tmpl
===================================================================
--- ext/uvector/uvector.c.tmpl  (リビジョン 7388)
+++ ext/uvector/uvector.c.tmpl  (作業コピー)
@@ -39,7 +39,7 @@
 #include <stdlib.h>
 #include <math.h>
 #include <limits.h>
-#include <string.h>  /* for memcpy() */
+#include <string.h>  /* for memmove() */
 #include <gauche.h>
 #include <gauche/extend.h>
 #include <gauche/builtin-syms.h>
@@ -356,9 +356,9 @@
     if (dlen - dstart > send - sstart)  size = send - sstart;
     else size = dlen - dstart;
 
-    memcpy(SCM_${T}VECTOR_ELEMENTS(dst) + dstart,
-           SCM_${T}VECTOR_ELEMENTS(src) + sstart,
-           size * sizeof(${etype}));
+    memmove(SCM_${T}VECTOR_ELEMENTS(dst) + dstart,
+            SCM_${T}VECTOR_ELEMENTS(src) + sstart,
+            size * sizeof(${etype}));
     return SCM_OBJ(dst);
 }

Windows(MinGW)環境のdynamic-load関数で読み込んだdllを解放せずに終了するとアプリケーションが落ちる (0.9.2)

aharisu (2011/10/30 00:32:56 PDT) : 拡張モジュール作成中に気付いたのですが、Windows環境ではLoadLibraryで読み込んだライブラリをFreeLibraryせずに終了しようとするとアプリケーションが落ちるようです。 そのしのぎのコードですが対応したものの差分を張り付けておきます。

--- /Gauche-0.9.2/src/load.c    2011-08-01 17:16:26.000000000 +0900
+++ load.c      2011-10-30 14:10:45.000000000 +0900
@@ -889,6 +889,22 @@
     return SCM_TRUE;
 }
 
+SCM_EXTERN ScmObj Scm_DynCleanup()
+{
+       dlobj* z = NULL;
+
+    (void)SCM_INTERNAL_MUTEX_LOCK(ldinfo.dso_mutex);
+       for(z = ldinfo.dso_list; z; z = z->next) {
+               if(z->loaded && z->handle) {
+                       dl_close(z->handle);
+                       z->handle = NULL;
+                       z->loaded = FALSE;
+               }
+       }
+
+    (void)SCM_INTERNAL_MUTEX_UNLOCK(ldinfo.dso_mutex);
+}
+
 /*------------------------------------------------------------------
  * Require and provide
  */
--- /Gauche-0.9.2/src/gauche/load.h     2011-07-28 08:49:22.000000000 +0900
+++ gauche/load.h       2011-10-30 13:17:22.000000000 +0900
@@ -98,6 +98,7 @@
  */
 
 SCM_EXTERN ScmObj Scm_DynLoad(ScmString *path, ScmObj initfn, u_long flags);
+SCM_EXTERN ScmObj Scm_DynCleanup();
 
 /*=================================================================
  * Require & Provide
--- /Gauche-0.9.2/src/main.c    2011-07-28 08:49:22.000000000 +0900
+++ main.c      2011-10-30 14:10:45.000000000 +0900
@@ -323,6 +323,9 @@
                  SCM_OBJ(Scm_GaucheModule()),
                  NULL);    /* ignore errors */
     }
+
+       /* Clearnup Dynamic Load Module */
+       Scm_DynCleanup();
 }
 
 /* Error handling */

construct-json-string

齊藤 (2011/09/07 05:47:34 PDT) : construct-json-string が不正な JSON を生成する。

http://valvallow.blogspot.com/2011/09/gaucherfcjson.html

gosh> (use rfc.json)
#<undef>
gosh> (construct-json-string (parse-json-string "[\"×\"]"))
"[\"\\u  d7\"]"
gosh> (parse-json-string (construct-json-string (parse-json-string "[\"×\"]")))
*** JSON-PARSE-ERROR: expecting hexadecimal digit at 4, but got #\space

パッチ。

diff --git a/lib/rfc/json.scm b/lib/rfc/json.scm
index cbcf0bb..30562d7 100644
--- a/lib/rfc/json.scm
+++ b/lib/rfc/json.scm
@@ -198,7 +198,7 @@
   (define (print-char c)
     (cond [(eqv? c #\") (write-char #\\) (write-char c)]
           [(char-set-contains? char-set:ascii c) (write-char c)]
-          [else (format #t "\\u~4,0x" (char->ucs c))]))
+          [else (format #t "\\u~4,'0x" (char->ucs c))]))
   (display "\"")
   (string-for-each print-char str)
   (display "\""))

inexect integerのquotient&remainder (0.9.2)

Shiro(2011/08/08 00:03:55 PDT): 実はかなり前からのバグ。r6rsのdiv, mod等を実装した時に 不正確数までサポートを拡張して、エンバグした模様。

gosh> (quotient&remainder 3 2)
1
1
gosh> (quotient&remainder 3.0 2)
2.0
-1.0
More ...