forked from gnustep/libobjc2
-
Notifications
You must be signed in to change notification settings - Fork 3
/
properties.h
168 lines (162 loc) · 3.78 KB
/
properties.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "visibility.h"
enum PropertyAttributeKind
{
/**
* Property has no attributes.
*/
OBJC_PR_noattr = 0x00,
/**
* The property is declared read-only.
*/
OBJC_PR_readonly = (1<<0),
/**
* The property has a getter.
*/
OBJC_PR_getter = (1<<1),
/**
* The property has assign semantics.
*/
OBJC_PR_assign = (1<<2),
/**
* The property is declared read-write.
*/
OBJC_PR_readwrite = (1<<3),
/**
* Property has retain semantics.
*/
OBJC_PR_retain = (1<<4),
/**
* Property has copy semantics.
*/
OBJC_PR_copy = (1<<5),
/**
* Property is marked as non-atomic.
*/
OBJC_PR_nonatomic = (1<<6),
/**
* Property has setter.
*/
OBJC_PR_setter = (1<<7)
};
/**
* Flags in the second attributes field in declared properties.
* Note: This field replaces the old 'is synthesized' field and so these values
* are shifted left one from their values in clang.
*/
enum PropertyAttributeKind2
{
/**
* No extended attributes.
*/
OBJC_PR_noextattr = 0,
/**
* The property is synthesized. This has no meaning in properties on
* protocols.
*/
OBJC_PR_synthesized = (1<<0),
/**
* The property is dynamic (i.e. the implementation is inherited or
* provided at run time).
*/
OBJC_PR_dynamic = (1<<1),
/**
* This property belongs to a protocol.
*/
OBJC_PR_protocol = OBJC_PR_synthesized | OBJC_PR_dynamic,
/**
* The property is atomic.
*/
OBJC_PR_atomic = (1<<2),
/**
* The property value is a zeroing weak reference.
*/
OBJC_PR_weak = (1<<3),
/**
* The property value is strong (retained). Currently, this is equivalent
* to the strong attribute.
*/
OBJC_PR_strong = (1<<4),
/**
* The property value is just copied.
*/
OBJC_PR_unsafe_unretained = (1<<5),
};
/**
* Structure used for property enumeration. Note that property enumeration is
* currently quite broken on OS X, so achieving full compatibility there is
* impossible. Instead, we strive to achieve compatibility with the
* documentation.
*/
struct objc_property
{
/**
* Name of this property.
*/
const char *name;
/**
* Attributes for this property. Made by ORing together
* PropertyAttributeKinds.
*/
char attributes;
/**
* Flag set if the property is synthesized.
*/
char attributes2;
/**
* Padding field. These were implicit in the structure field alignment
* (four more on 64-bit platforms), but we'll make them explicit now for
* future use.
*/
char unused1;
/**
* More padding.
*/
char unused2;
/**
* Name of the getter for this property.
*/
const char *getter_name;
/**
* Type encoding for the get method for this property.
*/
const char *getter_types;
/**
* Name of the set method for this property.
*/
const char *setter_name;
/**
* Type encoding of the setter for this property.
*/
const char *setter_types;
};
/**
* List of property inrospection data.
*/
struct objc_property_list
{
/**
* Number of properties in this array.
*/
int count;
/*
* The next property in a linked list.
*/
struct objc_property_list *next;
/**
* List of properties.
*/
struct objc_property properties[];
};
/**
* Constructs a property description from a list of attributes, returning the
* instance variable name via the third parameter.
*/
PRIVATE struct objc_property propertyFromAttrs(const objc_property_attribute_t *attributes,
unsigned int attributeCount,
const char **iVarName);
/**
* Constructs and installs a property attribute string from the property
* attributes and, optionally, an ivar string.
*/
PRIVATE const char *constructPropertyAttributes(objc_property_t property,
const char *iVarName);