154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
-
+
-
-
+
+
-
-
+
+
|
block->descriptor->dispose_helper(block);
free(block);
}
}
void
_Block_object_assign(void *dst_, void *src_, int flags)
_Block_object_assign(void *dst_, const void *src_, const int flags_)
{
flags &= OF_BLOCK_FIELD_IS_BLOCK | OF_BLOCK_FIELD_IS_OBJECT |
OF_BLOCK_FIELD_IS_BYREF;
int flags = flags_ & (OF_BLOCK_FIELD_IS_BLOCK |
OF_BLOCK_FIELD_IS_OBJECT | OF_BLOCK_FIELD_IS_BYREF);
switch (flags) {
case OF_BLOCK_FIELD_IS_BLOCK:
*(of_block_literal_t**)dst_ = _Block_copy(src_);
break;
case OF_BLOCK_FIELD_IS_OBJECT:
*(id*)dst_ = [(id)src_ retain];
break;
case OF_BLOCK_FIELD_IS_BYREF:;
of_block_byref_t *src = src_;
of_block_byref_t **dst = dst_;
of_block_byref_t *src = (of_block_byref_t*)src_;
of_block_byref_t **dst = (of_block_byref_t**)dst_;
if ((src->flags & ~OF_BLOCK_HAS_COPY_DISPOSE) == 0) {
if ((*dst = malloc(src->size)) == NULL) {
fputs("Not enough memory for block "
"variables!\n", stderr);
exit(1);
}
|
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
-
+
-
-
+
+
-
+
|
(*dst)->flags++;
break;
}
}
void
_Block_object_dispose(void *obj_, int flags)
_Block_object_dispose(const void *obj_, const int flags_)
{
flags &= OF_BLOCK_FIELD_IS_BLOCK | OF_BLOCK_FIELD_IS_OBJECT |
OF_BLOCK_FIELD_IS_BYREF;
const int flags = flags_ & (OF_BLOCK_FIELD_IS_BLOCK |
OF_BLOCK_FIELD_IS_OBJECT | OF_BLOCK_FIELD_IS_BYREF);
switch (flags) {
case OF_BLOCK_FIELD_IS_BLOCK:
_Block_release(obj_);
break;
case OF_BLOCK_FIELD_IS_OBJECT:
[(id)obj_ release];
break;
case OF_BLOCK_FIELD_IS_BYREF:;
of_block_byref_t *obj = obj_;
of_block_byref_t *obj = (of_block_byref_t*)obj_;
if ((--obj->flags & ~OF_BLOCK_HAS_COPY_DISPOSE) == 0) {
if (obj->size >= sizeof(of_block_byref_t))
obj->byref_dispose(obj);
free(obj);
}
|