On Sun, Aug 24, 2014 at 12:47:17AM +0200, Thomas Koenig wrote: > Hello world, > > the attached patch uses the vec<> templates instead of the > home-grown memory management. > > Did I get the style right? I was a bit confused because, with > the declarations used in the patch, using the vec_safe_truncate > function failed with a failure to find the right template. > I'm not an experienced C++ programmer, so I would appreciate a quick > look at what I did. > > Regression-tested. No test case because there is no new > functionality. > > OK for trunk? Any other comments? > > Thomas > > 2014-08-24 Thomas Koenig <tkoe...@gcc.gnu.org> > > * frontend_passes (expr_array): Replace by vec template. > (expr_size): Remove. > (expr_count): Remove. > (doloop_list): Replace by vec template. > (doloop_size): Remove. > (gfc_run_passes): Adjust to use of vec template. > (cfe_register_funcs): Likewise. > (cfe_expr_0): Likewise. > (doloop_code): Likewise.
> Index: frontend-passes.c > =================================================================== > --- frontend-passes.c (Revision 214281) > +++ frontend-passes.c (Arbeitskopie) > @@ -50,8 +50,7 @@ static int count_arglist; > /* Pointer to an array of gfc_expr ** we operate on, plus its size > and counter. */ > > -static gfc_expr ***expr_array; > -static int expr_size, expr_count; > +static vec<gfc_expr **> expr_array = vec<gfc_expr **>(); that's usually written as just static vec<T> foo; vec doesn't actually have ctors, and 0 initialization works fine. > /* Pointer to the gfc_code we currently work on - to be able to insert > a block before the statement. */ > @@ -81,9 +80,10 @@ static int iterator_level; > > /* Keep track of DO loop levels. */ > > -static gfc_code **doloop_list; > -static int doloop_size, doloop_level; > +static vec<gfc_code *> doloop_list = vec<gfc_code *>(); same > @@ -101,23 +101,19 @@ gfc_run_passes (gfc_namespace *ns) > /* Warn about dubious DO loops where the index might > change. */ > > - doloop_size = 20; > doloop_level = 0; > - doloop_list = XNEWVEC(gfc_code *, doloop_size); > + // doloop_list = ; what is this comment supposed to mean? > doloop_warn (ns); > - XDELETEVEC (doloop_list); > + doloop_list.truncate (0); .release () would be more typical. > > if (gfc_option.flag_frontend_optimize) > { > - expr_size = 20; > - expr_array = XNEWVEC(gfc_expr **, expr_size); > - > optimize_namespace (ns); > optimize_reduction (ns); > if (gfc_option.dump_fortran_optimized) > gfc_dump_parse_tree (ns, stdout); > > - XDELETEVEC (expr_array); > + expr_array.truncate (0); same > @@ -608,36 +599,35 @@ cfe_expr_0 (gfc_expr **e, int *walk_subtrees, > return 0; > } > > - expr_count = 0; > + expr_array.truncate (0); .release () > gfc_expr_walker (e, cfe_register_funcs, NULL); > > /* Walk through all the functions. */ > > - for (i=1; i<expr_count; i++) > + for (i=1; expr_array.iterate (i, &ei); i++) FOR_EACH_VEC_ELT, though Its not really clear to my why that's better than size_t length = vec.length (); for (size_t i = 0; i < length; i++) // do something with vec[i] > { > /* Skip if the function has been replaced by a variable already. */ > - if ((*(expr_array[i]))->expr_type == EXPR_VARIABLE) > + if ((*ei)->expr_type == EXPR_VARIABLE) > continue; > > newvar = NULL; > - for (j=0; j<i; j++) > + for (j=0; j<i && expr_array.iterate (j, &ej); j++) the .iterate call is useless since j must be < i, and the vector is at least i long right? Trev