ObjFW  Check-in [13864f512c]

Overview
Comment:Avoid retaining enumerator during fast enumeration

This avoids leaking the enumerator when terminating the fast enumeration
early.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 13864f512cb294be38a75133c376edce5b18de9ec26e730a8c025860c17d0afc
User & Date: js on 2019-06-20 23:47:54
Other Links: manifest | tags
Context
2019-06-21
00:09
bridge: Add bridge for {OF,NS}Set check-in: 29ccaef03b user: js tags: trunk
2019-06-20
23:47
Avoid retaining enumerator during fast enumeration check-in: 13864f512c user: js tags: trunk
23:45
OFSet: Add default method for fast enumeration check-in: f8b53e2f6b user: js tags: trunk
Changes

Modified src/OFDictionary.m from [c70541cdfe] to [af6bd066da].

524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
{
	OFEnumerator *enumerator;
	int i;

	memcpy(&enumerator, state->extra, sizeof(enumerator));

	if (enumerator == nil) {
		void *pool = objc_autoreleasePoolPush();

		enumerator = [[self keyEnumerator] retain];
		memcpy(state->extra, &enumerator, sizeof(enumerator));

		objc_autoreleasePoolPop(pool);
	}

	state->itemsPtr = objects;
	state->mutationsPtr = (unsigned long *)self;

	if (state->state == 1)
		return 0;

	for (i = 0; i < count; i++) {
		id object = [enumerator nextObject];

		if (object == nil) {
			state->state = 1;
			[enumerator release];

			return i;
		}

		objects[i] = object;
	}

	return i;
}








<
<
|

<
<





<
<
<



|
<
<
<

<







524
525
526
527
528
529
530


531
532


533
534
535
536
537



538
539
540
541



542

543
544
545
546
547
548
549
{
	OFEnumerator *enumerator;
	int i;

	memcpy(&enumerator, state->extra, sizeof(enumerator));

	if (enumerator == nil) {


		enumerator = [self keyEnumerator];
		memcpy(state->extra, &enumerator, sizeof(enumerator));


	}

	state->itemsPtr = objects;
	state->mutationsPtr = (unsigned long *)self;




	for (i = 0; i < count; i++) {
		id object = [enumerator nextObject];

		if (object == nil)



			return i;


		objects[i] = object;
	}

	return i;
}

Modified src/OFSet.m from [806937cb0f] to [62481ad29d].

257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
{
	OFEnumerator *enumerator;
	int i;

	memcpy(&enumerator, state->extra, sizeof(enumerator));

	if (enumerator == nil) {
		void *pool = objc_autoreleasePoolPush();

		enumerator = [[self objectEnumerator] retain];
		memcpy(state->extra, &enumerator, sizeof(enumerator));

		objc_autoreleasePoolPop(pool);
	}

	state->itemsPtr = objects;
	state->mutationsPtr = (unsigned long *)self;

	if (state->state == 1)
		return 0;

	for (i = 0; i < count; i++) {
		id object = [enumerator nextObject];

		if (object == nil) {
			state->state = 1;
			[enumerator release];

			return i;
		}

		objects[i] = object;
	}

	return i;
}








<
<
|

<
<





<
<
<



|
<
<
<

<







257
258
259
260
261
262
263


264
265


266
267
268
269
270



271
272
273
274



275

276
277
278
279
280
281
282
{
	OFEnumerator *enumerator;
	int i;

	memcpy(&enumerator, state->extra, sizeof(enumerator));

	if (enumerator == nil) {


		enumerator = [self objectEnumerator];
		memcpy(state->extra, &enumerator, sizeof(enumerator));


	}

	state->itemsPtr = objects;
	state->mutationsPtr = (unsigned long *)self;




	for (i = 0; i < count; i++) {
		id object = [enumerator nextObject];

		if (object == nil)



			return i;


		objects[i] = object;
	}

	return i;
}