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