Add PARSER_LEAVE_BLOCK_ALONE flag
authorTom Tromey <tromey@adacore.com>
Fri, 28 Apr 2023 14:38:38 +0000 (08:38 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 23 May 2023 19:57:54 +0000 (13:57 -0600)
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.

gdb/expression.h
gdb/parse.c

index c485b159ef8b26a53f98e33d0008c7be8c54b5b4..d1858776e8ef8b6ca1ec22289dee4f174bb30118 100644 (file)
@@ -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);
 
index bbe5cf12d370713507a5116b6c38bf05cbcf8ae9..221733a3f90cbff81734bb854b3b3719d4aa4269 100644 (file)
@@ -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;
+  if ((flags & PARSER_LEAVE_BLOCK_ALONE) == 0)
+    {
+      /* 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.  */
+      /* 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 (!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 (cursal.symtab)
+           expression_context_block
+             = cursal.symtab->compunit ()->blockvector ()->static_block ();
 
-      if (expression_context_block)
-       expression_context_pc = expression_context_block->entry_pc ();
+         if (expression_context_block)
+           expression_context_pc = expression_context_block->entry_pc ();
+       }
     }
 
   if (language_mode == language_mode_auto && block != NULL)