Fix struct expression regression
authorTom Tromey <tom@tromey.com>
Mon, 7 Dec 2020 04:34:25 +0000 (21:34 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 7 Dec 2020 04:34:25 +0000 (21:34 -0700)
The patch to change struct expression to use new introduced a
regression -- there is a spot that reallocates expressions that I
failed to update.

This patch rewrites this code to follow the new approach.  Now the
rewriting is done in place.

gdb/ChangeLog
2020-12-06  Tom Tromey  <tom@tromey.com>

PR ada/26999
* ada-lang.c (replace_operator_with_call): Rewrite.

gdb/ChangeLog
gdb/ada-lang.c

index 21115067e58a003fbf6054210f42ae53158d3760..3c21cff271f62e74edafcc5cf6b9f9290271a7e8 100644 (file)
@@ -1,3 +1,8 @@
+2020-12-06  Tom Tromey  <tom@tromey.com>
+
+       PR ada/26999
+       * ada-lang.c (replace_operator_with_call): Rewrite.
+
 2020-12-06  Giancarlo Frix  <gfrix@rocketsoftware.com>  (tiny change)
 
        PR breakpoints/27009
index 906671155d03426fd29e4357125e0c35e8301aa5..7d062294aa5b7c7fbb3ad78049d475a92bbe98dc 100644 (file)
@@ -4000,28 +4000,23 @@ replace_operator_with_call (expression_up *expp, int pc, int nargs,
                            int oplen, struct symbol *sym,
                            const struct block *block)
 {
-  /* A new expression, with 6 more elements (3 for funcall, 4 for function
-     symbol, -oplen for operator being replaced).  */
-  struct expression *newexp = (struct expression *)
-    xzalloc (sizeof (struct expression)
-            + EXP_ELEM_TO_BYTES ((*expp)->nelts + 7 - oplen));
+  /* We want to add 6 more elements (3 for funcall, 4 for function
+     symbol, -OPLEN for operator being replaced) to the
+     expression.  */
   struct expression *exp = expp->get ();
+  int save_nelts = exp->nelts;
+  exp->nelts = exp->nelts + 7 - oplen;
+  exp->resize (exp->nelts);
 
-  newexp->nelts = exp->nelts + 7 - oplen;
-  newexp->language_defn = exp->language_defn;
-  newexp->gdbarch = exp->gdbarch;
-  memcpy (newexp->elts, exp->elts, EXP_ELEM_TO_BYTES (pc));
-  memcpy (newexp->elts + pc + 7, exp->elts + pc + oplen,
-         EXP_ELEM_TO_BYTES (exp->nelts - pc - oplen));
+  memmove (exp->elts + pc + 7, exp->elts + pc + oplen,
+          EXP_ELEM_TO_BYTES (save_nelts - pc - oplen));
 
-  newexp->elts[pc].opcode = newexp->elts[pc + 2].opcode = OP_FUNCALL;
-  newexp->elts[pc + 1].longconst = (LONGEST) nargs;
+  exp->elts[pc].opcode = exp->elts[pc + 2].opcode = OP_FUNCALL;
+  exp->elts[pc + 1].longconst = (LONGEST) nargs;
 
-  newexp->elts[pc + 3].opcode = newexp->elts[pc + 6].opcode = OP_VAR_VALUE;
-  newexp->elts[pc + 4].block = block;
-  newexp->elts[pc + 5].symbol = sym;
-
-  expp->reset (newexp);
+  exp->elts[pc + 3].opcode = exp->elts[pc + 6].opcode = OP_VAR_VALUE;
+  exp->elts[pc + 4].block = block;
+  exp->elts[pc + 5].symbol = sym;
 }
 
 /* Type-class predicates */