ObjFW  Check-in [eb3e09c153]

Overview
Comment:Fix a bug with recent Clang revisions and Blocks.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: eb3e09c15393b0023aa648fcedd07386c3b13adeb1ff7ca4b59e8a9dc07dcce1
User & Date: js on 2010-11-01 03:46:05
Other Links: manifest | tags
Context
2010-11-01
13:37
Update PLATFORMS. check-in: c1d2ff2b95 user: js tags: trunk
03:46
Fix a bug with recent Clang revisions and Blocks. check-in: eb3e09c153 user: js tags: trunk
2010-10-31
22:18
Check if 64 bit version of OSAtomic* functions is available. check-in: 9626d917a6 user: js tags: trunk
Changes

Modified src/OFBlock.m from [d2c4fcd6af] to [0cda48050d].

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);
		}