Mercurial > hg > xemacs-beta
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_ */ |