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