This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch ping] change lookup order of $localvars to happen before symbol tables


On Saturday 16 September 2006 00:02, Daniel Jacobowitz wrote:
> Sorry, I'm way behind on patches, and it seems others don't have
> much time for review either.

no problem ... i just wasnt sure if it was a "people are overloaded and havent 
gotten a chance to review" or "people have reviewed just havent posted an 
opinion one way or the other"

> Scanning the list of internal variables is linear.  Let's not be
> wasteful with it; please save the result the first time you do it.

indeed ... that would go from 3 internal linear searches to 2 as the final 
case would be calling internal_lookup() ...

if we break up the the lookup_internal() up completely, splitting the creation 
of the variable into say "create_internal()", we could kill off the last 
linear search

> Would you mind resubmitting with those changes?

sure, ive attached two versions ... the first is just the previous patch with 
your requested changes while the second is that plus breaking up the 
internal_lookup() function into lookup_only_internal() and 
create_internal() ... doesnt matter to me which of these patches are accepted 
as they both accomplish my original goal :)
-mike

Attachment: pgp00000.pgp
Description: PGP signature

2006-08-21  Mike Frysinger  <vapier@gentoo.org>

	* value.h (lookup_only_internalvar): New prototype.
	* value.c (lookup_only_internalvar): New function.
	(lookup_internalvar): Use lookup_only_internalvar.
	* parse.c (write_dollar_variable): Look up $ symbols in internal
	table first rather than last.

--- gdb/value.h
+++ gdb/value.h
@@ -419,6 +419,8 @@ extern void set_internalvar_component (s
 				       int bitpos, int bitsize,
 				       struct value *newvalue);
 
+extern struct internalvar *lookup_only_internalvar (char *name);
+
 extern struct internalvar *lookup_internalvar (char *name);
 
 extern int value_equal (struct value *arg1, struct value *arg2);
--- gdb/value.c
+++ gdb/value.c
@@ -741,10 +741,10 @@ init_if_undefined_command (char* args, i
    normally include a dollar sign.
 
    If the specified internal variable does not exist,
-   one is created, with a void value.  */
+   the return value is NULL.  */
 
 struct internalvar *
-lookup_internalvar (char *name)
+lookup_only_internalvar (char *name)
 {
   struct internalvar *var;
 
@@ -752,6 +752,25 @@ lookup_internalvar (char *name)
     if (strcmp (var->name, name) == 0)
       return var;
 
+  return NULL;
+}
+
+
+/* Look up an internal variable with name NAME.  NAME should not
+   normally include a dollar sign.
+
+   If the specified internal variable does not exist,
+   one is created, with a void value.  */
+
+struct internalvar *
+lookup_internalvar (char *name)
+{
+  struct internalvar *var;
+
+  var = lookup_only_internalvar (name);
+  if (var)
+    return var;
+
   var = (struct internalvar *) xmalloc (sizeof (struct internalvar));
   var->name = concat (name, (char *)NULL);
   var->value = allocate_value (builtin_type_void);
--- gdb/parse.c
+++ gdb/parse.c
@@ -448,6 +448,7 @@ write_dollar_variable (struct stoken str
 {
   struct symbol *sym = NULL;
   struct minimal_symbol *msym = NULL;
+  struct internalvar *isym = NULL;
 
   /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
      and $$digits (equivalent to $<-digits> if you could type that). */
@@ -486,6 +487,17 @@ write_dollar_variable (struct stoken str
   if (i >= 0)
     goto handle_register;
 
+  /* Any names starting with $ are probably debugger internal variables.  */
+
+  isym = lookup_only_internalvar (copy_name (str) + 1);
+  if (isym)
+    {
+      write_exp_elt_opcode (OP_INTERNALVAR);
+      write_exp_elt_intern (isym);
+      write_exp_elt_opcode (OP_INTERNALVAR);
+      return;
+    }
+
   /* On some systems, such as HP-UX and hppa-linux, certain system routines 
      have names beginning with $ or $$.  Check for those, first. */
 
@@ -508,7 +520,7 @@ write_dollar_variable (struct stoken str
       return;
     }
 
-  /* Any other names starting in $ are debugger internal variables.  */
+  /* Any other names are assumed to be debugger internal variables.  */
 
   write_exp_elt_opcode (OP_INTERNALVAR);
   write_exp_elt_intern (lookup_internalvar (copy_name (str) + 1));
2006-08-21  Mike Frysinger  <vapier@gentoo.org>

	* value.h (lookup_only_internalvar): New prototype.
	(create_internalvar): Likewise.
	* value.c (lookup_only_internalvar): New function.
	(create_internalvar): Likewise.
	(lookup_internalvar): Use new lookup_only_internalvar and
	create_internalvar functions.
	* parse.c (write_dollar_variable): Look up $ symbols in internal
	table first rather than last.

--- gdb/value.h
+++ gdb/value.h
@@ -419,6 +419,10 @@ extern void set_internalvar_component (s
 				       int bitpos, int bitsize,
 				       struct value *newvalue);
 
+extern struct internalvar *lookup_only_internalvar (char *name);
+
+extern struct internalvar *create_internalvar (char *name);
+
 extern struct internalvar *lookup_internalvar (char *name);
 
 extern int value_equal (struct value *arg1, struct value *arg2);
--- gdb/value.c
+++ gdb/value.c
@@ -741,10 +741,10 @@ init_if_undefined_command (char* args, i
    normally include a dollar sign.
 
    If the specified internal variable does not exist,
-   one is created, with a void value.  */
+   the return value is NULL.  */
 
 struct internalvar *
-lookup_internalvar (char *name)
+lookup_only_internalvar (char *name)
 {
   struct internalvar *var;
 
@@ -752,6 +752,17 @@ lookup_internalvar (char *name)
     if (strcmp (var->name, name) == 0)
       return var;
 
+  return NULL;
+}
+
+
+/* Create an internal variable with name NAME and with a void value.
+   NAME should not normally include a dollar sign.  */
+
+struct internalvar *
+create_internalvar (char *name)
+{
+  struct internalvar *var;
   var = (struct internalvar *) xmalloc (sizeof (struct internalvar));
   var->name = concat (name, (char *)NULL);
   var->value = allocate_value (builtin_type_void);
@@ -762,6 +773,25 @@ lookup_internalvar (char *name)
   return var;
 }
 
+
+/* Look up an internal variable with name NAME.  NAME should not
+   normally include a dollar sign.
+
+   If the specified internal variable does not exist,
+   one is created, with a void value.  */
+
+struct internalvar *
+lookup_internalvar (char *name)
+{
+  struct internalvar *var;
+
+  var = lookup_only_internalvar (name);
+  if (var)
+    return var;
+
+  return create_internalvar (name);
+}
+
 struct value *
 value_of_internalvar (struct internalvar *var)
 {
--- gdb/parse.c
+++ gdb/parse.c
@@ -448,6 +448,7 @@ write_dollar_variable (struct stoken str
 {
   struct symbol *sym = NULL;
   struct minimal_symbol *msym = NULL;
+  struct internalvar *isym = NULL;
 
   /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
      and $$digits (equivalent to $<-digits> if you could type that). */
@@ -486,6 +487,17 @@ write_dollar_variable (struct stoken str
   if (i >= 0)
     goto handle_register;
 
+  /* Any names starting with $ are probably debugger internal variables.  */
+
+  isym = lookup_only_internalvar (copy_name (str) + 1);
+  if (isym)
+    {
+      write_exp_elt_opcode (OP_INTERNALVAR);
+      write_exp_elt_intern (isym);
+      write_exp_elt_opcode (OP_INTERNALVAR);
+      return;
+    }
+
   /* On some systems, such as HP-UX and hppa-linux, certain system routines 
      have names beginning with $ or $$.  Check for those, first. */
 
@@ -508,10 +520,10 @@ write_dollar_variable (struct stoken str
       return;
     }
 
-  /* Any other names starting in $ are debugger internal variables.  */
+  /* Any other names are assumed to be debugger internal variables.  */
 
   write_exp_elt_opcode (OP_INTERNALVAR);
-  write_exp_elt_intern (lookup_internalvar (copy_name (str) + 1));
+  write_exp_elt_intern (create_internalvar (copy_name (str) + 1));
   write_exp_elt_opcode (OP_INTERNALVAR);
   return;
 handle_last:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]