comparison src/opaque.h @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents 74fd4e045ea6
children 11054d720c21
comparison
equal deleted inserted replaced
411:12e008d41344 412:697ef44129c6
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 INCLUDED_opaque_h_ 26 #ifndef _XEMACS_OPAQUE_H_
27 #define INCLUDED_opaque_h_ 27 #define _XEMACS_OPAQUE_H_
28 28
29 typedef union 29 typedef union {
30 {
31 struct { Lisp_Object obj; } obj; 30 struct { Lisp_Object obj; } obj;
32 struct { void *p; } p; 31 struct { void *p; } p;
33 struct { double d; } d; 32 struct { double d; } d;
34 } max_align_t; 33 } max_align_t;
35 34
36 typedef struct Lisp_Opaque 35 typedef struct Lisp_Opaque
37 { 36 {
38 struct lcrecord_header header; 37 struct lcrecord_header header;
39 size_t size; 38 Lisp_Object (*markfun) (Lisp_Object obj, void (*markobj) (Lisp_Object));
39 /* An integral size for non-freed objects, an opaque or nil for
40 freed objects. */
41 Lisp_Object size_or_chain;
40 max_align_t data[1]; 42 max_align_t data[1];
41 } Lisp_Opaque; 43 } 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;
42 54
43 DECLARE_LRECORD (opaque, Lisp_Opaque); 55 DECLARE_LRECORD (opaque, Lisp_Opaque);
44 #define XOPAQUE(x) XRECORD (x, opaque, Lisp_Opaque) 56 #define XOPAQUE(x) XRECORD (x, opaque, Lisp_Opaque)
45 #define XSETOPAQUE(x, p) XSETRECORD (x, p, opaque) 57 #define XSETOPAQUE(x, p) XSETRECORD (x, p, opaque)
46 #define OPAQUEP(x) RECORDP (x, opaque) 58 #define OPAQUEP(x) RECORDP (x, opaque)
59 #define GC_OPAQUEP(x) GC_RECORDP (x, opaque)
47 /* #define CHECK_OPAQUE(x) CHECK_RECORD (x, opaque) 60 /* #define CHECK_OPAQUE(x) CHECK_RECORD (x, opaque)
48 Opaque pointers should never escape to the Lisp level, so 61 Opaque pointers should never escape to the Lisp level, so
49 functions should not be doing this. */ 62 functions should not be doing this. */
50 63
51 /* Alternative DATA arguments to make_opaque() */ 64 DECLARE_LRECORD (opaque_list, Lisp_Opaque_List);
52 #define OPAQUE_CLEAR ((const void *) 0) 65 #define XOPAQUE_LIST(x) XRECORD (x, opaque_list, Lisp_Opaque_List)
53 #define OPAQUE_UNINIT ((const void *) -1) 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. */
54 72
55 #define OPAQUE_SIZE(op) ((op)->size) 73 /* Alternative DATA arguments to make_opaque */
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)
56 #define OPAQUE_DATA(op) ((void *) ((op)->data)) 83 #define OPAQUE_DATA(op) ((void *) ((op)->data))
57 #define OPAQUE_MARKFUN(op) ((op)->markfun) 84 #define OPAQUE_MARKFUN(op) ((op)->markfun)
58 #define XOPAQUE_SIZE(op) OPAQUE_SIZE (XOPAQUE (op)) 85 #define XOPAQUE_SIZE(op) OPAQUE_SIZE (XOPAQUE (op))
59 #define XOPAQUE_DATA(op) OPAQUE_DATA (XOPAQUE (op)) 86 #define XOPAQUE_DATA(op) OPAQUE_DATA (XOPAQUE (op))
60 #define XOPAQUE_MARKFUN(op) OPAQUE_MARKFUN (XOPAQUE (op)) 87 #define XOPAQUE_MARKFUN(op) OPAQUE_MARKFUN (XOPAQUE (op))
61 88
62 Lisp_Object make_opaque (const void *data, size_t size); 89 #define get_opaque_ptr(op) (* (void **) XOPAQUE_DATA (op))
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)
63 94
64 typedef struct Lisp_Opaque_Ptr 95 Lisp_Object make_opaque_list (size_t size,
65 { 96 Lisp_Object (*markfun)
66 struct lcrecord_header header; 97 (Lisp_Object obj,
67 void *ptr; 98 void (*markobj) (Lisp_Object)));
68 } Lisp_Opaque_Ptr; 99 Lisp_Object allocate_managed_opaque (Lisp_Object opaque_list,
100 CONST void *data);
101 void free_managed_opaque (Lisp_Object opaque_list, Lisp_Object opaque);
69 102
70 DECLARE_LRECORD (opaque_ptr, Lisp_Opaque_Ptr); 103 #endif /* _XEMACS_OPAQUE_H_ */
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_ */