Mercurial > hg > xemacs-beta
comparison src/opaque.h @ 424:11054d720c21 r21-2-20
Import from CVS: tag r21-2-20
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:26:11 +0200 |
parents | 697ef44129c6 |
children |
comparison
equal
deleted
inserted
replaced
423:28d9c139be4c | 424:11054d720c21 |
---|---|
33 } max_align_t; | 33 } max_align_t; |
34 | 34 |
35 typedef struct Lisp_Opaque | 35 typedef struct Lisp_Opaque |
36 { | 36 { |
37 struct lcrecord_header header; | 37 struct lcrecord_header header; |
38 Lisp_Object (*markfun) (Lisp_Object obj, void (*markobj) (Lisp_Object)); | 38 size_t size; |
39 /* An integral size for non-freed objects, an opaque or nil for | |
40 freed objects. */ | |
41 Lisp_Object size_or_chain; | |
42 max_align_t data[1]; | 39 max_align_t data[1]; |
43 } Lisp_Opaque; | 40 } Lisp_Opaque; |
44 | |
45 typedef struct Lisp_Opaque_List | |
46 { | |
47 struct lcrecord_header header; | |
48 /* `markfun' allows you to put lisp objects inside of opaque objects | |
49 without having to create a new object type. */ | |
50 Lisp_Object (*markfun) (Lisp_Object obj, void (*markobj) (Lisp_Object)); | |
51 Lisp_Object free; | |
52 size_t size; | |
53 } Lisp_Opaque_List; | |
54 | 41 |
55 DECLARE_LRECORD (opaque, Lisp_Opaque); | 42 DECLARE_LRECORD (opaque, Lisp_Opaque); |
56 #define XOPAQUE(x) XRECORD (x, opaque, Lisp_Opaque) | 43 #define XOPAQUE(x) XRECORD (x, opaque, Lisp_Opaque) |
57 #define XSETOPAQUE(x, p) XSETRECORD (x, p, opaque) | 44 #define XSETOPAQUE(x, p) XSETRECORD (x, p, opaque) |
58 #define OPAQUEP(x) RECORDP (x, opaque) | 45 #define OPAQUEP(x) RECORDP (x, opaque) |
59 #define GC_OPAQUEP(x) GC_RECORDP (x, opaque) | |
60 /* #define CHECK_OPAQUE(x) CHECK_RECORD (x, opaque) | 46 /* #define CHECK_OPAQUE(x) CHECK_RECORD (x, opaque) |
61 Opaque pointers should never escape to the Lisp level, so | 47 Opaque pointers should never escape to the Lisp level, so |
62 functions should not be doing this. */ | |
63 | |
64 DECLARE_LRECORD (opaque_list, Lisp_Opaque_List); | |
65 #define XOPAQUE_LIST(x) XRECORD (x, opaque_list, Lisp_Opaque_List) | |
66 #define XSETOPAQUE_LIST(x, p) XSETRECORD (x, p, opaque_list) | |
67 #define OPAQUE_LISTP(x) RECORDP (x, opaque_list) | |
68 #define GC_OPAQUE_LISTP(x) GC_RECORDP (x, opaque_list) | |
69 /* #define CHECK_OPAQUE_LIST(x) CHECK_RECORD (x, opaque_list) | |
70 Opaque lists should never escape to the Lisp level, so | |
71 functions should not be doing this. */ | 48 functions should not be doing this. */ |
72 | 49 |
73 /* Alternative DATA arguments to make_opaque */ | 50 /* Alternative DATA arguments to make_opaque */ |
74 #define OPAQUE_CLEAR ((CONST void *) 0) | 51 #define OPAQUE_CLEAR ((CONST void *) 0) |
75 #define OPAQUE_UNINIT ((CONST void *) -1) | 52 #define OPAQUE_UNINIT ((CONST void *) -1) |
76 | 53 |
77 Lisp_Object make_opaque (size_t size, CONST void *data); | 54 #define OPAQUE_SIZE(op) ((op)->size) |
78 Lisp_Object make_opaque_ptr (CONST void *val); | |
79 Lisp_Object make_opaque_long (long val); | |
80 void free_opaque_ptr (Lisp_Object ptr); | |
81 | |
82 #define OPAQUE_SIZE(op) XINT ((op)->size_or_chain) | |
83 #define OPAQUE_DATA(op) ((void *) ((op)->data)) | 55 #define OPAQUE_DATA(op) ((void *) ((op)->data)) |
84 #define OPAQUE_MARKFUN(op) ((op)->markfun) | 56 #define OPAQUE_MARKFUN(op) ((op)->markfun) |
85 #define XOPAQUE_SIZE(op) OPAQUE_SIZE (XOPAQUE (op)) | 57 #define XOPAQUE_SIZE(op) OPAQUE_SIZE (XOPAQUE (op)) |
86 #define XOPAQUE_DATA(op) OPAQUE_DATA (XOPAQUE (op)) | 58 #define XOPAQUE_DATA(op) OPAQUE_DATA (XOPAQUE (op)) |
87 #define XOPAQUE_MARKFUN(op) OPAQUE_MARKFUN (XOPAQUE (op)) | 59 #define XOPAQUE_MARKFUN(op) OPAQUE_MARKFUN (XOPAQUE (op)) |
88 | 60 |
89 #define get_opaque_ptr(op) (* (void **) XOPAQUE_DATA (op)) | 61 Lisp_Object make_opaque (size_t size, CONST void *data); |
90 #define set_opaque_ptr(op, ptr) (get_opaque_ptr (op) = (void *) ptr) | |
91 #define get_opaque_long(op) (* (long *) XOPAQUE_DATA (op)) | |
92 #define set_opaque_long(op, ptr) (get_opaque_long (op) = ptr) | |
93 #define set_opaque_markfun(op, fun) (XOPAQUE_MARKFUN (op) = fun) | |
94 | 62 |
95 Lisp_Object make_opaque_list (size_t size, | 63 typedef struct Lisp_Opaque_Ptr |
96 Lisp_Object (*markfun) | 64 { |
97 (Lisp_Object obj, | 65 struct lcrecord_header header; |
98 void (*markobj) (Lisp_Object))); | 66 void *ptr; |
99 Lisp_Object allocate_managed_opaque (Lisp_Object opaque_list, | 67 } Lisp_Opaque_Ptr; |
100 CONST void *data); | 68 |
101 void free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque); | 69 DECLARE_LRECORD (opaque_ptr, Lisp_Opaque_Ptr); |
70 #define XOPAQUE_PTR(x) XRECORD (x, opaque_ptr, Lisp_Opaque_Ptr) | |
71 #define XSETOPAQUE_PTR(x, p) XSETRECORD (x, p, opaque_ptr) | |
72 #define OPAQUE_PTRP(x) RECORDP (x, opaque_ptr) | |
73 | |
74 Lisp_Object make_opaque_ptr (void *val); | |
75 void free_opaque_ptr (Lisp_Object ptr); | |
76 | |
77 #define get_opaque_ptr(op) (XOPAQUE_PTR (op)->ptr) | |
78 #define set_opaque_ptr(op, ptr_) (XOPAQUE_PTR (op)->ptr = (ptr_)) | |
102 | 79 |
103 #endif /* _XEMACS_OPAQUE_H_ */ | 80 #endif /* _XEMACS_OPAQUE_H_ */ |