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