KIHARA Hideto
deton****@m1*****
2003年 10月 9日 (木) 21:35:17 JST
Thu, Oct 09, 2003 at 03:44:10AM +0900 において TOKUNAGA Hiroyuki さん曰く: > たしかに嬉しくないです。私もschemeのコードいじってて、よくsegvって困っ > ています。しかし、schemeインタプリタの内部は正直よくわかってないので、修 今回の件に関しては、gtk-im-uim.cで落ちているので、 以下のような感じで変更すればいいのではないかと思ったのですが、 全体として見るとこれでは解決にはなっていない、ということなのでしょうか。 * uim_create_context()がNULLを返していて、 それをuic->ucに代入して、uic->ucのアドレスにアクセスしているので、SEGV。 uim_create_context()がNULLを返した場合はそれ以上処理をしないで im_module_create()からNULLで返るように変更。 * helper関係の初期化より先にuim_create_context()を呼ぶように変更。 uim_create_context()失敗時にhelper関係の初期化を取り消す処理を 入れないですむようにするため。 * im_module_list()内でもuim_create_context()の戻り値が NULLかどうかチェックするように変更。im_module_create()と同様。 diff -upr uim-0.1.0.orig/gtk/gtk-im-uim.c uim-0.1.0/gtk/gtk-im-uim.c --- uim-0.1.0.orig/gtk/gtk-im-uim.c Wed Oct 8 00:35:57 2003 +++ uim-0.1.0/gtk/gtk-im-uim.c Thu Oct 9 21:01:58 2003 @@ -892,6 +892,16 @@ im_module_create (const gchar *context_i context_id = &context_id[4]; } + uim_init(); + + uic->uc = uim_create_context(uic, "UTF-8", + NULL, (char *)context_id, + im_uim_commit_string); + if (uic->uc == NULL) { + parent_class->finalize(obj); + return NULL; + } + if(im_uim_fd < 0) { im_uim_fd = uim_helper_init_client_fd(im_uim_helper_disconnect_cb); if (im_uim_fd >= 0) { @@ -900,11 +910,6 @@ im_module_create (const gchar *context_i } } - uim_init(); - - uic->uc = uim_create_context(uic, "UTF-8", - NULL, (char *)context_id, - im_uim_commit_string); /**/ uim_set_mode_cb(uic->uc, mode_cb); uim_set_preedit_cb(uic->uc, clear_cb, @@ -947,7 +952,10 @@ im_module_list(GtkIMContextInfo ***conte uim_init(); uc = uim_create_context(NULL, "UTF-8", NULL, NULL, NULL); - nr = uim_get_nr_im(uc); + if (uc == NULL) + nr = 0; + else + nr = uim_get_nr_im(uc); info_list = malloc(sizeof(GtkIMContextInfo*)*nr); for (i = 0; i < nr; i++) { * ~/.uim等の起動時に読み込まれるスクリプト中でも、 LIBUIM_VERBOSEが効くように変更。 ~/.uim中のバグを見つけやすくするため。 * siod_outputがstdoutだと、一部のメッセージが表示されないことがあるので、 stderrに変更。 diff -upr uim-0.1.0.orig/uim/uim.c uim-0.1.0/uim/uim.c --- uim-0.1.0.orig/uim/uim.c Tue Oct 7 00:35:03 2003 +++ uim-0.1.0/uim/uim.c Thu Oct 9 20:55:01 2003 @@ -394,8 +394,11 @@ uim_init_scm() "-v0", }; + if (getenv("LIBUIM_VERBOSE")) { + siod_argv[6] = "-v10"; + } /* init siod */ - siod_output = stdout; + siod_output = stderr; process_cla (7, siod_argv, 1); init_storage (); init_subrs (); * LIBUIM_VERBOSEの設定を先頭に移動。設定が効かないことがあったので。 * ついでに、bashスクリプトでなく、shスクリプトに変更。 bashが入っていない環境でも使えるように。 diff -upr uim-0.1.0.orig/test.sh.in uim-0.1.0/test.sh.in --- uim-0.1.0.orig/test.sh.in Sat Sep 13 05:00:00 2003 +++ uim-0.1.0/test.sh.in Thu Oct 9 20:58:51 2003 @@ -1,15 +1,15 @@ -#!/bin/bash +#!/bin/sh -export LD_LIBRARY_PATH=uim/.libs/ +LIBUIM_VERBOSE=1; export LIBUIM_VERBOSE +LD_LIBRARY_PATH=uim/.libs/; export LD_LIBRARY_PATH # not to read ~/.uim -export LIBUIM_VANILLA=1 +LIBUIM_VANILLA=1; export LIBUIM_VANILLA # scheme files will be read from scm/ -export LIBUIM_SCM_FILES=@SRCDIR@/scm/ +LIBUIM_SCM_FILES=@SRCDIR@/scm/; export LIBUIM_SCM_FILES gtk-query-immodules-2.0 gtk/.libs/im*.so > immodules -export GTK_IM_MODULE_PATH=gtk/.libs/ -export GTK_IM_MODULE_FILE=./immodules -export LIBUIM_VERBOSE=1 +GTK_IM_MODULE_PATH=gtk/.libs/; export GTK_IM_MODULE_PATH +GTK_IM_MODULE_FILE=./immodules; export GTK_IM_MODULE_FILE #LANG= gnome-character-map #LANG= gedit #gtk-demo -- 木原 英人 / KIHARA, Hideto / deton****@m1***** http://www1.interq.or.jp/~deton/