Diff for /parser3/src/include/pa_memory.h between versions 1.1.2.9.2.2 and 1.39

version 1.1.2.9.2.2, 2003/03/19 13:16:56 version 1.39, 2020/12/15 13:29:27
Line 1 Line 1
 /** @file  /** @file
         Parser: memory reference counting classes decls.          Parser: memory reference counting classes decls.
   
         Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001-2017 Art. Lebedev Studio (http://www.artlebedev.com)
   
         Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
 */  */
Line 9 Line 9
 #ifndef PA_MEMORY_H  #ifndef PA_MEMORY_H
 #define PA_MEMORY_H  #define PA_MEMORY_H
   
 static const char* IDENT_MEMORY_H="$Date$";  #define IDENT_PA_MEMORY_H "$Id$"
   
 #define PA_DEBUG_REFERENCES  
   
 // include  // include
   
 #include "pa_config_includes.h"  #include "pa_config_includes.h"
 #include "gc.h"  #include <new>
   
   // define destructors use for Array, Hash and VMethodFrame
   #define USE_DESTRUCTORS
   
 #ifdef XML  // std::basic_stringstream used in ^table.csv-string[] is compatible with delete usage check only under Debian 9/10, FreeBSD 12
 #       include "gdome.h"  // #define CHECK_DELETE_USAGE
 // for xmlChar  
 #       include "libxml/tree.h"  
 #endif  
   
 // forwards  // forwards
   
 void *pa_fail_alloc(const char *what, size_t size);  void *pa_fail_alloc(const char* what, size_t size);
   
 // inlines  // inlines
   
Line 44  inline void *pa_malloc_atomic(size_t siz Line 41  inline void *pa_malloc_atomic(size_t siz
   
         return pa_fail_alloc("allocate clean", size);          return pa_fail_alloc("allocate clean", size);
 }  }
   
   /// @a length may be null, which mean "autocalc it"
   inline char *pa_strdup(const char* auto_variable_never_null, size_t helper_length=0) {
           size_t known_length= helper_length ? helper_length : strlen(auto_variable_never_null);
   
           size_t size=known_length+1;
           if(char *result=static_cast<char*>(GC_MALLOC_ATOMIC(size))) {
                   memcpy(result, auto_variable_never_null, known_length);
                   result[known_length]=0;
                   return result;
           }
   
           return static_cast<char*>(pa_fail_alloc("allocate clean", size));
   }
   
 inline void pa_free(void *ptr) {  inline void pa_free(void *ptr) {
         GC_FREE(ptr);          GC_FREE(ptr);
 }  }
Line 55  inline void *pa_realloc(void *ptr, size_ Line 67  inline void *pa_realloc(void *ptr, size_
         return pa_fail_alloc("reallocate to", size);          return pa_fail_alloc("reallocate to", size);
 }  }
   
 #define DECLARE_OBJECT_PTR(name) \  
         typedef name* name##Ptr  
   
 #define DECLARE_SMART_PTR(name) \  
         typedef name* name##Ptr  
   
 // defines  
   
 #define override  
 #define rethrow throw  
   
 // memory  
   
 inline void *operator new[] (size_t size) {  
         return pa_malloc_atomic(size);  
 }  
 inline void operator delete[] (void *ptr) {  
         pa_free(ptr);  
 }  
 inline void operator delete (void *ptr) {  
         abort();  
 }  
   
 /// memory allocation/dallocation goes via pa_malloc/pa_free.  /// memory allocation/dallocation goes via pa_malloc/pa_free.
 class PA_Allocated {  class PA_Allocated {
 public:  public:
         /// the sole: instances allocated using our functions          /// the sole: instances allocated using our functions
         static void *operator new(size_t size) {           static void *operator new(size_t size) {
                 return pa_malloc(size);                  return pa_malloc(size);
         }          }
         static void operator delete(void *ptr) {          static void operator delete(void *ptr) {
                 pa_free(ptr);                  pa_free(ptr);
         }          }
         static void *malloc(size_t size) {          static void *operator new[](size_t size) {
                 return pa_malloc(size);                  return pa_malloc(size);
         }          }
         static void *malloc_atomic(size_t size) {          static void operator delete[](void *ptr) {
                 return pa_malloc_atomic(size);  
         }  
         static void free(void *ptr) {  
                 pa_free(ptr);                  pa_free(ptr);
         }          }
         static void *realloc(void *ptr, size_t size) {  };
                 return pa_realloc(ptr, size);  
         }  
   
 private: // disabled from accidental use  // new(PointerFreeGC)/new(PointerGC) should be used to allocate types not inherited from PA_Allocated
   
         /// use malloc instead [GC clears malloc result]  #define PointerFreeGC (true)
         static void *calloc(size_t size);  #define PointerGC (false)
   
 };  inline void *operator new[] (size_t size, bool pointer_free) {
           return pointer_free ? pa_malloc_atomic(size) : pa_malloc(size);
   }
   
   inline void *operator new (size_t size, bool pointer_free) {
           return pointer_free ? pa_malloc_atomic(size) : pa_malloc(size);
   }
   
 /// Base for all Parser classes  /// Base for all Parser classes
 typedef PA_Allocated PA_Object;  typedef PA_Allocated PA_Object;
   
 // convinient types  // defines
   
   #define override
   #define rethrow throw
   
   #if defined(_MSC_VER) || (__cplusplus>=201103L)
   #define PA_THROW(what)
   #else
   #define PA_THROW(what) throw(what)
   #endif
   
   #if !defined(_MSC_VER) && !defined(FREEBSD1X)
   // regular new/delete are disabled from accidental use
   // no checks for FreeBSD1X.X due to https://bugs.llvm.org/show_bug.cgi?id=40161 bug
   
   void *new_disabled();
   void delete_disabled();
   
   inline void *operator new[] (std::size_t) PA_THROW(std::bad_alloc){ return new_disabled(); }
   inline void operator delete[](void *) throw(){ delete_disabled(); }
   inline void operator delete[](void *, std::size_t) throw(){ delete_disabled(); }
   
   inline void *operator new(std::size_t) PA_THROW(std::bad_alloc){ return new_disabled(); }
   #ifdef CHECK_DELETE_USAGE
   inline void operator delete(void *) throw(){ delete_disabled(); }
   #endif
   
   #ifndef PA_DEBUG_DISABLE_GC
   // other regular allocators as disabled from accidental use as well
   
   void *calloc_disabled();
   void *malloc_disabled();
   void *realloc_disabled();
   void free_disabled();
   char *strdup_disabled();
   
   inline void *calloc(size_t) { return calloc_disabled(); }
   inline void *malloc(size_t) { return malloc_disabled(); }
   inline void *realloc(void *, size_t) { return realloc_disabled(); }
   inline void free(void *) { free_disabled(); }
   inline char *strdup(const char*, size_t){ return strdup_disabled(); }
   #endif // PA_DEBUG_DISABLE_GC
   
   #endif // _MSC_VER
   
   #ifdef PA_DEBUG_DISABLE_GC
   #define PA_GC_COLLECT
   #else
   #define PA_GC_COLLECT { GC_enable(); GC_gcollect(); GC_disable(); }
   #endif
   
 #endif  #endif

Removed from v.1.1.2.9.2.2  
changed lines
  Added in v.1.39


E-mail: