Gauche:Bugs:log16
Gauche 0.9.3以前のバグ
- (use compat.stk) でエラー (3982bd)
- port-mapなどでコールバックの実行最中ファイルポインタが次の行(位置)を指している(0.9.2)
- gauche.process 内の errorf の引数が足りない (77a6d8)
- thread-poolのjob内で#?=を使うとエラーになる (0.9.2)
- for-each, mapにリストでない引数を与えるとSEGV (b65d04e)
- ユニフォームベクタのTAGvector-copy!
- Windows(MinGW)環境のdynamic-load関数で読み込んだdllを解放せずに終了するとアプリケーションが落ちる (0.9.2)
- construct-json-string
- inexect integerのquotient&remainder (0.9.2)
(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?
- Shiro(2012/04/28 08:56:35 UTC): 直しました。 今ならもう少しこのモジュール改良できそうだけど、元のstkのふるまいを調べるのももはや 面倒だなあ。
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))))))
できれば上記のようにファイルポインタが移動する前の状態でコールバックを評価してほしいのですが、どうでしょうか。
- Shiro(2012/03/09 14:24:25 UTC): なるほど、特に今のようにしている理由はないし、 ポートの状態はreaderの操作に依存するとはいえ、 「fnを呼び出した後で次の要素を獲得するreaderが呼ばれる」と定義しておくことはできますね。 直してました (432fef8)。
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)
- Shiro(2012/03/04 12:15:20 UTC): ども。直しました(7a0e702)
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)
- Shiro(2012/02/19 02:10:45 UTC): これはパラメータの設計の問題だと思うんで、そっちで解決する方向。
- Shiro(2012/05/08 19:35:27 UTC): commit 6b5ac88 で直しました。
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)
- Shiro(2012/02/19 02:10:45 UTC): mapとfor-eachをCで定義しておく必要がなくなったので、 Schemeで定義し直しました。
ユニフォームベクタの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); }
- Shiro(2012/01/18 10:32:29 UTC): 直しました。Mahalo〜
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 */
- Shiro(2011/10/30 03:42:14 PDT): む。これ再現条件(もしくは検出条件)わかりますか? (use srfi-1) や (use gauche.uvector) もdynamic-loadしてるんですが、(exit)で普通に終了できてるようなので。後始末をすることは良いことなんですが、cleanup_main は gaucheをライブラリとして使ってるアプリケーションでは使われないので、これが問題ならばより確実に呼ばれるところに入れたいです。
- aharisu (2011/10/30 07:36:50 PDT): テスト条件は、goshのREPLとテストスクリプトです。gaucheをライブラリとして使うという状況のテストは行っていません。もう少しこのバグの背景を説明すると、現在OpenCVのラッパーを作っています。そこでは自作のdll(ラッパー)が依存している既存のdll(OpenCV本体)を間接的にロードしています。この間接的なロードか、OpenCVのdllを終了処理なしに落としてしまうというののどちらかが問題なのかな、と考えています。一応ですが、Ubuntuで同じテストをした場合は問題なく終了ができています。
- Shiro(2011/10/30 15:40:53 PDT): 「(use srfi-1)した場合でもdllはロードしているのに終了時に問題は起きない」という事実があるので、それはたまたま今までラッキーだっただけで、ちゃんと終了処理しないとだめなものだったのか、それともある条件が重なった場合にだけ起きるのか、を切り分けたい、ということです。確かにFreeLibraryすればdllがリソースの解放をする機会を与えることができるのでやっとくに越したことは無いんですが、せっかく問題が出たのならできればはっきりした理由を知っておきたい、ということですね。
- aharisu (2011/10/30 20:57:55 PDT): もう一度ちゃんとテストしてみようと思いGaucheの0.9.2とOpenCVをインストールしなおしてから自作のプログラムを走らせてみたところ、問題なく終了ができました。いろいろいじくっているうちに僕自身がバグを注入していたのかもしれません。お騒がせしました、と言うしかない状況なのですが、終了処理を行うと一応でも動いたということの理由はわからずじまいです。
- Shiro(2011/10/30 23:55:39 PDT): 気になりますね。また症状が出たら教えてください。こちらでも再現できれば詳しく原因を追求できるかもしれません。
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