comparison src/opaque.h @ 380:8626e4521993 r21-2-5

Import from CVS: tag r21-2-5
author cvs
date Mon, 13 Aug 2007 11:07:10 +0200
parents 376386a54a3c
children 064ab7fed2e0
comparison
equal deleted inserted replaced
379:76b7d63099ad 380:8626e4521993
24 /* Written by Ben Wing, October 1993. */ 24 /* Written by Ben Wing, October 1993. */
25 25
26 #ifndef _XEMACS_OPAQUE_H_ 26 #ifndef _XEMACS_OPAQUE_H_
27 #define _XEMACS_OPAQUE_H_ 27 #define _XEMACS_OPAQUE_H_
28 28
29 struct Lisp_Opaque 29 typedef union {
30 struct { Lisp_Object obj; } obj;
31 struct { void *p; } p;
32 struct { double d; } d;
33 } max_align_t;
34
35 typedef struct Lisp_Opaque
30 { 36 {
31 struct lcrecord_header header; 37 struct lcrecord_header header;
32 Lisp_Object (*markfun) (Lisp_Object obj, void (*markobj) (Lisp_Object)); 38 Lisp_Object (*markfun) (Lisp_Object obj, void (*markobj) (Lisp_Object));
33 /* An integral size for non-freed objects, an opaque or nil for 39 /* An integral size for non-freed objects, an opaque or nil for
34 freed objects. */ 40 freed objects. */
35 Lisp_Object size_or_chain; 41 Lisp_Object size_or_chain;
36 /* It's actually more space-efficient to declare this as an int 42 max_align_t data[1];
37 rather than a char, because the structure will get rounded up 43 } Lisp_Opaque;
38 in size by the compiler anyway. */
39 int data[1];
40 };
41 44
42 struct Lisp_Opaque_List 45 typedef struct Lisp_Opaque_List
43 { 46 {
44 struct lcrecord_header header; 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. */
45 Lisp_Object (*markfun) (Lisp_Object obj, void (*markobj) (Lisp_Object)); 50 Lisp_Object (*markfun) (Lisp_Object obj, void (*markobj) (Lisp_Object));
46 Lisp_Object free; 51 Lisp_Object free;
47 int size; 52 size_t size;
48 }; 53 } Lisp_Opaque_List;
49 54
50 DECLARE_LRECORD (opaque, struct Lisp_Opaque); 55 DECLARE_LRECORD (opaque, Lisp_Opaque);
51 #define XOPAQUE(x) XRECORD (x, opaque, struct Lisp_Opaque) 56 #define XOPAQUE(x) XRECORD (x, opaque, Lisp_Opaque)
52 #define XSETOPAQUE(x, p) XSETRECORD (x, p, opaque) 57 #define XSETOPAQUE(x, p) XSETRECORD (x, p, opaque)
53 #define OPAQUEP(x) RECORDP (x, opaque) 58 #define OPAQUEP(x) RECORDP (x, opaque)
54 #define GC_OPAQUEP(x) GC_RECORDP (x, opaque) 59 #define GC_OPAQUEP(x) GC_RECORDP (x, opaque)
55 /* #define CHECK_OPAQUE(x) CHECK_RECORD (x, opaque) 60 /* #define CHECK_OPAQUE(x) CHECK_RECORD (x, opaque)
56 Opaque pointers should never escape to the Lisp level, so 61 Opaque pointers should never escape to the Lisp level, so
57 functions should not be doing this. */ 62 functions should not be doing this. */
58 63
59 DECLARE_LRECORD (opaque_list, struct Lisp_Opaque_List); 64 DECLARE_LRECORD (opaque_list, Lisp_Opaque_List);
60 #define XOPAQUE_LIST(x) XRECORD (x, opaque_list, struct Lisp_Opaque_List) 65 #define XOPAQUE_LIST(x) XRECORD (x, opaque_list, Lisp_Opaque_List)
61 #define XSETOPAQUE_LIST(x, p) XSETRECORD (x, p, opaque_list) 66 #define XSETOPAQUE_LIST(x, p) XSETRECORD (x, p, opaque_list)
62 #define OPAQUE_LISTP(x) RECORDP (x, opaque_list) 67 #define OPAQUE_LISTP(x) RECORDP (x, opaque_list)
63 #define GC_OPAQUE_LISTP(x) GC_RECORDP (x, opaque_list) 68 #define GC_OPAQUE_LISTP(x) GC_RECORDP (x, opaque_list)
64 /* #define CHECK_OPAQUE_LIST(x) CHECK_RECORD (x, opaque_list) 69 /* #define CHECK_OPAQUE_LIST(x) CHECK_RECORD (x, opaque_list)
65 Opaque lists should never escape to the Lisp level, so 70 Opaque lists should never escape to the Lisp level, so
66 functions should not be doing this. */ 71 functions should not be doing this. */
67 72
68 Lisp_Object make_opaque (int size, CONST void *data); 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);
69 Lisp_Object make_opaque_ptr (CONST void *val); 78 Lisp_Object make_opaque_ptr (CONST void *val);
70 Lisp_Object make_opaque_long (long val); 79 Lisp_Object make_opaque_long (long val);
71 void free_opaque_ptr (Lisp_Object ptr); 80 void free_opaque_ptr (Lisp_Object ptr);
72 81
73 #define OPAQUE_SIZE(op) XINT ((op)->size_or_chain) 82 #define OPAQUE_SIZE(op) XINT ((op)->size_or_chain)
74 #define OPAQUE_DATA(op) ((op)->data) 83 #define OPAQUE_DATA(op) ((op)->data)
75 #define OPAQUE_MARKFUN(op) ((op)->markfun) /* What's the point if this? */ 84 #define OPAQUE_MARKFUN(op) ((op)->markfun)
76 #define XOPAQUE_SIZE(op) OPAQUE_SIZE (XOPAQUE (op)) 85 #define XOPAQUE_SIZE(op) OPAQUE_SIZE (XOPAQUE (op))
77 #define XOPAQUE_DATA(op) OPAQUE_DATA (XOPAQUE (op)) 86 #define XOPAQUE_DATA(op) OPAQUE_DATA (XOPAQUE (op))
78 #define XOPAQUE_MARKFUN(op) OPAQUE_MARKFUN (XOPAQUE (op)) 87 #define XOPAQUE_MARKFUN(op) OPAQUE_MARKFUN (XOPAQUE (op))
79 88
80 #define get_opaque_ptr(op) (* (void **) XOPAQUE_DATA (op)) 89 #define get_opaque_ptr(op) (* (void **) XOPAQUE_DATA (op))
81 #define set_opaque_ptr(op, ptr) (get_opaque_ptr (op) = (void *) ptr) 90 #define set_opaque_ptr(op, ptr) (get_opaque_ptr (op) = (void *) ptr)
82 #define get_opaque_long(op) (* (long *) XOPAQUE_DATA (op)) 91 #define get_opaque_long(op) (* (long *) XOPAQUE_DATA (op))
83 #define set_opaque_long(op, ptr) (get_opaque_long (op) = ptr) 92 #define set_opaque_long(op, ptr) (get_opaque_long (op) = ptr)
84 #define set_opaque_markfun(op, fun) (XOPAQUE_MARKFUN (op) = fun) 93 #define set_opaque_markfun(op, fun) (XOPAQUE_MARKFUN (op) = fun)
85 94
86 Lisp_Object make_opaque_list (int size, 95 Lisp_Object make_opaque_list (size_t size,
87 Lisp_Object (*markfun) 96 Lisp_Object (*markfun)
88 (Lisp_Object obj, 97 (Lisp_Object obj,
89 void (*markobj) (Lisp_Object))); 98 void (*markobj) (Lisp_Object)));
90 Lisp_Object allocate_managed_opaque (Lisp_Object opaque_list, 99 Lisp_Object allocate_managed_opaque (Lisp_Object opaque_list,
91 CONST void *data); 100 CONST void *data);