Annotation of parser3/src/include/pa_memory.h, revision 1.28
1.2 paf 1: /** @file
2: Parser: memory reference counting classes decls.
3:
1.28 ! moko 4: Copyright (c) 2001-2015 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.28 ! moko 12: #define IDENT_PA_MEMORY_H "$Id: pa_memory.h,v 1.27 2015/10/12 14:38:03 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
22:
1.2 paf 23: inline void* pa_gc_malloc(size_t size) { return GC_MALLOC(size); }
24: inline void* pa_gc_malloc_atomic(size_t size) { return GC_MALLOC_ATOMIC(size); }
25: inline void* pa_gc_realloc(void* ptr, size_t size) { return GC_REALLOC(ptr, size); }
26: inline void pa_gc_free(void* ptr) { GC_FREE(ptr); }
27:
28: // forwards
29:
30: void *pa_fail_alloc(const char* what, size_t size);
31:
32: // inlines
33:
34: inline void *pa_malloc(size_t size) {
1.4 paf 35: if(void *result=pa_gc_malloc(size))
1.2 paf 36: return result;
37:
38: return pa_fail_alloc("allocate", size);
39: }
40:
41: inline void *pa_malloc_atomic(size_t size) {
1.4 paf 42: if(void *result=pa_gc_malloc_atomic(size))
1.2 paf 43: return result;
44:
45: return pa_fail_alloc("allocate clean", size);
46: }
1.20 moko 47:
1.2 paf 48: /// @a length may be null, which mean "autocalc it"
49: inline char *pa_strdup(const char* auto_variable_never_null, size_t helper_length=0) {
1.20 moko 50: size_t known_length= helper_length ? helper_length : strlen(auto_variable_never_null);
1.2 paf 51:
1.10 paf 52: size_t size=known_length+1;
53: if(char *result=static_cast<char*>(pa_gc_malloc_atomic(size))) {
1.9 paf 54: memcpy(result, auto_variable_never_null, known_length);
1.2 paf 55: result[known_length]=0;
56: return result;
57: }
58:
59: return static_cast<char*>(pa_fail_alloc("allocate clean", size));
60: }
61:
62: inline void pa_free(void *ptr) {
1.4 paf 63: pa_gc_free(ptr);
1.2 paf 64: }
65:
66: inline void *pa_realloc(void *ptr, size_t size) {
1.4 paf 67: if(void *result=pa_gc_realloc(ptr, size))
1.2 paf 68: return result;
69:
70: return pa_fail_alloc("reallocate to", size);
71: }
72:
1.26 moko 73: #ifdef _MSC_VER
74: #define PA_THROW(what)
75: #else
76: #define PA_THROW(what) throw(what)
77: #endif
78:
1.2 paf 79: #define PointerFreeGC (true)
80:
81: //{@ Array-oriented
82: inline void *operator new[] (size_t size, bool) { // PointerFreeGC
83: return pa_malloc_atomic(size);
84: }
1.26 moko 85: inline void *operator new[] (std::size_t size) PA_THROW(std::bad_alloc) {
1.24 moko 86: return pa_malloc(size);
87: }
1.27 moko 88: inline void operator delete[] (void *ptr) throw() {
1.2 paf 89: pa_free(ptr);
90: }
91: //}@
92:
93: //{@ Structure-oriented
94: inline void *operator new (size_t size, bool) { // PointerFreeGC
95: return pa_malloc_atomic(size);
96: }
1.26 moko 97: inline void *operator new(std::size_t size) PA_THROW(std::bad_alloc) {
1.24 moko 98: return pa_malloc(size);
99: }
1.27 moko 100: inline void operator delete(void *ptr) throw() {
1.2 paf 101: pa_free(ptr);
102: }
103: //}@
104:
1.23 moko 105: #ifndef _MSC_VER
1.21 moko 106: // disabled from accidental use
107:
108: void *calloc_disabled();
109: void *malloc_disabled();
110: void *realloc_disabled();
111: void free_disabled();
112: char *strdup_disabled();
113:
1.24 moko 114: inline void *calloc(size_t) { return calloc_disabled(); }
1.25 moko 115: inline void *malloc(size_t) { return malloc_disabled(); }
116: inline void *realloc(void *, size_t) { return realloc_disabled(); }
117: inline void free(void *) { free_disabled(); }
1.21 moko 118: inline char *strdup(const char*, size_t){ return strdup_disabled(); }
1.22 moko 119: #endif
1.21 moko 120:
1.2 paf 121: /// memory allocation/dallocation goes via pa_malloc/pa_free.
122: class PA_Allocated {
123: public:
124: /// the sole: instances allocated using our functions
125: static void *operator new(size_t size) {
126: return pa_malloc(size);
127: }
128: static void operator delete(void *ptr) {
129: pa_free(ptr);
130: }
131: };
132:
133: /// Base for all Parser classes
134: typedef PA_Allocated PA_Object;
135:
136: // defines
137:
138: #define override
139: #define rethrow throw
140:
141: #endif
E-mail: