diff options
author | Ludovic Courtes <ludovic.courtes@laas.fr> | 2006-05-22 19:12:12 +0000 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2008-09-05 09:33:20 +0200 |
commit | 378f262561cb381e8b3cff3faac1157605422015 (patch) | |
tree | 1dbfc664ccdcade9d54e1878246caf22e947359c /libguile/smob.h | |
parent | 6bad09ba9f203f5aaf8024ab198995d2470fb688 (diff) | |
download | guile-378f262561cb381e8b3cff3faac1157605422015.tar.gz |
Added support for SMOB custom mark procedures.
* libguile/gc.c (scm_gc_mark): Removed.
(scm_gc_mark_dependencies): Removed.
(scm_mark_locations): Removed.
* libguile/gc.h (scm_gc_mark_dependencies): Removed.
(scm_mark_locations): Removed.
* libguile/inline.h (scm_cell): Use `GC_MALLOC ()' instead of `GC_malloc ()'.
* libguile/smob.c (smob_freelist): New.
(smob_gc_kind): New.
(smob_mark): New.
(scm_gc_mark): New.
(scm_i_new_smob_with_mark_proc): New.
(scm_smob_prehistory): Initialize `smob_freelist' and `smob_gc_kind'.
* libguile/smob.h (scm_i_new_smob_with_mark_proc): New declaration.
(SCM_NEWSMOB): Use it if a mark procedure is available.
(SCM_NEWSMOB2): Likewise.
(SCM_NEWSMOB3): Likewise.
* libguile/threads.c (guilify_self_1): Initialize the
`current_mark_stack_*' fields.
* libguile/threads.h (scm_i_thread)[current_mark_stack_ptr]: New field.
[current_mark_stack_limit]: New field.
git-archimport-id: lcourtes@laas.fr--2005-libre/guile-core--boehm-gc--1.9--patch-22
Diffstat (limited to 'libguile/smob.h')
-rw-r--r-- | libguile/smob.h | 67 |
1 files changed, 41 insertions, 26 deletions
diff --git a/libguile/smob.h b/libguile/smob.h index a4d70c8be..0a0da8324 100644 --- a/libguile/smob.h +++ b/libguile/smob.h @@ -44,40 +44,55 @@ typedef struct scm_smob_descriptor int gsubr_type; /* Used in procprop.c */ } scm_smob_descriptor; + +SCM_API SCM scm_i_new_smob_with_mark_proc (scm_t_bits tc, + scm_t_bits, scm_t_bits, scm_t_bits); -#define SCM_NEWSMOB(z, tc, data) \ -do { \ - z = scm_cell ((tc), (scm_t_bits) (data)); \ -} while (0) -#define SCM_RETURN_NEWSMOB(tc, data) \ - do { SCM __SCM_smob_answer; \ - SCM_NEWSMOB (__SCM_smob_answer, (tc), (data)); \ - return __SCM_smob_answer; \ - } while (0) -#define SCM_NEWSMOB2(z, tc, data1, data2) \ -do { \ - z = scm_double_cell ((tc), (scm_t_bits)(data1), (scm_t_bits)(data2), 0); \ -} while (0) +#define SCM_NEWSMOB(z, tc, data) \ +do \ + { \ + z = (scm_smobs[SCM_TC2SMOBNUM (tc)].mark \ + ? scm_i_new_smob_with_mark_proc ((tc), (scm_t_bits)(data), \ + 0, 0) \ + : scm_cell (tc, (scm_t_bits)(data))); \ + } \ +while (0) -#define SCM_RETURN_NEWSMOB2(tc, data1, data2) \ - do { SCM __SCM_smob_answer; \ - SCM_NEWSMOB2 (__SCM_smob_answer, (tc), (data1), (data2)); \ - return __SCM_smob_answer; \ +#define SCM_RETURN_NEWSMOB(tc, data) \ + do { SCM __SCM_smob_answer; \ + SCM_NEWSMOB (__SCM_smob_answer, (tc), (data)); \ + return __SCM_smob_answer; \ } while (0) -#define SCM_NEWSMOB3(z, tc, data1, data2, data3) \ -do { \ - z = scm_double_cell ((tc), (scm_t_bits)(data1), \ - (scm_t_bits)(data2), (scm_t_bits)(data3)); \ -} while (0) +#define SCM_NEWSMOB2(z, tc, data1, data2) \ + SCM_NEWSMOB3 (z, tc, data1, data2, 0) + +#define SCM_RETURN_NEWSMOB2(tc, data1, data2) \ + do { SCM __SCM_smob_answer; \ + SCM_NEWSMOB2 (__SCM_smob_answer, (tc), (data1), (data2)); \ + return __SCM_smob_answer; \ + } while (0) -#define SCM_RETURN_NEWSMOB3(tc, data1, data2, data3) \ - do { SCM __SCM_smob_answer; \ - SCM_NEWSMOB3 (__SCM_smob_answer, (tc), (data1), (data2), (data3)); \ - return __SCM_smob_answer; \ +#define SCM_NEWSMOB3(z, tc, data1, data2, data3) \ +do \ + { \ + z = (scm_smobs[SCM_TC2SMOBNUM (tc)].mark \ + ? scm_i_new_smob_with_mark_proc (tc, (scm_t_bits)(data1), \ + (scm_t_bits)(data2), \ + (scm_t_bits)(data3)) \ + : scm_double_cell ((tc), (scm_t_bits)(data1), \ + (scm_t_bits)(data2), \ + (scm_t_bits)(data3))); \ + } \ +while (0) + +#define SCM_RETURN_NEWSMOB3(tc, data1, data2, data3) \ + do { SCM __SCM_smob_answer; \ + SCM_NEWSMOB3 (__SCM_smob_answer, (tc), (data1), (data2), (data3)); \ + return __SCM_smob_answer; \ } while (0) |