Mercurial > hg > xemacs-beta
comparison src/opaque.h @ 398:74fd4e045ea6 r21-2-29
Import from CVS: tag r21-2-29
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:13:30 +0200 |
parents | 064ab7fed2e0 |
children | 697ef44129c6 |
comparison
equal
deleted
inserted
replaced
397:f4aeb21a5bad | 398:74fd4e045ea6 |
---|---|
21 | 21 |
22 /* Synched up with: Not in FSF. */ | 22 /* Synched up with: Not in FSF. */ |
23 | 23 |
24 /* Written by Ben Wing, October 1993. */ | 24 /* Written by Ben Wing, October 1993. */ |
25 | 25 |
26 #ifndef _XEMACS_OPAQUE_H_ | 26 #ifndef INCLUDED_opaque_h_ |
27 #define _XEMACS_OPAQUE_H_ | 27 #define INCLUDED_opaque_h_ |
28 | 28 |
29 typedef union { | 29 typedef union |
30 { | |
30 struct { Lisp_Object obj; } obj; | 31 struct { Lisp_Object obj; } obj; |
31 struct { void *p; } p; | 32 struct { void *p; } p; |
32 struct { double d; } d; | 33 struct { double d; } d; |
33 } max_align_t; | 34 } max_align_t; |
34 | 35 |
35 typedef struct Lisp_Opaque | 36 typedef struct Lisp_Opaque |
36 { | 37 { |
37 struct lcrecord_header header; | 38 struct lcrecord_header header; |
38 Lisp_Object (*markfun) (Lisp_Object obj, void (*markobj) (Lisp_Object)); | 39 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]; | 40 max_align_t data[1]; |
43 } Lisp_Opaque; | 41 } 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 | 42 |
55 DECLARE_LRECORD (opaque, Lisp_Opaque); | 43 DECLARE_LRECORD (opaque, Lisp_Opaque); |
56 #define XOPAQUE(x) XRECORD (x, opaque, Lisp_Opaque) | 44 #define XOPAQUE(x) XRECORD (x, opaque, Lisp_Opaque) |
57 #define XSETOPAQUE(x, p) XSETRECORD (x, p, opaque) | 45 #define XSETOPAQUE(x, p) XSETRECORD (x, p, opaque) |
58 #define OPAQUEP(x) RECORDP (x, opaque) | 46 #define OPAQUEP(x) RECORDP (x, opaque) |
59 #define GC_OPAQUEP(x) GC_RECORDP (x, opaque) | |
60 /* #define CHECK_OPAQUE(x) CHECK_RECORD (x, opaque) | 47 /* #define CHECK_OPAQUE(x) CHECK_RECORD (x, opaque) |
61 Opaque pointers should never escape to the Lisp level, so | 48 Opaque pointers should never escape to the Lisp level, so |
62 functions should not be doing this. */ | 49 functions should not be doing this. */ |
63 | 50 |
64 DECLARE_LRECORD (opaque_list, Lisp_Opaque_List); | 51 /* Alternative DATA arguments to make_opaque() */ |
65 #define XOPAQUE_LIST(x) XRECORD (x, opaque_list, Lisp_Opaque_List) | 52 #define OPAQUE_CLEAR ((const void *) 0) |
66 #define XSETOPAQUE_LIST(x, p) XSETRECORD (x, p, opaque_list) | 53 #define OPAQUE_UNINIT ((const void *) -1) |
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. */ | |
72 | 54 |
73 /* Alternative DATA arguments to make_opaque */ | 55 #define OPAQUE_SIZE(op) ((op)->size) |
74 #define OPAQUE_CLEAR ((CONST void *) 0) | |
75 #define OPAQUE_UNINIT ((CONST void *) -1) | |
76 | |
77 Lisp_Object make_opaque (size_t size, CONST void *data); | |
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)) | 56 #define OPAQUE_DATA(op) ((void *) ((op)->data)) |
84 #define OPAQUE_MARKFUN(op) ((op)->markfun) | 57 #define OPAQUE_MARKFUN(op) ((op)->markfun) |
85 #define XOPAQUE_SIZE(op) OPAQUE_SIZE (XOPAQUE (op)) | 58 #define XOPAQUE_SIZE(op) OPAQUE_SIZE (XOPAQUE (op)) |
86 #define XOPAQUE_DATA(op) OPAQUE_DATA (XOPAQUE (op)) | 59 #define XOPAQUE_DATA(op) OPAQUE_DATA (XOPAQUE (op)) |
87 #define XOPAQUE_MARKFUN(op) OPAQUE_MARKFUN (XOPAQUE (op)) | 60 #define XOPAQUE_MARKFUN(op) OPAQUE_MARKFUN (XOPAQUE (op)) |
88 | 61 |
89 #define get_opaque_ptr(op) (* (void **) XOPAQUE_DATA (op)) | 62 Lisp_Object make_opaque (const void *data, size_t size); |
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 | 63 |
95 Lisp_Object make_opaque_list (size_t size, | 64 typedef struct Lisp_Opaque_Ptr |
96 Lisp_Object (*markfun) | 65 { |
97 (Lisp_Object obj, | 66 struct lcrecord_header header; |
98 void (*markobj) (Lisp_Object))); | 67 void *ptr; |
99 Lisp_Object allocate_managed_opaque (Lisp_Object opaque_list, | 68 } Lisp_Opaque_Ptr; |
100 CONST void *data); | |
101 void free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque); | |
102 | 69 |
103 #endif /* _XEMACS_OPAQUE_H_ */ | 70 DECLARE_LRECORD (opaque_ptr, Lisp_Opaque_Ptr); |
71 #define XOPAQUE_PTR(x) XRECORD (x, opaque_ptr, Lisp_Opaque_Ptr) | |
72 #define XSETOPAQUE_PTR(x, p) XSETRECORD (x, p, opaque_ptr) | |
73 #define OPAQUE_PTRP(x) RECORDP (x, opaque_ptr) | |
74 | |
75 Lisp_Object make_opaque_ptr (void *val); | |
76 void free_opaque_ptr (Lisp_Object ptr); | |
77 | |
78 #define get_opaque_ptr(op) (XOPAQUE_PTR (op)->ptr) | |
79 #define set_opaque_ptr(op, ptr_) (XOPAQUE_PTR (op)->ptr = (ptr_)) | |
80 | |
81 #endif /* INCLUDED_opaque_h_ */ |