68
68
typedef struct uim_opaque * uim_lisp;
69
69
typedef void (*uim_func_ptr)(void);
70
typedef void *(*uim_gc_gate_func_ptr)(void *);
71
72
#define UIM_SCM_FALSEP(x) (uim_scm_eq((x), uim_scm_f()))
72
73
#define UIM_SCM_NFALSEP(x) (!uim_scm_eq((x), uim_scm_f()))
109
110
uim_scm_set_lib_path(const char *path);
111
112
#if UIM_SCM_GCC4_READY_GC
113
#define UIM_SCM_NOINLINE __attribute__((__noinline__))
115
#define UIM_SCM_NOINLINE
116
#endif /* __GNUC__ */
119
* Function caller with protecting lisp objects on stack from GC
121
* The protection is safe against with variable reordering on a stack
122
* frame performed in some compilers as anti-stack smashing or
125
#define UIM_SCM_GC_PROTECTED_CALL(ret, ret_type, func, args) \
126
UIM_SCM_GC_PROTECTED_CALL_INTERNAL(ret = , ret_type, func, args)
128
#define UIM_SCM_GC_PROTECTED_CALL_VOID(func, args) \
129
UIM_SCM_GC_PROTECTED_CALL_INTERNAL((void), void, func, args)
131
#define UIM_SCM_GC_PROTECTED_CALL_INTERNAL(exp_ret, ret_type, func, args) \
133
/* ensure that func is uninlined */ \
134
ret_type (*volatile fp)() = (ret_type (*)())&func; \
135
uim_lisp *stack_start; \
137
if (0) exp_ret func args; /* compile-time type check */ \
138
stack_start = uim_scm_gc_current_stack(); \
139
uim_scm_gc_protect_stack(stack_start); \
141
uim_scm_gc_unprotect_stack(stack_start); \
142
} while (/* CONSTCOND */ 0)
145
* Ordinary programs should not call these functions directly. Use
146
* UIM_SCM_GC_PROTECTED_CALL*() instead.
149
#define uim_scm_gc_current_stack uim_scm_gc_current_stack_internal
150
#define uim_scm_gc_protect_stack uim_scm_gc_protect_stack_internal
152
#define uim_scm_gc_current_stack (*uim_scm_gc_current_stack_ptr)
153
#define uim_scm_gc_protect_stack (*uim_scm_gc_protect_stack_ptr)
154
#endif /* __GNUC__ */
156
114
uim_scm_gc_protect(uim_lisp *location);
158
uim_scm_gc_unprotect_stack(uim_lisp *stack_start);
161
uim_scm_gc_current_stack_internal(void) UIM_SCM_NOINLINE;
163
uim_scm_gc_protect_stack_internal(uim_lisp *stack_start) UIM_SCM_NOINLINE;
116
uim_scm_gc_unprotect(uim_lisp *location);
118
uim_scm_call_with_gc_ready_stack(uim_gc_gate_func_ptr func, void *arg);
164
119
#else /* UIM_SCM_GCC4_READY_GC */
166
121
uim_scm_gc_protect(uim_lisp *location);
179
134
uim_scm_eval(uim_lisp obj);
181
136
uim_scm_eval_c_string(const char *str);
137
/* uim_scm_return_value() should only used to retrieve result of
138
* UIM_EVAL_FSTRINGn() or UIM_EVAL_STRING(). */
183
140
uim_scm_return_value(void);
261
218
uim_scm_cons(uim_lisp car, uim_lisp cdr);
263
uim_scm_car(uim_lisp cell);
265
uim_scm_cdr(uim_lisp cell);
267
uim_scm_cadr(uim_lisp cell);
269
uim_scm_caar(uim_lisp cell);
271
uim_scm_cdar(uim_lisp cell);
273
uim_scm_cddr(uim_lisp cell);
275
uim_scm_length(uim_lisp list);
277
uim_scm_reverse(uim_lisp cell);
220
uim_scm_car(uim_lisp pair);
222
uim_scm_cdr(uim_lisp pair);
224
uim_scm_cadr(uim_lisp lst);
226
uim_scm_caar(uim_lisp lst);
228
uim_scm_cdar(uim_lisp lst);
230
uim_scm_cddr(uim_lisp lst);
232
uim_scm_length(uim_lisp lst);
234
uim_scm_reverse(uim_lisp lst);
279
237
#ifdef __cplusplus