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_ */