void DaoCinType_DeriveMethods( DaoCinType *self ) { daoint i, k, m, N = self->supers->size; DaoCinType *super; DNode *it; for(i=0; i<N; i++){ super = (DaoCinType*) self->supers->items.pValue[i]; self->citype->bases = DList_New( DAO_DATA_VALUE ); self->vatype->bases = DList_New( DAO_DATA_VALUE ); DList_Append( self->citype->bases, super->citype ); DList_Append( self->vatype->bases, super->vatype ); for(it=DMap_First(super->methods); it; it=DMap_Next( super->methods, it )){ if( it->value.pRoutine->overloads ){ DRoutines *routs = it->value.pRoutine->overloads; for(k=0,m=routs->routines->size; k<m; k++){ DaoRoutine *rout = routs->routines->items.pRoutine[i]; DaoMethods_Insert( self->methods, rout, NULL, self->vatype ); } }else{ DaoMethods_Insert( self->methods, it->value.pRoutine, NULL, self->vatype ); } } } self->derived = 1; }
void DaoClass_MakeInterface( DaoClass *self ) { daoint i, j; DaoType *tp; DaoRoutine *meth; DaoInterface *inter = self->inter; DMap *deftypes = DHash_New(0,0); DArray_Clear( self->inter->supers ); DMap_Clear( self->inter->methods ); if( self->parent && self->parent->type == DAO_CLASS ) DArray_Append( inter->supers, self->parent->xClass.inter ); for(i=0; i<self->cstDataName->size; ++i){ DString *name = self->cstDataName->items.pString[i]; DaoValue *value = self->constants->items.pConst[i]->value; DaoRoutine *rout = (DaoRoutine*) value; DNode *it; if( value->type != DAO_ROUTINE ) continue; if( value->xRoutine.attribs & DAO_ROUT_DECORATOR ) continue; it = MAP_Find( self->lookupTable, rout->routName ); if( it == NULL || LOOKUP_PM( it->value.pInt ) != DAO_DATA_PUBLIC ) continue; DMap_Reset( deftypes ); DMap_Insert( deftypes, rout->routHost, inter->abtype ); if( rout->overloads == NULL ){ tp = DaoType_DefineTypes( rout->routType, rout->nameSpace, deftypes ); if( tp == NULL ) continue; /* TODO: handle error; */ meth = DaoRoutine_New( rout->nameSpace, inter->abtype, 0 ); meth->attribs = rout->attribs; DString_Assign( meth->routName, rout->routName ); GC_ShiftRC( tp, meth->routType ); meth->routType = tp; DaoMethods_Insert( inter->methods, meth, meth->nameSpace, meth->routHost ); }else{ for(j=0; j<rout->overloads->routines->size; ++j){ DaoRoutine *rout2 = rout->overloads->routines->items.pRoutine[j]; if( rout2->attribs & DAO_ROUT_DECORATOR ) continue; tp = DaoType_DefineTypes( rout2->routType, rout2->nameSpace, deftypes ); if( tp == NULL ) continue; /* TODO: handle error; */ meth = DaoRoutine_New( rout2->nameSpace, inter->abtype, 0 ); meth->attribs = rout2->attribs; DString_Assign( meth->routName, rout->routName ); GC_ShiftRC( tp, meth->routType ); meth->routType = tp; DaoMethods_Insert( inter->methods, meth, meth->nameSpace, meth->routHost ); } } } DMap_Delete( deftypes ); }
void DaoInterface_DeriveMethods( DaoInterface *self ) { daoint i, k, m, N = self->bases->size; DaoNamespace *ns = self->nameSpace; DaoInterface *base; DNode *it; for(i=0; i<N; i++){ base = (DaoInterface*) self->bases->items.pValue[i]; if( self->abtype->bases == NULL ) self->abtype->bases = DList_New( DAO_DATA_VALUE ); DList_Append( self->abtype->bases, base->abtype ); for(it=DMap_First(base->methods); it; it=DMap_Next( base->methods, it )){ if( it->value.pRoutine->overloads ){ DRoutines *routs = it->value.pRoutine->overloads; for(k=0,m=routs->routines->size; k<m; k++){ DaoRoutine *rout = routs->routines->items.pRoutine[i]; DaoMethods_Insert( self->methods, rout, ns, self->abtype ); } }else{ DaoMethods_Insert( self->methods, it->value.pRoutine, ns, self->abtype ); } } } self->derived = 1; }