Author: yamakenz
Date: Mon May 28 03:18:26 2007
New Revision: 4569

Modified:
   trunk/uim/uim-util.c

Log:
* uim/uim-util.c
  - (protected): New static variable
  - (uim_get_language_name_from_locale,
    uim_get_language_code_from_language_name): Fix GC-unprotected lisp
    variables reported by Etsushi on [uim-en 16]. Thanks for the report
  - (setugidp): Add an API precondition
  - (uim_init_util_subrs): Init 'protected'


Modified: trunk/uim/uim-util.c
==============================================================================
--- trunk/uim/uim-util.c        (original)
+++ trunk/uim/uim-util.c        Mon May 28 03:18:26 2007
@@ -46,6 +46,8 @@
 #include "uim-scm-abbrev.h"
 #include "uim-util.h"
 
+static uim_lisp protected;
+
 /* define constants as procedure to ensure unmodifiable */
 static uim_lisp
 sys_libdir()
@@ -447,12 +449,15 @@
 {
   uim_lisp lang_code, lang_name;
 
+  assert(uim_scm_gc_any_contextp());
   assert(locale);
 
   /* Performs adhoc "zh_TW:zh_HK" style locale handling as temporary
    * specification of this function for backward compatibility. */
-  lang_code = uim_scm_callf("langgroup-primary-lang-code", "s", locale);
-  lang_name = uim_scm_callf("lang-code->lang-name", "o", lang_code);
+  protected =
+    lang_code = uim_scm_callf("langgroup-primary-lang-code", "s", locale);
+  protected =
+    lang_name = uim_scm_callf("lang-code->lang-name", "o", lang_code);
   return uim_scm_refer_c_str(lang_name);
 }
 
@@ -461,15 +466,19 @@
 {
   uim_lisp lang_code;
 
+  assert(uim_scm_gc_any_contextp());
   assert(language_name);
 
-  lang_code = uim_scm_callf("lang-name->lang-code", "s", language_name);
+  protected =
+    lang_code = uim_scm_callf("lang-name->lang-code", "s", language_name);
   return uim_scm_refer_c_str(lang_code);
 }
 
 static uim_lisp
 setugidp(void)
 {
+  assert(uim_scm_gc_any_contextp());
+
   if (uim_issetugid()) {
     return uim_scm_t();
   }
@@ -479,6 +488,9 @@
 void
 uim_init_util_subrs(void)
 {
+  protected = uim_scm_f();
+  uim_scm_gc_protect(&protected);
+
   uim_scm_init_subr_0("sys-libdir", sys_libdir);
   uim_scm_init_subr_0("sys-pkglibdir", sys_pkglibdir);
   uim_scm_init_subr_0("sys-datadir", sys_datadir);

Reply via email to