int DaoCdata_ChildOf( DaoTypeBase *self, DaoTypeBase *super ) { int i; if( self == super ) return 1; for(i=0; i<DAO_MAX_CDATA_SUPER; i++){ if( self->supers[i] == NULL ) break; if( DaoCdata_ChildOf( self->supers[i], super ) ) return 1; } return 0; }
int DaoClass_ChildOf( DaoClass *self, DaoValue *klass ) { DaoCdata *cdata = (DaoCdata*) klass; if( self == NULL || klass == NULL ) return 0; if( klass == (DaoValue*) self ) return 1; if( klass == self->parent ) return 1; if( self->parent == NULL ) return 0; if( self->parent->type == DAO_CLASS ){ return DaoClass_ChildOf( (DaoClass*) self->parent, klass ); }else if( self->parent->type == DAO_CTYPE && klass->type == DAO_CTYPE ){ DaoCdata *csup = (DaoCdata*) self->parent; return DaoCdata_ChildOf( csup->ctype->kernel->typer, cdata->ctype->kernel->typer ); } return 0; }
int DaoClass_ChildOf( DaoClass *self, DaoValue *klass ) { DaoCdata *cdata = (DaoCdata*) klass; int i; if( self == NULL ) return 0; if( klass == (DaoValue*) self ) return 1; for( i=0; i<self->superClass->size; i++ ){ DaoClass *dsup = self->superClass->items.pClass[i]; DaoCdata *csup = self->superClass->items.pCdata[i]; if( dsup == NULL ) continue; if( klass == self->superClass->items.pValue[i] ) return 1; if( dsup->type == DAO_CLASS && DaoClass_ChildOf( dsup, klass ) ){ return 1; }else if( csup->type == DAO_CTYPE && klass->type == DAO_CTYPE ){ if( DaoCdata_ChildOf( csup->ctype->kernel->typer, cdata->ctype->kernel->typer ) ) return 1; } } return 0; }