Annotation of parser3/src/include/pa_memory.h, revision 1.33
1.2 paf 1: /** @file
2: Parser: memory reference counting classes decls.
3:
1.30 moko 4: Copyright (c) 2001-2017 Art. Lebedev Studio (http://www.artlebedev.com)
1.2 paf 5:
6: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
7: */
8:
9: #ifndef PA_MEMORY_H
10: #define PA_MEMORY_H
11:
1.33 ! moko 12: #define IDENT_PA_MEMORY_H "$Id: pa_memory.h,v 1.32 2017/11/15 22:48:57 moko Exp $"
1.2 paf 13:
14: // include
15:
16: #include "pa_config_includes.h"
17: #include "gc.h"
1.24 moko 18: #include <new>
1.2 paf 19:
1.19 moko 20: // define destructors use for Array, Hash and VMethodFrame
1.17 misha 21: #define USE_DESTRUCTORS
1.33 ! moko 22: // std::basic_stringstream used in ^table.csv-string[] is compatible with delete usage check only under Debian 9
! 23: // #define CHECK_DELETE_USAGE
1.17 misha 24:
1.2 paf 25: inline void* pa_gc_malloc(size_t size) { return GC_MALLOC(size); }
26: inline void* pa_gc_malloc_atomic(size_t size) { return GC_MALLOC_ATOMIC(size); }
27: inline void* pa_gc_realloc(void* ptr, size_t size) { return GC_REALLOC(ptr, size); }
28: inline void pa_gc_free(void* ptr) { GC_FREE(ptr); }
29:
30: // forwards
31:
32: void *pa_fail_alloc(const char* what, size_t size);
33:
34: // inlines
35:
36: inline void *pa_malloc(size_t size) {
1.4 paf 37: if(void *result=pa_gc_malloc(size))
1.2 paf 38: return result;
39:
40: return pa_fail_alloc("allocate", size);
41: }
42:
43: inline void *pa_malloc_atomic(size_t size) {
1.4 paf 44: if(void *result=pa_gc_malloc_atomic(size))
1.2 paf 45: return result;
46:
47: return pa_fail_alloc("allocate clean", size);
48: }
1.20 moko 49:
1.2 paf 50: /// @a length may be null, which mean "autocalc it"
51: inline char *pa_strdup(const char* auto_variable_never_null, size_t helper_length=0) {
1.20 moko 52: size_t known_length= helper_length ? helper_length : strlen(auto_variable_never_null);
1.2 paf 53:
1.10 paf 54: size_t size=known_length+1;
55: if(char *result=static_cast<char*>(pa_gc_malloc_atomic(size))) {
1.9 paf 56: memcpy(result, auto_variable_never_null, known_length);
1.2 paf 57: result[known_length]=0;
58: return result;
59: }
60:
61: return static_cast<char*>(pa_fail_alloc("allocate clean", size));
62: }
63:
64: inline void pa_free(void *ptr) {
1.4 paf 65: pa_gc_free(ptr);
1.2 paf 66: }
67:
68: inline void *pa_realloc(void *ptr, size_t size) {
1.4 paf 69: if(void *result=pa_gc_realloc(ptr, size))
1.2 paf 70: return result;
71:
72: return pa_fail_alloc("reallocate to", size);
73: }
74:
1.32 moko 75: /// memory allocation/dallocation goes via pa_malloc/pa_free.
76: class PA_Allocated {
77: public:
78: /// the sole: instances allocated using our functions
79: static void *operator new(size_t size) {
80: return pa_malloc(size);
81: }
82: static void operator delete(void *ptr) {
83: pa_free(ptr);
84: }
85: static void *operator new[](size_t size) {
86: return pa_malloc(size);
87: }
88: static void operator delete[](void *ptr) {
89: pa_free(ptr);
90: }
91: };
92:
93: // new(PointerFreeGC)/new(PointerGC) should be used to allocate types not inherited from PA_Allocated
94:
95: #define PointerFreeGC (true)
96: #define PointerGC (false)
97:
98: inline void *operator new[] (size_t size, bool pointer_free) {
99: return pointer_free ? pa_malloc_atomic(size) : pa_malloc(size);
100: }
101:
102: inline void *operator new (size_t size, bool pointer_free) {
103: return pointer_free ? pa_malloc_atomic(size) : pa_malloc(size);
104: }
105:
106: /// Base for all Parser classes
107: typedef PA_Allocated PA_Object;
108:
109: // defines
110:
111: #define override
112: #define rethrow throw
113:
1.31 moko 114: #if defined(_MSC_VER) || (__cplusplus>=201103L)
1.26 moko 115: #define PA_THROW(what)
116: #else
117: #define PA_THROW(what) throw(what)
118: #endif
119:
1.32 moko 120: #ifndef _MSC_VER
121:
122: // regular new/delete are disabled from accidental use
123:
124: void *new_disabled();
125: void delete_disabled();
126:
127: inline void *operator new[] (std::size_t size) PA_THROW(std::bad_alloc){ return new_disabled(); }
128: inline void operator delete[](void *ptr) throw(){ delete_disabled(); }
1.2 paf 129:
1.32 moko 130: inline void *operator new(std::size_t size) PA_THROW(std::bad_alloc){ return new_disabled(); }
1.33 ! moko 131: #ifdef CHECK_DELETE_USAGE
1.32 moko 132: inline void operator delete(void *ptr) throw(){ delete_disabled(); }
1.33 ! moko 133: #endif
1.2 paf 134:
1.32 moko 135: // other regular allocators as disabled from accidental use as well
1.21 moko 136:
137: void *calloc_disabled();
138: void *malloc_disabled();
139: void *realloc_disabled();
140: void free_disabled();
141: char *strdup_disabled();
142:
1.24 moko 143: inline void *calloc(size_t) { return calloc_disabled(); }
1.25 moko 144: inline void *malloc(size_t) { return malloc_disabled(); }
145: inline void *realloc(void *, size_t) { return realloc_disabled(); }
146: inline void free(void *) { free_disabled(); }
1.21 moko 147: inline char *strdup(const char*, size_t){ return strdup_disabled(); }
1.32 moko 148:
1.22 moko 149: #endif
1.21 moko 150:
1.2 paf 151: #endif
E-mail: