Mercurial > hg > xemacs-beta
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); |