ObjFW  Diff

Differences From Artifact [5c7645fb2a]:

To Artifact [b612119f40]:


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
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







-
+


-
+

-
+

-
+












-
+

-
+


-
-
+
+







-
-
+
+



-
-
-
+
+
+







	 * so don't access object directly unless it's a class!
	 */

	bool isClass =
	    object_getClass(object)->info & OBJC_CLASS_INFO_METACLASS;

	if (!(object_getClass(object)->info & OBJC_CLASS_INFO_INITIALIZED)) {
		Class cls = (isClass
		Class class = (isClass
		    ? (Class)object : object_getClass(object));

		objc_initialize_class(cls);
		objc_initialize_class(class);

		if (!(cls->info & OBJC_CLASS_INFO_SETUP))
		if (!(class->info & OBJC_CLASS_INFO_SETUP))
			OBJC_ERROR("Could not dispatch message for incomplete "
			    "class %s!", cls->name);
			    "class %s!", class_getName(class));

		/*
		 * We don't need to handle the case that super was called.
		 * The reason for this is that a call to super is not possible
		 * before a message to the class has been sent and it thus has
		 * been initialized together with its superclasses.
		 */
		return lookup(object, selector);
	}

	/* Try resolveClassMethod: / resolveInstanceMethod: */
	if (class_isMetaClass(object_getClass(object))) {
		Class cls = object_getClass(object);
		Class class = object_getClass(object);

		if (class_respondsToSelector(cls,
		if (class_respondsToSelector(class,
		    @selector(resolveClassMethod:)) &&
		    [object resolveClassMethod: selector]) {
			if (!class_respondsToSelector(cls, selector))
				OBJC_ERROR("[%s resolveClassMethod: %s] "
			if (!class_respondsToSelector(class, selector))
				OBJC_ERROR("+[%s resolveClassMethod: %s] "
				    "returned true without adding the method!",
				    class_getName(object),
				    sel_getName(selector));

			return lookup(object, selector);
		}
	} else {
		Class cls = object_getClass(object);
		Class metaclass = object_getClass(cls);
		Class class = object_getClass(object);
		Class metaclass = object_getClass(class);

		if (class_respondsToSelector(metaclass,
		    @selector(resolveInstanceMethod:)) &&
		    [cls resolveInstanceMethod: selector]) {
			if (!class_respondsToSelector(cls, selector))
				OBJC_ERROR("[%s resolveInstanceMethod: %s] "
		    [class resolveInstanceMethod: selector]) {
			if (!class_respondsToSelector(class, selector))
				OBJC_ERROR("+[%s resolveInstanceMethod: %s] "
				    "returned true without adding the method!",
				    class_getName(object_getClass(object)),
				    sel_getName(selector));

			return lookup(object, selector);
		}
	}
125
126
127
128
129
130
131
132

133
134

135
136
137

138
139
140
141
142
143
144
125
126
127
128
129
130
131

132
133

134
135
136

137
138
139
140
141
142
143
144







-
+

-
+


-
+







objc_setForwardHandler(IMP forward, IMP stretForward)
{
	forwardHandler = forward;
	stretForwardHandler = stretForward;
}

bool
class_respondsToSelector(Class cls, SEL selector)
class_respondsToSelector(Class class, SEL selector)
{
	if (cls == Nil)
	if (class == Nil)
		return false;

	return (objc_dtable_get(cls->DTable,
	return (objc_dtable_get(class->DTable,
	    (uint32_t)selector->UID) != (IMP)0);
}

#ifndef OF_ASM_LOOKUP
static id
nilMethod(id self, SEL _cmd)
{
179
180
181
182
183
184
185
186

187
188
189
190
191
192
193
179
180
181
182
183
184
185

186
187
188
189
190
191
192
193







-
+







    IMP (*notFound)(id, SEL))
{
	IMP imp;

	if (super->self == nil)
		return (IMP)nilMethod;

	imp = objc_dtable_get(super->cls->DTable, (uint32_t)selector->UID);
	imp = objc_dtable_get(super->class->DTable, (uint32_t)selector->UID);

	if (imp == (IMP)0)
		return notFound(super->self, selector);

	return imp;
}