Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/stdlib.hfa

    r68f0c4e r191a190  
    4343//---------------------------------------
    4444
     45// Macro because of returns
     46#define $VAR_ALLOC( allocation, alignment ) \
     47        if ( _Alignof(T) <= libAlign() ) return (T *)(void *)allocation( (size_t)sizeof(T) ); /* C allocation */ \
     48        else return (T *)alignment( _Alignof(T), sizeof(T) )
     49
    4550#define $ARRAY_ALLOC( allocation, alignment, dim ) \
    4651        if ( _Alignof(T) <= libAlign() ) return (T *)(void *)allocation( dim, (size_t)sizeof(T) ); /* C allocation */ \
    4752        else return (T *)alignment( _Alignof(T), dim, sizeof(T) )
    4853
     54#define $RE_SPECIALS( ptr, size, allocation, alignment ) \
     55        if ( unlikely( size == 0 ) || unlikely( ptr == 0p ) ) { \
     56                if ( unlikely( size == 0 ) ) free( ptr ); \
     57                $VAR_ALLOC( malloc, memalign ); \
     58        } /* if */
     59
    4960static inline forall( dtype T | sized(T) ) {
    5061        // Cforall safe equivalents, i.e., implicit size specification
    5162
    5263        T * malloc( void ) {
    53                 if ( _Alignof(T) <= libAlign() ) return (T *)(void *)malloc( (size_t)sizeof(T) ); /* C allocation */
    54                 else return (T *)memalign( _Alignof(T), sizeof(T) );
     64                $VAR_ALLOC( malloc, memalign );
    5565        } // malloc
    5666
     
    6474
    6575        T * resize( T * ptr, size_t size ) {                            // CFA resize, eliminate return-type cast
     76                $RE_SPECIALS( ptr, size, malloc, memalign );
    6677                if ( _Alignof(T) <= libAlign() ) return (T *)(void *)resize( (void *)ptr, size ); // CFA resize
    6778                else return (T *)(void *)resize( (void *)ptr, _Alignof(T), size ); // CFA resize
     
    6980
    7081        T * realloc( T * ptr, size_t size ) {                           // CFA realloc, eliminate return-type cast
     82                $RE_SPECIALS( ptr, size, malloc, memalign );
    7183                if ( _Alignof(T) <= libAlign() ) return (T *)(void *)realloc( (void *)ptr, size ); // C realloc
    7284                else return (T *)(void *)realloc( (void *)ptr, _Alignof(T), size ); // CFA realloc
     
    176188                size_t size = sizeof(T);
    177189                size_t copy_end = 0;
     190
    178191                if(Resize) {
    179 //printf("1. $alloc_internal got: %p %p %lu %lu\n", Resize, Realloc, Align, Dim); // these prints are temporary
    180                         ptr = (T*) (void *) resize( (void *)Resize, Align, Dim * size );
     192                        ptr = (T*) (void *) resize( (int *)Resize, Align, Dim * size );
    181193                } else if (Realloc) {
    182194                        if (Fill.tag != '0') copy_end = min(malloc_size( Realloc ), Dim * size);
    183 //printf("2. $alloc_internal got: %p %p %lu %lu\n", Resize, Realloc, Align, Dim);
    184                         ptr = (T*) (void *) realloc( (void *)Realloc, Align, Dim * size );
     195                        ptr = (T*) (void *) realloc( (int *)Realloc, Align, Dim * size );
    185196                } else {
    186 //printf("3. $alloc_internal got: %p %p %lu %lu\n", Resize, Realloc, Align, Dim);
    187197                        ptr = (T*) (void *) memalign( Align, Dim * size );
    188198                }
Note: See TracChangeset for help on using the changeset viewer.