BBString *bbStringNew( int len ){ int flags; BBString *str; if( !len ) return &bbEmptyString; str=(BBString*)bbGCAllocObject( sizeof(BBString)+len*sizeof(BBChar),&bbStringClass,BBGC_ATOMIC ); str->length=len; return str; }
static BBArray *allocateArray( const char *type,int dims,int *lens ){ int k,*len; int size=4; int length=1; int flags=BBGC_ATOMIC; BBArray *arr; len=lens; for( k=0;k<dims;++k ){ int n=*len++; if( n<=0 ) return &bbEmptyArray; length*=n; } switch( type[0] ){ case 'b':size=1;break; case 's':size=2;break; case 'l':size=8;break; case 'd':size=8;break; case ':':flags=0;break; case '$':flags=0;break; case '[':flags=0;break; } size*=length; arr=(BBArray*)bbGCAllocObject( BBARRAYSIZE(size,dims),&bbArrayClass,flags ); arr->type=type; arr->dims=dims; arr->size=size; len=lens; for( k=0;k<dims;++k ) arr->scales[k]=*len++; for( k=dims-2;k>=0;--k ) arr->scales[k]*=arr->scales[k+1]; return arr; }
BBObject *bbObjectAtomicNew( BBClass *clas ){ int flags=( clas->dtor!=bbObjectDtor ) ? BBGC_FINALIZE | BBGC_ATOMIC : BBGC_ATOMIC; BBObject *o=(BBObject*)bbGCAllocObject( clas->instance_size,clas,flags ); clas->ctor( o ); return o; }