/*ident "@(#)cls4:src/del.c 1.6" */ /******************************************************************************* C++ source for the C++ Language System, Release 3.0. This product is a new release of the original cfront developed in the computer science research center of AT&T Bell Laboratories. Copyright (c) 1993 UNIX System Laboratories, Inc. Copyright (c) 1991, 1992 AT&T and UNIX System Laboratories, Inc. Copyright (c) 1984, 1989, 1990 AT&T. All Rights Reserved. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE of AT&T and UNIX System Laboratories, Inc. The copyright notice above does not evidence any actual or intended publication of such source code. del.c: walk the trees to reclaim storage **************************************************************/ #include "cfront.h" void name::del() { DB( if(Adebug>=1) { fprintf(stderr,"\n*** '%s'->del()",string?string:"???"); display_type(tp); putc(' ',stderr); where.put(stderr); putc('\n',stderr); } if ( base!=NAME && base!=TNAME ) error('i',"name::del() of%k -- id==%ld",base,node::id); ); Pexpr i = n_initializer; // error('d', "\nname::del: %d %s", this, string?string:"no name" ); // NFn++; DEL(tp); if(i && i!=(Pexpr)1) DEL(i); delete this; } void type::del() { DB( if(Adebug>=1) { fprintf(stderr,"\n*** '"); display_type(this); fprintf(stderr," '->del()\n"); } ); //fprintf(stderr,"DEL(type=%d %d)\n",this,base); permanent = 3; /* do not delete twice */ switch (base) { case TNAME: case NAME: error('i',"%d->T::del():N %s %d",this,Pname(this)->string,base); case FCT: { Pfct f = (Pfct) this; DEL(f->returns); delete f; break; } case VEC: { Pvec v = (Pvec) this; DEL(v->dim); DEL(v->typ); delete v; break; } case PTR: case RPTR: { Pptr p = (Pptr) this; DEL(p->typ); delete p; break; } } } void expr::del() { DB( if(Adebug>=1) { fprintf(stderr,"\n*** expr::del(): "); display_expr(this,0,1); if(Adebug>=2) display_expr(this); }); //fprintf(stderr,"DEL(expr=%d: %d %d %d)\n",this,base,e1,e2); fflush(stderr); permanent = 3; switch (base) { case IVAL: if (this == one) return; //case FVAL: case THIS: case ICON: case FCON: case CCON: case STRING: case TEXT: goto dd; case DUMMY: // null or error case DTOR: // dummy type destructor case ZERO: case NAME: return; case CAST: case G_CAST: case SIZEOF: case NEW: case GNEW: case VALUE: DEL(tp2); break; case REF: case DOT: DEL(e1); if (e2) DEL(e2); case MDOT: if (mem && mem->base!=NAME) DEL(mem); if ( i1 == 5 ) delete string4; goto dd; case QUEST: DEL(cond); break; case ICALL: delete il->i_args; delete il; goto dd; case ELIST: { // limit recursion Pexpr tp = e2; while ( tp && tp->e2 && tp->e2->base == ELIST ) { Pexpr x = tp; if ( x->permanent ) break; x->permanent = 3; tp = tp->e2; if ( x->e1 ) DEL(x->e1); delete x; } e2 = tp; break; } } DEL(e1); DEL(e2); dd: delete this; } void stmt::del() { DB( if(Adebug>=1) { fprintf(stderr,"\n*** stmt::del(): "); display_stmt(this,0,1); if(Adebug>=2) display_stmt(this); }); //fprintf(stderr,"DEL(stmt %d %s)\n",this,keys[base]); fflush(stderr); permanent = 3; switch (base) { case SM: case WHILE: case DO: case RETURN: case CASE: case SWITCH: DEL(e); break; case PAIR: DEL(s2); break; case BLOCK: DEL(d); DEL(s); if (own_tbl) DEL(memtbl); DEL(s_list); goto dd; case FOR: DEL(e); DEL(e2); DEL(for_init); break; case IF: DEL(e); DEL(else_stmt); break; } DEL(s); DEL(s_list); dd: delete this; } void table::del() { // error('d',"\n*** %d::del() -- '%s'\n",this, t_name?t_name->string:"???"); for (register int i=1; i=2) { fprintf(stderr," name: '%s'",n->string); display_type(n->tp); putc('\n',stderr); }); // error( 'd',"\ntable::del: %s n_scope: %d, n_stclass: %d", n->string, n->n_scope, n->n_stclass ); if (n->n_stclass == STATIC) continue; switch (n->n_scope) { case ARG: case ARGT: break; default: { char* s = n->string; if (s && (s[0]!='_' || s[1]!='_' || s[2]!='X')) delete s; /* delete n; */ n->del(); } } } //delete entries; //delete hashtbl; delete this; } #if 0 void ktable::del() { delete this; } #endif // local class void delete_local() { DB( if(Adebug>=1) { fprintf( stderr, "delete_local: vlist: %d", vlist ); }); // error( 'd', "delete_local: vlist: %d", vlist ); do { for (vl* v = vlist; v; v = v->next) v->cl->really_print(v->vt); vlist = 0; for (Plist l=isf_list; l; l=l->l) { Pname n = l->f; Pfct f = Pfct(n->tp); // error('d',"isf %n f %d",n,f); if ( f == 0 ) { error('d', "delete_local: f == 0" );break;} if (f->base == OVERLOAD) { n = Pgen(f)->fct_list->f; // first fct f = Pfct(n->tp); } if (debug_opt==0 && n->n_addr_taken) { f->f_inline = 0; if (n->n_dcl_printed<2) { if (warning_opt) error('w',"out-of-line copy of %n created",n); n->dcl_print(0); } } } //isf_list = 0; } while (vlist); for ( Plist l = local_class; l; l = l->l ) { Pname n = l->f; // error( 'd' , "delete_local() %d %n %t", n, n, n->tp ); Pname nn = Pbase(n->tp)->b_name; Pclass cl = Pclass(nn->tp); for (Pname px, p=cl->mem_list; p; p=px) { px = p->n_list; if (p->tp) switch (p->tp->base) { case FCT: { Pfct f = (Pfct)p->tp; if (f->body) { if (f->f_inline==0 && f->f_imeasure==0) { if (ansi_opt && f->f_this) { f->f_this->n_table = 0; for (Pname n=f->f_this->n_list; n; n=n->n_list) n->n_table = 0; } DEL(f->body); f->body = 0; } } } case COBJ: case EOBJ: DEL(p); break; case CLASS: case ENUM: break; default: delete p; } // end switch else delete p; } // end for mem DEL(cl->memtbl); cl->mem_list = 0; cl->permanent = 3; nn->permanent = 0; DEL(nn); n->permanent = 0; //SYM table_delete removed DEL(n); } }