ObjFW  Check-in [69d9f76520]

Overview
Comment:Tag class pointers for @compatibility_aliases.

This makes it possible to find aliases in the classes hashtable and not
call objc_free_class() on them.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 69d9f76520e0491938bb5357a0c7215516a2219d3dec214ded872f712cd70d91
User & Date: js on 2013-03-14 20:20:05
Other Links: manifest | tags
Context
2013-03-15
17:04
OFHTTPClient: Implement "Connection: keep-alive". check-in: c195c1f098 user: js tags: trunk
2013-03-14
20:20
Tag class pointers for @compatibility_aliases. check-in: 69d9f76520 user: js tags: trunk
19:25
Add a few memory barriers. check-in: 27138ee85b user: js tags: trunk
Changes

Modified src/runtime/class.m from [9014452587] to [5994e9e90d].

47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

BOOL
class_registerAlias_np(Class cls, const char *name)
{
	if (classes == NULL)
		return NO;

	objc_hashtable_set(classes, name, cls);

	return YES;
}

static void
register_selectors(struct objc_abi_class *cls)
{







|







47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

BOOL
class_registerAlias_np(Class cls, const char *name)
{
	if (classes == NULL)
		return NO;

	objc_hashtable_set(classes, name, (Class)((uintptr_t)cls | 1));

	return YES;
}

static void
register_selectors(struct objc_abi_class *cls)
{
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{
	Class c;

	if (classes == NULL)
		return Nil;

	objc_global_mutex_lock();
	c = (Class)objc_hashtable_get(classes, name);
	objc_global_mutex_unlock();

	return c;
}

static void
call_method(Class cls, const char *method)







|







73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{
	Class c;

	if (classes == NULL)
		return Nil;

	objc_global_mutex_lock();
	c = (Class)((uintptr_t)objc_hashtable_get(classes, name) & ~1);
	objc_global_mutex_unlock();

	return c;
}

static void
call_method(Class cls, const char *method)
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
	if (classes == NULL)
		return;

	for (i = 0; i <= classes->last_idx; i++) {
		if (classes->data[i] != NULL) {
			Class cls = classes->data[i]->obj;

			if (cls == Nil)
				continue;

			objc_free_class(cls);
			objc_free_class(cls->isa);
		}
	}








|







612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
	if (classes == NULL)
		return;

	for (i = 0; i <= classes->last_idx; i++) {
		if (classes->data[i] != NULL) {
			Class cls = classes->data[i]->obj;

			if (cls == Nil || (uintptr_t)cls & 1)
				continue;

			objc_free_class(cls);
			objc_free_class(cls->isa);
		}
	}