Add PARSER_LEAVE_BLOCK_ALONE flag
This adds a PARSER_LEAVE_BLOCK_ALONE flag, and changes the parse API to respect it. This flag lets callers avoid any change to the passed-in block and expression PC, letting them specify the context exactly. In particular, now nullptr can be used to indicate that the parse should not examine any local variables.
This commit is contained in:
parent
e360af5af8
commit
87b647cfb1
2 changed files with 28 additions and 17 deletions
|
@ -301,6 +301,12 @@ enum parser_flag
|
|||
it parses. For yacc-based parsers, this translates to setting
|
||||
yydebug. */
|
||||
PARSER_DEBUG = (1 << 2),
|
||||
|
||||
/* Normally the expression-parsing functions like parse_exp_1 will
|
||||
attempt to find a context block if one is not passed in. If set,
|
||||
this flag suppresses this search and uses a null context for the
|
||||
parse. */
|
||||
PARSER_LEAVE_BLOCK_ALONE = (1 << 3),
|
||||
};
|
||||
DEF_ENUM_FLAGS_TYPE (enum parser_flag, parser_flags);
|
||||
|
||||
|
|
39
gdb/parse.c
39
gdb/parse.c
|
@ -344,26 +344,31 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
|
|||
if (tracker == nullptr)
|
||||
tracker = &local_tracker;
|
||||
|
||||
/* If no context specified, try using the current frame, if any. */
|
||||
if (!expression_context_block)
|
||||
expression_context_block = get_selected_block (&expression_context_pc);
|
||||
else if (pc == 0)
|
||||
expression_context_pc = expression_context_block->entry_pc ();
|
||||
else
|
||||
expression_context_pc = pc;
|
||||
|
||||
/* Fall back to using the current source static context, if any. */
|
||||
|
||||
if (!expression_context_block)
|
||||
if ((flags & PARSER_LEAVE_BLOCK_ALONE) == 0)
|
||||
{
|
||||
struct symtab_and_line cursal = get_current_source_symtab_and_line ();
|
||||
|
||||
if (cursal.symtab)
|
||||
/* If no context specified, try using the current frame, if any. */
|
||||
if (!expression_context_block)
|
||||
expression_context_block
|
||||
= cursal.symtab->compunit ()->blockvector ()->static_block ();
|
||||
|
||||
if (expression_context_block)
|
||||
= get_selected_block (&expression_context_pc);
|
||||
else if (pc == 0)
|
||||
expression_context_pc = expression_context_block->entry_pc ();
|
||||
else
|
||||
expression_context_pc = pc;
|
||||
|
||||
/* Fall back to using the current source static context, if any. */
|
||||
|
||||
if (!expression_context_block)
|
||||
{
|
||||
struct symtab_and_line cursal
|
||||
= get_current_source_symtab_and_line ();
|
||||
|
||||
if (cursal.symtab)
|
||||
expression_context_block
|
||||
= cursal.symtab->compunit ()->blockvector ()->static_block ();
|
||||
|
||||
if (expression_context_block)
|
||||
expression_context_pc = expression_context_block->entry_pc ();
|
||||
}
|
||||
}
|
||||
|
||||
if (language_mode == language_mode_auto && block != NULL)
|
||||
|
|
Loading…
Add table
Reference in a new issue