Author: yamakenz
Date: Wed May 23 06:16:15 2007
New Revision: 4556

Modified:
   trunk/uim/uim.c

Log:
* uim/uim.c
  - (struct uim_get_candidate_args): New type
  - (uim_get_candidate_internal): New static function
  - (uim_get_candidate): Fix the assertion failure on uim-fep reported
    in [uim-en 7]. Thanks Etsushi


Modified: trunk/uim/uim.c
==============================================================================
--- trunk/uim/uim.c     (original)
+++ trunk/uim/uim.c     Wed May 23 06:16:15 2007
@@ -48,6 +48,12 @@
 #define OK 0
 
 static void *uim_init_internal(void *dummy);
+struct uim_get_candidate_args {
+  uim_context uc;
+  int index;
+  int enum_hint;
+};
+static void *uim_get_candidate_internal(struct uim_get_candidate_args *args);
 static uim_lisp get_nth_im(uim_context uc, int nth);
 
 static uim_bool uim_initialized;
@@ -295,17 +301,31 @@
 uim_candidate
 uim_get_candidate(uim_context uc, int index, int accel_enumeration_hint)
 {
-  uim_candidate cand;
-  uim_lisp triple;
-  const char *str, *head, *ann;
+  struct uim_get_candidate_args args;
 
-  assert(uim_scm_gc_protected_contextp());
+  assert(uim_scm_gc_any_contextp());
   assert(uc);
   assert(index >= 0);
   assert(accel_enumeration_hint >= 0);
 
+  args.uc = uc;
+  args.index = index;
+  args.enum_hint = accel_enumeration_hint;
+
+  return 
(uim_candidate)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_get_candidate_internal,
 &args);
+}
+
+static void *
+uim_get_candidate_internal(struct uim_get_candidate_args *args)
+{
+  uim_context uc;
+  uim_candidate cand;
+  uim_lisp triple;
+  const char *str, *head, *ann;
+
+  uc = args->uc;
   triple = uim_scm_callf("get-candidate", "pii",
-                         uc, index, accel_enumeration_hint);
+                        uc, args->index, args->enum_hint);
 
   cand = malloc(sizeof(*cand));
   if (cand) {
@@ -320,7 +340,7 @@
     }
   }
 
-  return cand;
+  return (void *)cand;
 }
 
 const char *

Reply via email to