public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] gdb/objc: make objc_demangle a member function of objc_language
@ 2021-03-16 19:02 Andrew Burgess
  2021-03-16 22:47 ` Lancelot SIX
  2021-03-19 17:57 ` Tom Tromey
  0 siblings, 2 replies; 4+ messages in thread
From: Andrew Burgess @ 2021-03-16 19:02 UTC (permalink / raw)
  To: gdb-patches

Makes the objc_demangle helper function a member function of
objc_language (by renaming it to be the demangle_symbol member
function).

I also fixed some of the obvious coding standard violations in
obj_demangle, so the '&&' operators are now at the start of the line,
not the end.  Comparison to nullptr are now made explicit, as are
comparisons to the null character.

There should be no user visible changes after this commit.

gdb/ChangeLog:

	* objc-lang.c (objc_demangle): Renamed to
	objc_language::demangle_symbol, and moved later in the file.
	(objc_language::sniff_from_mangled_name): Call demangle_symbol
	member function.
	(objc_language::demangle_symbol): Defined outside of class
	declaration.  The definition is the old objc_demangle with NULL
	changed to nullptr, and if conditions relating to nullptr pointers
	or null character checks made explicit.
	* objc-lang.h (objc_demangle): Delete declaration.
---
 gdb/ChangeLog   |  12 +++++
 gdb/objc-lang.c | 139 +++++++++++++++++++++++-------------------------
 gdb/objc-lang.h |   2 -
 3 files changed, 80 insertions(+), 73 deletions(-)

diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index 8e8cc053531..7e53124e4be 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -216,72 +216,6 @@ value_nsstring (struct gdbarch *gdbarch, const char *ptr, int len)
   return nsstringValue;
 }
 
-/* Objective-C name demangling.  */
-
-char *
-objc_demangle (const char *mangled, int options)
-{
-  char *demangled, *cp;
-
-  if (mangled[0] == '_' &&
-     (mangled[1] == 'i' || mangled[1] == 'c') &&
-      mangled[2] == '_')
-    {
-      cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
-
-      if (mangled[1] == 'i')
-	*cp++ = '-';		/* for instance method */
-      else
-	*cp++ = '+';		/* for class    method */
-
-      *cp++ = '[';		/* opening left brace  */
-      strcpy(cp, mangled+3);	/* Tack on the rest of the mangled name.  */
-
-      while (*cp && *cp == '_')
-	cp++;			/* Skip any initial underbars in class
-				   name.  */
-
-      cp = strchr(cp, '_');
-      if (!cp)	                /* Find first non-initial underbar.  */
-	{
-	  xfree(demangled);	/* not mangled name */
-	  return NULL;
-	}
-      if (cp[1] == '_')		/* Easy case: no category name.    */
-	{
-	  *cp++ = ' ';		/* Replace two '_' with one ' '.   */
-	  strcpy(cp, mangled + (cp - demangled) + 2);
-	}
-      else
-	{
-	  *cp++ = '(';		/* Less easy case: category name.  */
-	  cp = strchr(cp, '_');
-	  if (!cp)
-	    {
-	      xfree(demangled);	/* not mangled name */
-	      return NULL;
-	    }
-	  *cp++ = ')';
-	  *cp++ = ' ';		/* Overwriting 1st char of method name...  */
-	  strcpy(cp, mangled + (cp - demangled));	/* Get it back.  */
-	}
-
-      while (*cp && *cp == '_')
-	cp++;			/* Skip any initial underbars in
-				   method name.  */
-
-      for (; *cp; cp++)
-	if (*cp == '_')
-	  *cp = ':';		/* Replace remaining '_' with ':'.  */
-
-      *cp++ = ']';		/* closing right brace */
-      *cp++ = 0;		/* string terminator */
-      return demangled;
-    }
-  else
-    return NULL;	/* Not an objc mangled name.  */
-}
-
 /* Class representing the Objective-C language.  */
 
 class objc_language : public language_defn
@@ -320,16 +254,13 @@ class objc_language : public language_defn
   bool sniff_from_mangled_name (const char *mangled,
 				char **demangled) const override
   {
-    *demangled = objc_demangle (mangled, 0);
+    *demangled = demangle_symbol (mangled, 0);
     return *demangled != NULL;
   }
 
   /* See language.h.  */
 
-  char *demangle_symbol (const char *mangled, int options) const override
-  {
-    return objc_demangle (mangled, options);
-  }
+  char *demangle_symbol (const char *mangled, int options) const override;
 
   /* See language.h.  */
 
@@ -385,6 +316,72 @@ class objc_language : public language_defn
   { return macro_expansion_c; }
 };
 
+/* See declaration of objc_language::demangle_symbol above.  */
+
+char *
+objc_language::demangle_symbol (const char *mangled, int options) const
+{
+  char *demangled, *cp;
+
+  if (mangled[0] == '_'
+      && (mangled[1] == 'i' || mangled[1] == 'c')
+      && mangled[2] == '_')
+    {
+      cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
+
+      if (mangled[1] == 'i')
+	*cp++ = '-';		/* for instance method */
+      else
+	*cp++ = '+';		/* for class    method */
+
+      *cp++ = '[';		/* opening left brace  */
+      strcpy(cp, mangled+3);	/* Tack on the rest of the mangled name.  */
+
+      while (*cp && *cp == '_')
+	cp++;			/* Skip any initial underbars in class
+				   name.  */
+
+      cp = strchr(cp, '_');
+      if (cp == nullptr)	/* Find first non-initial underbar.  */
+	{
+	  xfree(demangled);	/* not mangled name */
+	  return nullptr;
+	}
+      if (cp[1] == '_')		/* Easy case: no category name.    */
+	{
+	  *cp++ = ' ';		/* Replace two '_' with one ' '.   */
+	  strcpy(cp, mangled + (cp - demangled) + 2);
+	}
+      else
+	{
+	  *cp++ = '(';		/* Less easy case: category name.  */
+	  cp = strchr(cp, '_');
+	  if (cp == nullptr)
+	    {
+	      xfree(demangled);	/* not mangled name */
+	      return nullptr;
+	    }
+	  *cp++ = ')';
+	  *cp++ = ' ';		/* Overwriting 1st char of method name...  */
+	  strcpy(cp, mangled + (cp - demangled));	/* Get it back.  */
+	}
+
+      while (*cp != '\0' && *cp == '_')
+	cp++;			/* Skip any initial underbars in
+				   method name.  */
+
+      for (; *cp != '\0'; cp++)
+	if (*cp == '_')
+	  *cp = ':';		/* Replace remaining '_' with ':'.  */
+
+      *cp++ = ']';		/* closing right brace */
+      *cp++ = 0;		/* string terminator */
+      return demangled;
+    }
+  else
+    return nullptr;	/* Not an objc mangled name.  */
+}
+
 /* Single instance of the class representing the Objective-C language.  */
 
 static objc_language objc_language_defn;
diff --git a/gdb/objc-lang.h b/gdb/objc-lang.h
index f58335e62cd..9d3e26d18a0 100644
--- a/gdb/objc-lang.h
+++ b/gdb/objc-lang.h
@@ -31,8 +31,6 @@ extern CORE_ADDR lookup_objc_class     (struct gdbarch *gdbarch,
 extern CORE_ADDR lookup_child_selector (struct gdbarch *gdbarch,
 					const char *methodname);
 
-extern char *objc_demangle (const char *mangled, int options);
-
 extern int find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc);
 
 extern const char *find_imps (const char *method,
-- 
2.25.4


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] gdb/objc: make objc_demangle a member function of objc_language
  2021-03-16 19:02 [PATCH] gdb/objc: make objc_demangle a member function of objc_language Andrew Burgess
@ 2021-03-16 22:47 ` Lancelot SIX
  2021-03-22 11:36   ` Andrew Burgess
  2021-03-19 17:57 ` Tom Tromey
  1 sibling, 1 reply; 4+ messages in thread
From: Lancelot SIX @ 2021-03-16 22:47 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: gdb-patches

Le Tue, Mar 16, 2021 at 07:02:04PM +0000, Andrew Burgess a écrit :
> Makes the objc_demangle helper function a member function of
> objc_language (by renaming it to be the demangle_symbol member
> function).
> 
> I also fixed some of the obvious coding standard violations in
> obj_demangle, so the '&&' operators are now at the start of the line,
> not the end.  Comparison to nullptr are now made explicit, as are
> comparisons to the null character.
> 
> There should be no user visible changes after this commit.
> 
> gdb/ChangeLog:
> 
> 	* objc-lang.c (objc_demangle): Renamed to
> 	objc_language::demangle_symbol, and moved later in the file.
> 	(objc_language::sniff_from_mangled_name): Call demangle_symbol
> 	member function.
> 	(objc_language::demangle_symbol): Defined outside of class
> 	declaration.  The definition is the old objc_demangle with NULL
> 	changed to nullptr, and if conditions relating to nullptr pointers
> 	or null character checks made explicit.
> 	* objc-lang.h (objc_demangle): Delete declaration.
> ---
>  gdb/ChangeLog   |  12 +++++
>  gdb/objc-lang.c | 139 +++++++++++++++++++++++-------------------------
>  gdb/objc-lang.h |   2 -
>  3 files changed, 80 insertions(+), 73 deletions(-)
> 
> diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
> index 8e8cc053531..7e53124e4be 100644
> --- a/gdb/objc-lang.c
> +++ b/gdb/objc-lang.c
> @@ -216,72 +216,6 @@ value_nsstring (struct gdbarch *gdbarch, const char *ptr, int len)
>    return nsstringValue;
>  }
>  
> -/* Objective-C name demangling.  */
> -
> -char *
> -objc_demangle (const char *mangled, int options)
> -{
> -  char *demangled, *cp;
> -
> -  if (mangled[0] == '_' &&
> -     (mangled[1] == 'i' || mangled[1] == 'c') &&
> -      mangled[2] == '_')
> -    {
> -      cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
> -
> -      if (mangled[1] == 'i')
> -	*cp++ = '-';		/* for instance method */
> -      else
> -	*cp++ = '+';		/* for class    method */
> -
> -      *cp++ = '[';		/* opening left brace  */
> -      strcpy(cp, mangled+3);	/* Tack on the rest of the mangled name.  */
> -
> -      while (*cp && *cp == '_')
> -	cp++;			/* Skip any initial underbars in class
> -				   name.  */
> -
> -      cp = strchr(cp, '_');
> -      if (!cp)	                /* Find first non-initial underbar.  */
> -	{
> -	  xfree(demangled);	/* not mangled name */
> -	  return NULL;
> -	}
> -      if (cp[1] == '_')		/* Easy case: no category name.    */
> -	{
> -	  *cp++ = ' ';		/* Replace two '_' with one ' '.   */
> -	  strcpy(cp, mangled + (cp - demangled) + 2);
> -	}
> -      else
> -	{
> -	  *cp++ = '(';		/* Less easy case: category name.  */
> -	  cp = strchr(cp, '_');
> -	  if (!cp)
> -	    {
> -	      xfree(demangled);	/* not mangled name */
> -	      return NULL;
> -	    }
> -	  *cp++ = ')';
> -	  *cp++ = ' ';		/* Overwriting 1st char of method name...  */
> -	  strcpy(cp, mangled + (cp - demangled));	/* Get it back.  */
> -	}
> -
> -      while (*cp && *cp == '_')
> -	cp++;			/* Skip any initial underbars in
> -				   method name.  */
> -
> -      for (; *cp; cp++)
> -	if (*cp == '_')
> -	  *cp = ':';		/* Replace remaining '_' with ':'.  */
> -
> -      *cp++ = ']';		/* closing right brace */
> -      *cp++ = 0;		/* string terminator */
> -      return demangled;
> -    }
> -  else
> -    return NULL;	/* Not an objc mangled name.  */
> -}
> -
>  /* Class representing the Objective-C language.  */
>  
>  class objc_language : public language_defn
> @@ -320,16 +254,13 @@ class objc_language : public language_defn
>    bool sniff_from_mangled_name (const char *mangled,
>  				char **demangled) const override
>    {
> -    *demangled = objc_demangle (mangled, 0);
> +    *demangled = demangle_symbol (mangled, 0);
>      return *demangled != NULL;
>    }
>  
>    /* See language.h.  */
>  
> -  char *demangle_symbol (const char *mangled, int options) const override
> -  {
> -    return objc_demangle (mangled, options);
> -  }
> +  char *demangle_symbol (const char *mangled, int options) const override;
>  
>    /* See language.h.  */
>  
> @@ -385,6 +316,72 @@ class objc_language : public language_defn
>    { return macro_expansion_c; }
>  };
>  
> +/* See declaration of objc_language::demangle_symbol above.  */
> +
> +char *
> +objc_language::demangle_symbol (const char *mangled, int options) const
> +{
> +  char *demangled, *cp;
> +
> +  if (mangled[0] == '_'
> +      && (mangled[1] == 'i' || mangled[1] == 'c')
> +      && mangled[2] == '_')
> +    {
> +      cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
> +
> +      if (mangled[1] == 'i')
> +	*cp++ = '-';		/* for instance method */
> +      else
> +	*cp++ = '+';		/* for class    method */
> +
> +      *cp++ = '[';		/* opening left brace  */
> +      strcpy(cp, mangled+3);	/* Tack on the rest of the mangled name.  */
> +
> +      while (*cp && *cp == '_')

Hi,

You forgot one explicit comparison to null char here.

Lancelot.

> +	cp++;			/* Skip any initial underbars in class
> +				   name.  */
> +
> +      cp = strchr(cp, '_');
> +      if (cp == nullptr)	/* Find first non-initial underbar.  */
> +	{
> +	  xfree(demangled);	/* not mangled name */
> +	  return nullptr;
> +	}
> +      if (cp[1] == '_')		/* Easy case: no category name.    */
> +	{
> +	  *cp++ = ' ';		/* Replace two '_' with one ' '.   */
> +	  strcpy(cp, mangled + (cp - demangled) + 2);
> +	}
> +      else
> +	{
> +	  *cp++ = '(';		/* Less easy case: category name.  */
> +	  cp = strchr(cp, '_');
> +	  if (cp == nullptr)
> +	    {
> +	      xfree(demangled);	/* not mangled name */
> +	      return nullptr;
> +	    }
> +	  *cp++ = ')';
> +	  *cp++ = ' ';		/* Overwriting 1st char of method name...  */
> +	  strcpy(cp, mangled + (cp - demangled));	/* Get it back.  */
> +	}
> +
> +      while (*cp != '\0' && *cp == '_')
> +	cp++;			/* Skip any initial underbars in
> +				   method name.  */
> +
> +      for (; *cp != '\0'; cp++)
> +	if (*cp == '_')
> +	  *cp = ':';		/* Replace remaining '_' with ':'.  */
> +
> +      *cp++ = ']';		/* closing right brace */
> +      *cp++ = 0;		/* string terminator */
> +      return demangled;
> +    }
> +  else
> +    return nullptr;	/* Not an objc mangled name.  */
> +}
> +
>  /* Single instance of the class representing the Objective-C language.  */
>  
>  static objc_language objc_language_defn;
> diff --git a/gdb/objc-lang.h b/gdb/objc-lang.h
> index f58335e62cd..9d3e26d18a0 100644
> --- a/gdb/objc-lang.h
> +++ b/gdb/objc-lang.h
> @@ -31,8 +31,6 @@ extern CORE_ADDR lookup_objc_class     (struct gdbarch *gdbarch,
>  extern CORE_ADDR lookup_child_selector (struct gdbarch *gdbarch,
>  					const char *methodname);
>  
> -extern char *objc_demangle (const char *mangled, int options);
> -
>  extern int find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc);
>  
>  extern const char *find_imps (const char *method,
> -- 
> 2.25.4
> 

-- 
Lancelot SIX

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] gdb/objc: make objc_demangle a member function of objc_language
  2021-03-16 19:02 [PATCH] gdb/objc: make objc_demangle a member function of objc_language Andrew Burgess
  2021-03-16 22:47 ` Lancelot SIX
@ 2021-03-19 17:57 ` Tom Tromey
  1 sibling, 0 replies; 4+ messages in thread
From: Tom Tromey @ 2021-03-19 17:57 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: gdb-patches

>>>>> "Andrew" == Andrew Burgess <andrew.burgess@embecosm.com> writes:

Andrew> Makes the objc_demangle helper function a member function of
Andrew> objc_language (by renaming it to be the demangle_symbol member
Andrew> function).

Andrew> I also fixed some of the obvious coding standard violations in
Andrew> obj_demangle, so the '&&' operators are now at the start of the line,
Andrew> not the end.  Comparison to nullptr are now made explicit, as are
Andrew> comparisons to the null character.

Andrew> There should be no user visible changes after this commit.

It looks reasonable to me.

I think Objective C testing hasn't really worked for me for a while.
Most of the real tests fail due to compilation errors.

Tom

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] gdb/objc: make objc_demangle a member function of objc_language
  2021-03-16 22:47 ` Lancelot SIX
@ 2021-03-22 11:36   ` Andrew Burgess
  0 siblings, 0 replies; 4+ messages in thread
From: Andrew Burgess @ 2021-03-22 11:36 UTC (permalink / raw)
  To: Lancelot SIX; +Cc: gdb-patches

* Lancelot SIX <lsix@lancelotsix.com> [2021-03-16 22:47:03 +0000]:

> Le Tue, Mar 16, 2021 at 07:02:04PM +0000, Andrew Burgess a écrit :
> > Makes the objc_demangle helper function a member function of
> > objc_language (by renaming it to be the demangle_symbol member
> > function).
> > 
> > I also fixed some of the obvious coding standard violations in
> > obj_demangle, so the '&&' operators are now at the start of the line,
> > not the end.  Comparison to nullptr are now made explicit, as are
> > comparisons to the null character.
> > 
> > There should be no user visible changes after this commit.
> > 
> > gdb/ChangeLog:
> > 
> > 	* objc-lang.c (objc_demangle): Renamed to
> > 	objc_language::demangle_symbol, and moved later in the file.
> > 	(objc_language::sniff_from_mangled_name): Call demangle_symbol
> > 	member function.
> > 	(objc_language::demangle_symbol): Defined outside of class
> > 	declaration.  The definition is the old objc_demangle with NULL
> > 	changed to nullptr, and if conditions relating to nullptr pointers
> > 	or null character checks made explicit.
> > 	* objc-lang.h (objc_demangle): Delete declaration.
> > ---
> >  gdb/ChangeLog   |  12 +++++
> >  gdb/objc-lang.c | 139 +++++++++++++++++++++++-------------------------
> >  gdb/objc-lang.h |   2 -
> >  3 files changed, 80 insertions(+), 73 deletions(-)
> > 
> > diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
> > index 8e8cc053531..7e53124e4be 100644
> > --- a/gdb/objc-lang.c
> > +++ b/gdb/objc-lang.c
> > @@ -216,72 +216,6 @@ value_nsstring (struct gdbarch *gdbarch, const char *ptr, int len)
> >    return nsstringValue;
> >  }
> >  
> > -/* Objective-C name demangling.  */
> > -
> > -char *
> > -objc_demangle (const char *mangled, int options)
> > -{
> > -  char *demangled, *cp;
> > -
> > -  if (mangled[0] == '_' &&
> > -     (mangled[1] == 'i' || mangled[1] == 'c') &&
> > -      mangled[2] == '_')
> > -    {
> > -      cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
> > -
> > -      if (mangled[1] == 'i')
> > -	*cp++ = '-';		/* for instance method */
> > -      else
> > -	*cp++ = '+';		/* for class    method */
> > -
> > -      *cp++ = '[';		/* opening left brace  */
> > -      strcpy(cp, mangled+3);	/* Tack on the rest of the mangled name.  */
> > -
> > -      while (*cp && *cp == '_')
> > -	cp++;			/* Skip any initial underbars in class
> > -				   name.  */
> > -
> > -      cp = strchr(cp, '_');
> > -      if (!cp)	                /* Find first non-initial underbar.  */
> > -	{
> > -	  xfree(demangled);	/* not mangled name */
> > -	  return NULL;
> > -	}
> > -      if (cp[1] == '_')		/* Easy case: no category name.    */
> > -	{
> > -	  *cp++ = ' ';		/* Replace two '_' with one ' '.   */
> > -	  strcpy(cp, mangled + (cp - demangled) + 2);
> > -	}
> > -      else
> > -	{
> > -	  *cp++ = '(';		/* Less easy case: category name.  */
> > -	  cp = strchr(cp, '_');
> > -	  if (!cp)
> > -	    {
> > -	      xfree(demangled);	/* not mangled name */
> > -	      return NULL;
> > -	    }
> > -	  *cp++ = ')';
> > -	  *cp++ = ' ';		/* Overwriting 1st char of method name...  */
> > -	  strcpy(cp, mangled + (cp - demangled));	/* Get it back.  */
> > -	}
> > -
> > -      while (*cp && *cp == '_')
> > -	cp++;			/* Skip any initial underbars in
> > -				   method name.  */
> > -
> > -      for (; *cp; cp++)
> > -	if (*cp == '_')
> > -	  *cp = ':';		/* Replace remaining '_' with ':'.  */
> > -
> > -      *cp++ = ']';		/* closing right brace */
> > -      *cp++ = 0;		/* string terminator */
> > -      return demangled;
> > -    }
> > -  else
> > -    return NULL;	/* Not an objc mangled name.  */
> > -}
> > -
> >  /* Class representing the Objective-C language.  */
> >  
> >  class objc_language : public language_defn
> > @@ -320,16 +254,13 @@ class objc_language : public language_defn
> >    bool sniff_from_mangled_name (const char *mangled,
> >  				char **demangled) const override
> >    {
> > -    *demangled = objc_demangle (mangled, 0);
> > +    *demangled = demangle_symbol (mangled, 0);
> >      return *demangled != NULL;
> >    }
> >  
> >    /* See language.h.  */
> >  
> > -  char *demangle_symbol (const char *mangled, int options) const override
> > -  {
> > -    return objc_demangle (mangled, options);
> > -  }
> > +  char *demangle_symbol (const char *mangled, int options) const override;
> >  
> >    /* See language.h.  */
> >  
> > @@ -385,6 +316,72 @@ class objc_language : public language_defn
> >    { return macro_expansion_c; }
> >  };
> >  
> > +/* See declaration of objc_language::demangle_symbol above.  */
> > +
> > +char *
> > +objc_language::demangle_symbol (const char *mangled, int options) const
> > +{
> > +  char *demangled, *cp;
> > +
> > +  if (mangled[0] == '_'
> > +      && (mangled[1] == 'i' || mangled[1] == 'c')
> > +      && mangled[2] == '_')
> > +    {
> > +      cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
> > +
> > +      if (mangled[1] == 'i')
> > +	*cp++ = '-';		/* for instance method */
> > +      else
> > +	*cp++ = '+';		/* for class    method */
> > +
> > +      *cp++ = '[';		/* opening left brace  */
> > +      strcpy(cp, mangled+3);	/* Tack on the rest of the mangled name.  */
> > +
> > +      while (*cp && *cp == '_')
> 
> Hi,
> 
> You forgot one explicit comparison to null char here.

Thanks,

I included this fix in the version I pushed.

Andrew

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-03-22 11:36 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-16 19:02 [PATCH] gdb/objc: make objc_demangle a member function of objc_language Andrew Burgess
2021-03-16 22:47 ` Lancelot SIX
2021-03-22 11:36   ` Andrew Burgess
2021-03-19 17:57 ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).