/* Parse expressions for GDB.
- Copyright (C) 1986-2017 Free Software Foundation, Inc.
+ Copyright (C) 1986-2018 Free Software Foundation, Inc.
Modified from expread.y by the Department of Computer Science at the
State University of New York at Buffalo, 1991.
/* Global variables declared in parser-defs.h (and commented there). */
const struct block *expression_context_block;
CORE_ADDR expression_context_pc;
-const struct block *innermost_block;
+innermost_block_tracker innermost_block;
int arglist_len;
static struct type_stack type_stack;
const char *lexptr;
static enum type_code expout_tag_completion_type = TYPE_CODE_UNDEF;
/* The token for tagged type name completion. */
-static char *expout_completion_name;
+static gdb::unique_xmalloc_ptr<char> expout_completion_name;
\f
static unsigned int expressiondebug = 0;
const struct block *, int,
int, int *);
+/* Documented at it's declaration. */
+
+void
+innermost_block_tracker::update (const struct block *b,
+ innermost_block_tracker_types t)
+{
+ if ((m_types & t) != 0
+ && (m_innermost_block == NULL
+ || contained_in (b, m_innermost_block)))
+ m_innermost_block = b;
+}
+
/* Data structure for saving values of arglist_len for function calls whose
arguments contain other function calls. */
|| tag == TYPE_CODE_STRUCT
|| tag == TYPE_CODE_ENUM);
expout_tag_completion_type = tag;
- expout_completion_name = (char *) xmalloc (length + 1);
- memcpy (expout_completion_name, ptr, length);
- expout_completion_name[length] = '\0';
+ expout_completion_name.reset (xstrndup (ptr, length));
}
\f
str.ptr++;
write_exp_string (ps, str);
write_exp_elt_opcode (ps, OP_REGISTER);
+ innermost_block.update (expression_context_block,
+ INNERMOST_BLOCK_FOR_REGISTERS);
return;
}
type_stack.depth = 0;
expout_last_struct = -1;
expout_tag_completion_type = TYPE_CODE_UNDEF;
- xfree (expout_completion_name);
- expout_completion_name = NULL;
+ expout_completion_name.reset ();
comma_terminates = comma;
reference; furthermore, if the parsing ends in the field name,
return the field name in *NAME. If the parsing ends in the middle
of a field reference, but the reference is somehow invalid, throw
- an exception. In all other cases, return NULL. Returned non-NULL
- *NAME must be freed by the caller. */
+ an exception. In all other cases, return NULL. */
struct type *
-parse_expression_for_completion (const char *string, char **name,
+parse_expression_for_completion (const char *string,
+ gdb::unique_xmalloc_ptr<char> *name,
enum type_code *code)
{
expression_up exp;
if (expout_tag_completion_type != TYPE_CODE_UNDEF)
{
*code = expout_tag_completion_type;
- *name = expout_completion_name;
- expout_completion_name = NULL;
+ *name = std::move (expout_completion_name);
return NULL;
}
if (expout_last_struct == -1)
return NULL;
- *name = extract_field_op (exp.get (), &subexp);
- if (!*name)
- return NULL;
+ const char *fieldname = extract_field_op (exp.get (), &subexp);
+ if (fieldname == NULL)
+ {
+ name->reset ();
+ return NULL;
+ }
+ name->reset (xstrdup (fieldname));
/* This might throw an exception. If so, we want to let it
propagate. */
val = evaluate_subexpression_type (exp.get (), subexp);
- /* (*NAME) is a part of the EXP memory block freed below. */
- *name = xstrdup (*name);
return value_type (val);
}