[uim-commit] r502 - trunk/doc
yamaken at freedesktop.org
yamaken at freedesktop.org
Thu Feb 3 00:23:32 PST 2005
Author: yamaken
Date: 2005-02-03 00:23:29 -0800 (Thu, 03 Feb 2005)
New Revision: 502
Added:
trunk/doc/UIM-SCM
Modified:
trunk/doc/00INDEX
Log:
* doc/00INDEX
- Add UIM-SCM
* doc/UIM-SCM
- New file
- Add new section "Abstract"
- Add new section "Protecting lisp objects from GC"
- Add new section "Internal"
Modified: trunk/doc/00INDEX
===================================================================
--- trunk/doc/00INDEX 2005-02-03 06:58:46 UTC (rev 501)
+++ trunk/doc/00INDEX 2005-02-03 08:23:29 UTC (rev 502)
@@ -5,5 +5,6 @@
HELPER-PROTOCOL Description of the helper message protocol
KEY KEY customizationg guide
PLUGIN Description of the plugin
+UIM-SCM Usage of uim-scm API for developers
UIM-SH How to use uim-sh to debug interactively
XIM-SERVER Description of uim-xim
Added: trunk/doc/UIM-SCM
===================================================================
--- trunk/doc/UIM-SCM 2005-02-03 06:58:46 UTC (rev 501)
+++ trunk/doc/UIM-SCM 2005-02-03 08:23:29 UTC (rev 502)
@@ -0,0 +1,114 @@
+This document describes usage of the uim-scm API and facility for
+developers.
+
+
+* Abstract
+
+ The uim-scm API is responsible for follwing two roles.
+
+ - Provides Scheme interpreter interfaces to input method plugin
+ developers
+
+ - Abstracts Scheme interpreter implementation and narrows its
+ interfaces to provide switcheable base of libuim
+
+ Other developers should not use this API since the API easily causes
+ fatal crash involving GC if you does not pay attention enough. Be
+ careful.
+
+
+* Protecting lisp objects from GC
+
+ uim-scm provides the lisp object type named 'uim_lisp'. Since all of
+ the objects are managed by a conservative mark and sweep GC, you
+ have to protect them from undesirable collection. The word
+ 'protection' means that instructing GC "it's in use, don't
+ mark". There are two methods of protection.
+
+ 1. static storage protection
+
+ You can allocate arbitrary static storage as for uim_lisp by
+ uim_scm_gc_protect(). The function must be invoked before the
+ using the variables.
+
+
+ static uim_lisp foo;
+ static uim_lisp bar;
+
+ void
+ uim_plugin_instance_init(void) {
+ uim_scm_gc_protect(&foo);
+ uim_scm_gc_protect(&bar);
+ }
+
+
+ 2. stack protection
+
+ You can also protect your lisp objects on stack (i.e. auto
+ storage). See following example.
+
+
+ static char *
+ literalize_string(const char *str)
+ {
+ uim_lisp stack_start;
+ uim_lisp form;
+ char *escaped;
+
+ uim_scm_gc_protect_stack(&stack_start);
+ form = uim_scm_list2(uim_scm_make_symbol("string-escape"),
+ uim_scm_make_str(str));
+ escaped = uim_scm_c_str(uim_scm_eval(form));
+ uim_scm_gc_unprotect_stack(&stack_start);
+
+ return escaped;
+ }
+
+
+ Combination of uim_scm_gc_protect_stack(),
+ uim_scm_gc_unprotect_stack() and the dummy variable 'stack_start'
+ consists of the stack protection. In this case, the lisp objects
+ 'form', anonymous return value of uim_scm_make_symbol(),
+ uim_scm_make_str() and uim_scm_eval() are protected by the method
+ (although some objects may be placed into registers, the registers
+ are also protected implicitly).
+
+ The 'stack_start' indicates start point of protected region. And
+ uim_scm_gc_protect_stack() instructs the GC protection. After the
+ invocation, the region from stack_start to top of the stack is
+ left untouched at GC marking.
+
+ Protected stack regions can be nested or duplexed.
+
+ Be careful to place stack_start. There are some bad examples.
+
+ - invalid order
+
+ uim_lisp form; /* XXX out of protected region */
+ uim_lisp stack_start;
+
+ - invalid order (2)
+
+ uim_lisp form, stack_start; /* XXX may by out of protected region */
+
+ - uncertain way
+
+ uim_lisp stack_start, form; /* ??? may be implementation dependent */
+
+
+* Internal
+
+ This API is not intended to provide all R5RS features. Only 'core'
+ ones to write Scheme-C adapters should be added. Consider how
+ frequently it will be used, and whether it should be written by C,
+ when you want to add an API function.
+
+ Current implemenation of uim-scm only provides the Siod
+ interpreter. To avoid namespace pollution, all Siod functions are
+ defined as static and wrapped into uim-scm.c by direct inclusion
+ rather than linked via public symbols. After elaboration of uim-scm
+ API, the Scheme interpreter implementation can be switched to
+ another one such as uim-scm-tinyscheme.c or uim-scm-gauche.c. But
+ *.[hc] under uim/ and *.scm are still depending on Siod in several
+ ways. At least full test suite for *.scm files are required to
+ migrate to another Scheme implementation.
More information about the Uim-commit
mailing list