Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: class.c 8237 2007-07-27 16:15:29Z twisti $
+ $Id: class.c 8238 2007-07-27 18:41:53Z twisti $
*/
}
+/* class_resolve_superclass ****************************************************
+
+ Resolves the super class reference of the given class if necessary.
+
+*******************************************************************************/
+
+static classinfo *class_resolve_superclass(classinfo *c)
+{
+ classinfo *super;
+
+ if (c->super.any == NULL)
+ return NULL;
+
+ /* Do we have a super class reference or is it already
+ resolved? */
+
+ if (IS_CLASSREF(c->super)) {
+ super = resolve_classref_or_classinfo_eager(c->super, true);
+
+ if (super == NULL)
+ return NULL;
+
+ /* Store the resolved super class in the class structure. */
+
+ c->super.cls = super;
+ }
+
+ return c->super.cls;
+}
+
+
/* class_issubclass ************************************************************
Checks if sub is a descendant of super.
bool class_issubclass(classinfo *sub, classinfo *super)
{
- for (; sub != NULL; sub = class_get_superclass(sub))
+ for (;;) {
+ if (sub == NULL)
+ return false;
+
if (sub == super)
return true;
- return false;
+ sub = class_resolve_superclass(sub);
+ }
}
/* We may have to resolve the super class reference. */
- if (IS_CLASSREF(c->super)) {
- super = resolve_classref_or_classinfo_eager(c->super, true);
-
- if (super == NULL)
- return NULL;
-
- /* Store the resolved super class in the class structure. */
+ super = class_resolve_superclass(c);
- c->super.cls = super;
- }
-
- return c->super.cls;
+ return super;
}