summaryrefslogtreecommitdiff
path: root/libguile/smob.h
diff options
context:
space:
mode:
authorLudovic Courtes <ludovic.courtes@laas.fr>2006-05-22 19:12:12 +0000
committerLudovic Courtès <ludo@gnu.org>2008-09-05 09:33:20 +0200
commit378f262561cb381e8b3cff3faac1157605422015 (patch)
tree1dbfc664ccdcade9d54e1878246caf22e947359c /libguile/smob.h
parent6bad09ba9f203f5aaf8024ab198995d2470fb688 (diff)
downloadguile-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.h67
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)