|
|
1.1 root 1: /*ident "@(#)ctrans:src/alloc.c 1.4" */
2: /**************************************************************************
3:
4: C++ source for cfront, the C++ compiler front-end
5: written in the computer science research center of Bell Labs
6:
7: Copyright (c) 1984 AT&T, Inc. All Rights Reserved
8: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.
9:
10: alloc.c:
11:
12: *****************************************************************************/
13: #include "cfront.h"
14: #include "size.h"
15: #include "sysent.h"
16: #include <memory.h>
17:
18: const int NBITE = (CHUNK-8)/sizeof(name)-1;
19: const int EBITE = (CHUNK-8)/sizeof(expr)-1;
20: const int SBITE = (CHUNK-8)/sizeof(stmt)-1;
21: const int TBITE = (CHUNK-8)/sizeof(table)-1;
22: const int VBITE = (CHUNK-8)/sizeof(vec)-1;
23: const int FBITE = (CHUNK-8)/sizeof(fct)-1;
24: const int PBITE = (CHUNK-8)/sizeof(ptr)-1;
25:
26: #define mzero(p,l) memset(p,0,l)
27:
28: void* chunk(int i) // get memory that is not to be freed
29: {
30: register char* cp = malloc(i*CHUNK-8);
31: if (cp == 0) { // no space
32: free((char*)gtbl); // get space for error message
33: error('i',"free store exhausted");
34: }
35: return cp;
36: }
37:
38: #ifdef __HAVE_SIZE_T
39: #include <new.h>
40: #define NEW_SIZE size_t
41: #else
42: #define NEW_SIZE long
43: #endif
44:
45: void* operator new(NEW_SIZE sz) // get memory that might be freed
46: {
47: char* p = calloc((unsigned)sz,1);
48:
49: //fprintf(stderr,"alloc(%d)->%d\n",sz,p);
50:
51: if (p == 0) { // no space
52: free((char*)gtbl); // get space for error message
53: error('i',"free store exhausted");
54: }
55: return p;
56: }
57:
58: void operator delete (void* p)
59: {
60: if (p == 0) return;
61:
62: //fprintf(stderr,"free(%d) %d\n",p,((int*)p)[-1]-(int)p-1+sizeof(int*));
63:
64: free((char*)p);
65: }
66:
67: // class new and delete operators
68:
69: void*
70: expr::operator new(size_t sz)
71: {
72: register Pexpr p;
73:
74: if ( (p=expr_free) == 0 ) {
75: register Pexpr q = (Pexpr) chunk(1);
76: for (p=expr_free=&q[EBITE-1]; q<p; p--) {
77: p->e1 = p-1;
78: DB(p->node::allocated=0);
79: }
80: (p+1)->e1 = 0;
81: DB(p->node::allocated=0);
82: }
83: else
84: expr_free = p->e1;
85:
86: mzero(p,sz);
87: return p;
88: }
89:
90: void
91: expr::operator delete(void* vp, size_t)
92: {
93: Pexpr p = (Pexpr)vp;
94:
95: DB( if(!p->node::allocated) error('i',"deleting unallocated expr:%k! -- id==%d",p->base,p->node::id);
96: p->node::allocated = 0;
97: );
98: p->e1 = expr_free;
99: expr_free = p;
100: vp = 0;
101: }
102:
103: void*
104: stmt::operator new(size_t sz)
105: {
106: register Pstmt p;
107: if ( (p=stmt_free) == 0 ) {
108: register Pstmt q = (Pstmt) chunk(1);
109: for (p=stmt_free=&q[SBITE-1]; q<p; p--) {
110: p->s_list = p-1;
111: DB(p->node::allocated=0);
112: }
113: (p+1)->s_list = 0;
114: DB(p->node::allocated=0);
115: }
116: else
117: stmt_free = p->s_list;
118:
119: mzero(p,sz);
120: return p;
121: }
122:
123: void
124: stmt::operator delete(void* vp,size_t)
125: {
126: Pstmt p = (Pstmt)vp;
127: DB( if(!p->node::allocated) error('i',"deleting unallocated stmt:%k! -- id==%d",p->base,p->node::id);
128: p->node::allocated = 0;
129: );
130: p->s_list = stmt_free;
131: stmt_free = p;
132: vp = 0;
133: }
134:
135: void*
136: name::operator new(size_t sz)
137: {
138: register Pname p;
139:
140: if ( (p=name_free) == 0 ) {
141: register Pname q = (Pname) chunk(1);
142: for (p=name_free=&q[NBITE-1]; q<p; p--) {
143: p->n_tbl_list = p-1;
144: DB(p->node::allocated=0);
145: }
146: (p+1)->n_tbl_list = 0;
147: DB(p->node::allocated=0);
148: }
149: else
150: name_free = p->n_tbl_list;
151:
152: mzero(p,sz);
153: return p;
154: }
155:
156: void
157: name::operator delete(void* vp,size_t)
158: {
159: Pname p = (Pname)vp;
160: DB( if(!p->node::allocated) error('i',"deleting unallocated name %s! -- id==%d",p->string?p->string:"???",p->node::id);
161: p->node::allocated = 0;
162: );
163: p->n_tbl_list = name_free;
164: name_free = p;
165: vp = 0;
166: }
167:
168: void*
169: table::operator new(size_t sz)
170: {
171: register Ptable p;
172:
173: if ( (p=table_free) == 0 ) {
174: register Ptable q = (Ptable) chunk(1);
175: for (p=table_free=&q[TBITE-1]; q<p; p--) {
176: p->next = p-1;
177: DB(p->node::allocated=0);
178: }
179: (p+1)->next = 0;
180: DB(p->node::allocated=0);
181: }
182: else
183: table_free = p->next;
184:
185: mzero(p, sz);
186: return p;
187: }
188:
189: void
190: table::operator delete(void* vp,size_t)
191: {
192: Ptable p = (Ptable)vp;
193: DB( if(!p->node::allocated) error('i',"deleting unallocated table %d! -- id==%d",p->base,p->node::id);
194: p->node::allocated = 0;
195: );
196: p->next = table_free;
197: table_free = p;
198: vp = 0;
199: }
200:
201: void*
202: vec::operator new(size_t sz)
203: {
204: register Pvec p;
205:
206: if ( (p=vec_free) == 0 ) {
207: register Pvec q = (Pvec) chunk(1);
208: for (p=vec_free=&q[VBITE-1]; q<p; p--) {
209: p->tlist = p-1;
210: DB(p->node::allocated=0);
211: }
212: (p+1)->tlist = 0;
213: DB(p->node::allocated=0);
214: }
215: else
216: vec_free = (Pvec) p->tlist;
217:
218: mzero(p, sz);
219: return p;
220: }
221:
222: void
223: vec::operator delete(void* vp,size_t)
224: {
225: Pvec p = (Pvec)vp;
226: DB( if(!p->node::allocated) error('i',"deleting unallocated vec %d! -- id==%d",p->base,p->node::id);
227: p->node::allocated = 0;
228: );
229: p->tlist = vec_free;
230: vec_free = p;
231: vp = 0;
232: }
233:
234: void*
235: fct::operator new(size_t sz)
236: {
237: register Pfct p;
238:
239: if ( (p=fct_free) == 0 ) {
240: register Pfct q = (Pfct) chunk(1);
241: for (p=fct_free=&q[FBITE-1]; q<p; p--) {
242: p->tlist = p-1;
243: DB(p->node::allocated=0);
244: }
245: (p+1)->tlist = 0;
246: DB(p->node::allocated=0);
247: }
248: else
249: fct_free = (Pfct) p->tlist;
250:
251: mzero(p, sz);
252: return p;
253: }
254:
255: void
256: fct::operator delete(void* vp,size_t)
257: {
258: Pfct p = (Pfct)vp;
259: DB( if(!p->node::allocated) error('i',"deleting unallocated fct %d! -- id==%d",p->base,p->node::id);
260: p->node::allocated = 0;
261: );
262: p->tlist = fct_free;
263: fct_free = p;
264: vp = 0;
265: }
266:
267: void*
268: ptr::operator new(size_t sz)
269: {
270: register Pptr p;
271:
272: //error('d',"ptr new");
273: if ( (p=ptr_free) == 0 ) {
274: register Pptr q = (Pptr) chunk(1);
275: for (p=ptr_free=&q[PBITE-1]; q<p; p--) {
276: p->tlist = p-1;
277: DB(p->node::allocated=0);
278: }
279: (p+1)->tlist = 0;
280: DB(p->node::allocated=0);
281: }
282: else
283: ptr_free = (Pptr) p->tlist;
284:
285: mzero(p, sz);
286: return p;
287: }
288:
289: void
290: ptr::operator delete(void* vp,size_t)
291: {
292: Pptr p = (Pptr)vp;
293: DB( if(!p->node::allocated) error('i',"deleting unallocated ptr %d! -- id==%d",p->base,p->node::id);
294: p->node::allocated = 0;
295: );
296: p->tlist = ptr_free;
297: ptr_free = p;
298: vp = 0;
299: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.