|
|
1.1 root 1: /*ident "@(#)ctrans:src/del.c 1.1.3.8" */
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 Technologies, Inc. All rigths Reserved
8: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.
9:
10: del.c:
11:
12: walk the trees to reclaim storage
13:
14: **************************************************************/
15:
16: #include "cfront.h"
17:
18: void name::del()
19: {
20: DB( if(Adebug>=1) {
21: fprintf(stderr,"\n*** '%s'->del()",string?string:"???");
22: display_type(tp); putc(' ',stderr);
23: where.put(stderr); putc('\n',stderr);
24: }
25: if ( base!=NAME && base!=TNAME ) error('i',"name::del() of%k -- id==%ld",base,node::id);
26: );
27: Pexpr i = n_initializer;
28:
29: // error('d', "\nname::del: %d %s", this, string?string:"no name" );
30: // NFn++;
31: DEL(tp);
32: if(i && i!=(Pexpr)1) DEL(i);
33: delete this;
34: }
35:
36: void type::del()
37: {
38: DB( if(Adebug>=1) {
39: fprintf(stderr,"\n*** '");
40: display_type(this);
41: fprintf(stderr," '->del()\n");
42: }
43: if(!node::allocated) error('i',"deleting unallocated type node! %t -- id==%ld",this,node::id);
44: node::allocated = 0;
45: );
46: //fprintf(stderr,"DEL(type=%d %d)\n",this,base);
47: permanent = 3; /* do not delete twice */
48: switch (base) {
49: case TNAME:
50: case NAME:
51: error('i',"%d->T::del():N %s %d",this,Pname(this)->string,base);
52: case FCT:
53: { Pfct f = (Pfct) this;
54: DEL(f->returns);
55: break;
56: }
57: case VEC:
58: { Pvec v = (Pvec) this;
59: DEL(v->dim);
60: DEL(v->typ);
61: break;
62: }
63: case PTR:
64: case RPTR:
65: { Pptr p = (Pptr) this;
66: DEL(p->typ);
67: break;
68: }
69: }
70:
71: delete this;
72: }
73:
74: void expr::del()
75: {
76: DB( if(Adebug>=1) {
77: fprintf(stderr,"\n*** expr::del(): ");
78: display_expr(this,0,1);
79: if(Adebug>=2) display_expr(this);
80: });
81: //fprintf(stderr,"DEL(expr=%d: %d %d %d)\n",this,base,e1,e2); fflush(stderr);
82: permanent = 3;
83: switch (base) {
84: case IVAL:
85: if (this == one) return;
86: //case FVAL:
87: case THIS:
88: case ICON:
89: case FCON:
90: case CCON:
91: case STRING:
92: case TEXT:
93: goto dd;
94: case DUMMY:
95: case ZERO:
96: case NAME:
97: return;
98: case CAST:
99: case SIZEOF:
100: case NEW:
101: case GNEW:
102: case VALUE:
103: DEL(tp2);
104: break;
105: case REF:
106: case DOT:
107: DEL(e1);
108: if (e2) DEL(e2);
109: case MDOT:
110: if (mem && mem->base!=NAME) DEL(mem);
111: if ( i1 == 5 ) delete string4;
112: goto dd;
113: case QUEST:
114: DEL(cond);
115: break;
116: case ICALL:
117: delete il->i_args;
118: delete il;
119: goto dd;
120: case ELIST: { // limit recursion
121: Pexpr tp = e2;
122: while ( tp && tp->e2 && tp->e2->base == ELIST ) {
123: Pexpr x = tp;
124: if ( x->permanent ) break;
125: x->permanent = 3;
126: tp = tp->e2;
127: if ( x->e1 ) DEL(x->e1);
128: delete x;
129: }
130: e2 = tp;
131: break;
132: }
133: }
134:
135: DEL(e1);
136: DEL(e2);
137: dd:
138: delete this;
139: }
140:
141: void stmt::del()
142: {
143: DB( if(Adebug>=1) {
144: fprintf(stderr,"\n*** stmt::del(): ");
145: display_stmt(this,0,1);
146: if(Adebug>=2) display_stmt(this);
147: });
148: //fprintf(stderr,"DEL(stmt %d %s)\n",this,keys[base]); fflush(stderr);
149: permanent = 3;
150: switch (base) {
151: case SM:
152: case WHILE:
153: case DO:
154: case RETURN:
155: case CASE:
156: case SWITCH:
157: DEL(e);
158: break;
159: case PAIR:
160: DEL(s2);
161: break;
162: case BLOCK:
163: DEL(d);
164: DEL(s);
165: if (own_tbl) DEL(memtbl);
166: DEL(s_list);
167: goto dd;
168: case FOR:
169: DEL(e);
170: DEL(e2);
171: DEL(for_init);
172: break;
173: case IF:
174: DEL(e);
175: DEL(else_stmt);
176: break;
177: }
178:
179: DEL(s);
180: DEL(s_list);
181: dd:
182: delete this;
183: }
184:
185: void table::del()
186: {
187: // error('d',"\n*** %d::del() -- '%s'\n",this, t_name?t_name->string:"???");
188: DB( if(Adebug>=1) {
189: fprintf(stderr,"\n*** table:;del() -- '%s'\n",t_name?t_name->string:"???");
190: }
191: if(!node::allocated) error('i',"deleting unallocated table %s! -- id==%ld", t_name?t_name->string:"???",node::id);
192: node::allocated = 0;
193: );
194: for (register i=1; i<free_slot; i++) {
195: Pname n = entries[i];
196: if (n==0) error('i',"table.del(0)");
197: DB( if(Adebug>=2) { fprintf(stderr," name: '%s'",n->string);
198: display_type(n->tp); putc('\n',stderr);
199: });
200: // error( 'd',"\ntable::del: %s n_scope: %d, n_stclass: %d", n->string, n->n_scope, n->n_stclass );
201: if (n->n_stclass == STATIC) continue;
202: switch (n->n_scope) {
203: case ARG:
204: case ARGT:
205: break;
206: default:
207: { char* s = n->string;
208: if (s && (s[0]!='_' || s[1]!='_' || s[2]!='X')) delete s;
209: /* delete n; */
210: n->del();
211: }
212: }
213: }
214: delete entries;
215: delete hashtbl;
216: delete this;
217: }
218:
219: // local class
220: void delete_local()
221: {
222: DB( if(Adebug>=1) {
223: fprintf( stderr, "delete_local: vlist: %d", vlist );
224: });
225: // error( 'd', "delete_local: vlist: %d", vlist );
226: do {
227: for (vl* v = vlist; v; v = v->next) v->cl->really_print(v->vt);
228: vlist = 0;
229:
230: for (Plist l=isf_list; l; l=l->l) {
231: Pname n = l->f;
232: Pfct f = Pfct(n->tp);
233: // error('d',"isf %n f %d",n,f);
234: if ( f == 0 ) { error('d', "delete_local: f == 0" );break;}
235: if (f->base == OVERLOAD) {
236: n = Pgen(f)->fct_list->f; // first fct
237: f = Pfct(n->tp);
238: }
239:
240: if (debug_opt==0 && n->n_addr_taken) {
241: f->f_inline = 0;
242: if (n->n_dcl_printed<2) {
243: if (warning_opt)
244: error('w',"out-of-line copy of %n created",n);
245: n->dcl_print(0);
246: }
247: }
248: }
249: //isf_list = 0;
250: } while (vlist);
251:
252: for ( Plist l = local_class; l; l = l->l )
253: {
254: Pname n = l->f;
255: // error( 'd' , "delete_local() %d %n %t", n, n, n->tp );
256: // printf( "\ndelete_local: %d %s", n, n->string );
257: Pname nn = Pbase(n->tp)->b_name;
258: Pclass cl = Pclass(nn->tp);
259: for (Pname px, p=cl->mem_list; p; p=px) {
260: px = p->n_list;
261: if (p->tp)
262: switch (p->tp->base) {
263: case FCT:
264: { Pfct f = (Pfct)p->tp;
265: if (f->body) {
266: if (f->f_inline==0
267: && f->f_imeasure==0) {
268: if (f->f_this) f->f_this->n_table = 0;
269: DEL(f->body);
270: f->body = 0;
271: }
272: }
273: }
274: case COBJ:
275: case EOBJ:
276: DEL(p);
277: break;
278: case CLASS:
279: case ENUM:
280: break;
281: default:
282: delete p;
283: } // end switch
284: else delete p;
285: } // end for mem
286: DEL(cl->memtbl);
287: cl->mem_list = 0;
288: cl->permanent = 3;
289: nn->permanent = 0;
290: DEL(nn);
291: n->permanent = 0;
292: extern void table_delete( char*, TOK, int );
293: // error( 'd', "local delete: n_key: %k lex_level: %d", n->n_key, n->lex_level );
294: table_delete( n->string, LOCAL, n->lex_level );
295: DEL(n);
296: }
297: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.