//***** Note: Not called in THREADED mode. static void bbStringFree( BBObject *o ){ #ifdef BB_GC_RC BBString *str=(BBString*)o; if( str==&bbEmptyString ){ //str->refs=BBGC_MANYREFS; return; } bbGCDeallocObject( str,sizeof(BBString)+str->length*sizeof(BBChar) ); #endif }
void bbObjectFree( BBObject *o ){ BBClass *clas=o->clas; #ifdef BB_GC_RC if( o==&bbNullObject ){ //o->refs=BBGC_MANYREFS; return; } clas->dtor( o ); bbGCDeallocObject( o,clas->instance_size ); #else clas->dtor( o ); #endif }
//***** Note: Only used by ref counting GC. static void bbArrayFree( BBObject *o ){ #ifdef BB_GC_RC int k; BBObject **p; BBArray *arr=(BBArray*)o; if( arr==&bbEmptyArray ){ arr->refs=BBGC_MANYREFS; return; } switch( arr->type[0] ){ case ':':case '$':case '[': p=(BBObject**)BBARRAYDATA(arr,arr->dims); for( k=arr->scales[0];k>0;--k ){ BBObject *o=*p++; BBDECREFS( o ); } break; } bbGCDeallocObject( arr,BBARRAYSIZE( arr->size,arr->dims ) ); #endif }