DaoCinType* DaoCinType_New( DaoInterface *inter, DaoType *target ) { DaoCinType *self = (DaoCinType*) dao_calloc( 1, sizeof(DaoCinType) ); DaoValue_Init( self, DAO_CINTYPE ); self->trait |= DAO_VALUE_DELAYGC; self->derived = 0; self->supers = DList_New( DAO_DATA_VALUE ); self->methods = DHash_New( DAO_DATA_STRING, DAO_DATA_VALUE ); self->citype = DaoType_New( "interface<", DAO_CINTYPE, (DaoValue*)self, NULL ); self->vatype = DaoType_New( inter->abtype->name->chars, DAO_CINVALUE, (DaoValue*)self, NULL ); self->abstract = inter; self->target = target; GC_IncRC( self->citype ); GC_IncRC( self->vatype ); GC_IncRC( self->abstract ); GC_IncRC( self->target ); self->citype->nested = DList_New( DAO_DATA_VALUE ); self->vatype->nested = DList_New( DAO_DATA_VALUE ); DList_Append( self->citype->nested, target ); DList_Append( self->vatype->nested, target ); DString_AppendChar( self->vatype->name, '<' ); DString_Append( self->vatype->name, target->name ); DString_AppendChar( self->vatype->name, '>' ); DString_Append( self->citype->name, self->vatype->name ); DString_AppendChar( self->citype->name, '>' ); #ifdef DAO_USE_GC_LOGGER DaoObjectLogger_LogNew( (DaoValue*) self ); #endif return self; }
DaoCinValue* DaoCinValue_New( DaoCinType *cintype, DaoValue *value ) { DaoCinValue *self = (DaoCinValue*)dao_calloc( 1, sizeof(DaoCinValue) ); DaoValue_Init( self, DAO_CINVALUE ); GC_Assign( & self->cintype, cintype ); DaoValue_Move( value, & self->value, cintype->target ); #ifdef DAO_USE_GC_LOGGER DaoObjectLogger_LogNew( (DaoValue*) self ); #endif return self; }
DaoInterface* DaoInterface_New( const char *name ) { DaoInterface *self = (DaoInterface*) dao_calloc( 1, sizeof(DaoInterface) ); DaoValue_Init( self, DAO_INTERFACE ); self->trait |= DAO_VALUE_DELAYGC; self->derived = 0; self->supers = DList_New( DAO_DATA_VALUE ); self->methods = DHash_New( DAO_DATA_STRING, DAO_DATA_VALUE ); self->abtype = DaoType_New( name, DAO_INTERFACE, (DaoValue*)self, NULL ); GC_IncRC( self->abtype ); #ifdef DAO_USE_GC_LOGGER DaoObjectLogger_LogNew( (DaoValue*) self ); #endif return self; }
DaoObject* DaoObject_Allocate( DaoClass *klass, int value_count ) { int extra = value_count * sizeof(DaoValue*); DaoObject *self = (DaoObject*) dao_calloc( 1, sizeof(DaoObject) + extra ); DaoValue_Init( self, DAO_OBJECT ); GC_IncRC( klass ); self->defClass = klass; self->isRoot = 1; self->valueCount = value_count; self->objValues = (DaoValue**) (self + 1); memset( self->objValues, 0, value_count*sizeof(DaoValue*) ); #ifdef DAO_USE_GC_LOGGER DaoObjectLogger_LogNew( (DaoValue*) self ); #endif return self; }
DaoCinType* DaoCinType_New( DaoInterface *inter, DaoType *target ) { DaoCinType *self = (DaoCinType*) dao_calloc( 1, sizeof(DaoCinType) ); DaoNamespace *ns = inter->nameSpace; DString *name = inter->abtype->name; DaoValue_Init( self, DAO_CINTYPE ); self->trait |= DAO_VALUE_DELAYGC; self->derived = 0; self->bases = DList_New( DAO_DATA_VALUE ); self->methods = DHash_New( DAO_DATA_STRING, DAO_DATA_VALUE ); self->citype = DaoType_New( ns, "interface<", DAO_CINTYPE, (DaoValue*)self, NULL ); self->vatype = DaoType_New( ns, name->chars, DAO_CINVALUE, (DaoValue*)self, NULL ); self->abstract = inter; self->target = target; self->citype->core = & daoCinTypeCore; self->vatype->core = & daoCinValueCore; GC_IncRC( self->citype ); GC_IncRC( self->vatype ); GC_IncRC( self->abstract ); GC_IncRC( self->target ); self->vatype->kernel = DaoTypeKernel_New( NULL ); self->vatype->kernel->abtype = self->vatype; GC_IncRC( self->vatype->kernel ); GC_IncRC( self->vatype ); self->citype->args = DList_New( DAO_DATA_VALUE ); self->vatype->args = DList_New( DAO_DATA_VALUE ); DList_Append( self->citype->args, target ); DList_Append( self->vatype->args, target ); DString_AppendChar( self->vatype->name, '<' ); DString_Append( self->vatype->name, target->name ); DString_AppendChar( self->vatype->name, '>' ); DString_Append( self->citype->name, self->vatype->name ); DString_AppendChar( self->citype->name, '>' ); #ifdef DAO_USE_GC_LOGGER DaoObjectLogger_LogNew( (DaoValue*) self ); #endif return self; }